... | ... |
@@ -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); |