Browse code

implement unsaved_loadappend 'M' and unsaved_add

Dario Rodriguez authored on 19/03/2019 22:07:56
Showing 2 changed files
... ...
@@ -561,7 +561,7 @@ redata_unsaved_loadappend(redata_t *redata)
561 561
         long nread,lim;
562 562
         char *ptr,*endptr,*aux,*bufptr;
563 563
         char actioncode;
564
-        long pos;
564
+        long pos,pos2;
565 565
         char endcode;
566 566
         int flag_multipart;
567 567
         if((fd=redata_unsaved_check_gen(redata,redata->filename))==-1)
... ...
@@ -631,7 +631,31 @@ redata_unsaved_loadappend(redata_t *redata)
631 631
                                 redata_op_del(redata,pos,aux-bufptr,NULL);
632 632
                         } while(flag_multipart);
633 633
                 } else if(actioncode=='M') {
634
-#warning TODO
634
+                        ptr=ptr_getlong(ptr,endptr,&pos);
635
+                        ptr+=(ptr!=NULL && ptr<endptr)?1:0;
636
+                        ptr=ptr_getlong(ptr,endptr,&pos2);
637
+                        do {
638
+                                flag_multipart=0;
639
+                                ptr=ptr_getchar(ptr,endptr,&endcode);
640
+                                if(ptr!=NULL && endcode=='+') {
641
+                                        flag_multipart=1;
642
+                                        ptr=ptr_getchar(ptr,endptr,&endcode);
643
+                                }
644
+                                bufptr=ptr;
645
+                                ptr=ptr_searchendchar(ptr,endptr,endcode,&aux);
646
+                                if(ptr==NULL
647
+                                  || pos<0 || (pos+(aux-bufptr))>redata_getused(redata)
648
+                                  || pos2<0 || pos2>redata_getused(redata)
649
+                                  || ((aux-bufptr)>0 && pos2>=pos && pos2<(pos+(aux-bufptr)))
650
+                                  ) {
651
+                                        return(-1); /* malformed register */
652
+                                }
653
+                                if(redata_data_compare(redata,pos,bufptr,aux-bufptr)!=0)
654
+                                        return(-1); /* corrupted data */
655
+                                redata_op_move(redata,pos,(aux-bufptr),pos2,NULL);
656
+                                pos=(pos<pos2)?pos:(pos+(aux-bufptr));
657
+                                pos2=pos2+(aux-bufptr);
658
+                        } while(flag_multipart);
635 659
                 } else {
636 660
                         return(-1); /* corrupted undobuf */
637 661
                 }
... ...
@@ -641,17 +665,77 @@ redata_unsaved_loadappend(redata_t *redata)
641 665
 
642 666
 
643 667
 int
644
-redata_unsaved_add(redata_t *redata, undo_t *undo)
668
+redata_unsaved_add(redata_t *redata, undostack_t *stack, int undono)
645 669
 {
646
-
647
-        /* separator is '$' , '@'  or '%' (whatever makes the longest string) */
648
-        /* if len is omitted, then it goes inmediatly after the last op (probably there separator character was used in the string) */
649
-#warning TODO
670
+        char sep;
671
+        undo_t *undo;
672
+        char *sepend,*ptr,*endptr;
673
+        char *buf;
674
+        int k;
675
+        int maxsize,newsize;
676
+        char posbuf[128];
677
+        if(redata==NULL
678
+          || (stack!=&(redata->undostack) && stack!=&(redata->redostack))
679
+          || undono<0 || undono>=stack->usedundo)
680
+                return(-1); /* sanity check failed */
681
+        /* syntax (see loadappend): A<pos><+?><sep><text><sep>[<+?><sep><text><sep>[...]] */
682
+        undo=stack->undo+undono;
683
+        if(undo->type!='A' && undo->type!='D' && undo->type!='M')
684
+                return(-1); /* unrecognized undo type */
685
+        for(k=0,maxsize=0,buf=NULL;k<2;k++,maxsize=0) {
686
+                ptr=stack->buf+undo->off;
687
+                endptr=ptr+undo->len;
688
+                if(k!=0)
689
+                        buf[maxsize]=undo->type;
690
+                maxsize++;
691
+                snprintf(posbuf,sizeof(posbuf),"%li",undo->posorig);
692
+                posbuf[sizeof(posbuf)-1]='\0';
693
+                if(k!=0)
694
+                        strcpy(buf+maxsize,posbuf);
695
+                maxsize+=strlen(posbuf);
696
+                if(undo->type=='M') {
697
+                        snprintf(posbuf,sizeof(posbuf),",%li",undo->posdest);
698
+                        posbuf[sizeof(posbuf)-1]='\0';
699
+                        if(k!=0)
700
+                                strcpy(buf+maxsize,posbuf);
701
+                        maxsize+=strlen(posbuf);
702
+                }
703
+                while(ptr<endptr) {
704
+                        sep=sep_select(ptr,endptr-ptr,&sepend);
705
+                        if(sepend!=endptr) {
706
+                                if(k!=0)
707
+                                        buf[maxsize]='+';
708
+                                maxsize++;
709
+                        }
710
+                        if(k!=0)
711
+                                buf[maxsize]=sep;
712
+                        maxsize++;
713
+                        if(k!=0)
714
+                                memcpy(buf+maxsize,ptr,sepend-ptr);
715
+                        maxsize+=sepend-ptr;
716
+                        if(k!=0)
717
+                                buf[maxsize]=sep;
718
+                        maxsize++;
719
+                        ptr=sepend;
720
+                }
721
+                if(k==0) {
722
+                        /* get mem */
723
+                        if((redata->unsaved.sizebuf-redata->unsaved.sizebuf)<maxsize) {
724
+                                newsize=(redata->unsaved.sizebuf+maxsize+UNDOGROWSIZE-1)/UNDOGROWSIZE;
725
+                                newsize*=UNDOGROWSIZE;
726
+                                if((buf=realloc(redata->unsaved.buf,newsize))==NULL)
727
+                                        return(-1); /* insuf. mem. */
728
+                                redata->unsaved.buf=buf;
729
+                                redata->unsaved.sizebuf=newsize;
730
+                        }
731
+                        buf=redata->unsaved.buf+redata->unsaved.usedbuf;
732
+                }
733
+        }
650 734
         return(-1);
651 735
 }
652 736
 
653 737
 int
654
-redata_unsaved_unadd(redata_t *redata, undo_t *undo)
738
+redata_unsaved_unadd(redata_t *redata, undostack_t *stack, int undono)
655 739
 {
656 740
 #warning TODO
657 741
         return(-1);
... ...
@@ -106,8 +106,8 @@ int redata_unsaved_check(redata_t *redata, char *filename);
106 106
 int redata_unsaved_loadappend(redata_t *redata);
107 107
 int redata_unsaved_unlink(redata_t *redata);
108 108
 int redata_unsaved_trunc(redata_t *redata);
109
-int redata_unsaved_add(redata_t *redata, undo_t *undo);
110
-int redata_unsaved_unadd(redata_t *redata, undo_t *undo);
109
+int redata_unsaved_add(redata_t *redata, undostack_t *stack, int undono);
110
+int redata_unsaved_unadd(redata_t *redata, undostack_t *stack, int undono);
111 111
 int redata_unsaved_commit(redata_t *redata);
112 112
 
113 113
 int redata_load(redata_t *redata, char *filename, int use_unsaved);