hschumann2/TempleOS-Source-Code
0847
1 2#help_index "DolDoc/Clip"3 4sys_clip_doc=DocNew;5 6public U0 ClipDel()7{//Delete everything on clip.8 DocRst(sys_clip_doc,TRUE);9}10 11public U0 ClipCopy(CDoc *doc)12{//Copy DOCET_SEL flagged entries to clip.13 CDoc *doc2=sys_clip_doc;14 Bool unlock_doc=DocLock(doc),15 unlock_doc2=DocLock(doc2);16 CDocEntry *doc_e=doc->head.next,*doc_ne;17 ClipDel;18 while (doc_e!=doc) {19 if (doc_e->type & DOCET_SEL) {20 doc_e->type&=~DOCET_SEL;21 if (!Bt(doldoc.type_flags_data,doc_e->type_u8)) {22 doc_ne=DocEntryCopy(doc2,doc_e);23 QueIns(doc_ne,doc2->head.last);24 }25 }26 doc_e=doc_e->next;27 }28 if (unlock_doc2)29 DocUnlock(doc2);30 if (unlock_doc)31 DocUnlock(doc);32}33 34public U0 ClipCut(CDoc *doc)35{//Remove sel entries and place on clip.36 CDoc *doc2=sys_clip_doc;37 Bool unlock_doc=DocLock(doc),38 unlock_doc2=DocLock(doc2);39 CDocEntry *doc_e=doc->head.next,*doc_e1,*doc_ne,*doc_e2=NULL;40 ClipDel;41 while (doc_e!=doc) {42 doc_e1=doc_e->next;43 if (doc_e->type & DOCET_SEL) {44 doc_e->type&=~DOCET_SEL;45 if (!Bt(doldoc.type_flags_data,doc_e->type_u8)) {46 doc_ne=DocEntryCopy(doc2,doc_e);47 QueIns(doc_ne,doc2->head.last);48 }49 if (doc_e==doc->cur_entry || doc_e==doc_e2)50 doc_e2=doc_e->next;51 DocEntryDel(doc,doc_e);52 }53 doc_e=doc_e1;54 }55 if (doc_e2) {56 doc->cur_entry=doc_e2;57 doc->cur_col=doc_e2->min_col;58 }59 DocRemSoftNewLines(doc,NULL);60 if (unlock_doc2)61 DocUnlock(doc2);62 if (unlock_doc)63 DocUnlock(doc);64}65 66public U0 ClipPaste(CDoc *doc)67{//Insert copy of clip at insert pt, cur_entry.68 CDoc *doc2=sys_clip_doc;69 Bool unlock_doc=DocLock(doc),70 unlock_doc2=DocLock(doc2);71 CDocEntry *doc_ce=doc->cur_entry,*doc_e;72 if (doc_ce->type_u8==DOCT_DATA) {73 doc_e=doc2->head.next;74 while (doc_e!=doc2) {75 if (doc_e->de_flags&DOCEF_TAG)76 DocPrintPartial(doc,"%s",doc_e->tag);77 doc_e=doc_e->next;78 }79 } else80 DocInsDoc(doc,doc2);81 if (unlock_doc2)82 DocUnlock(doc2);83 if (unlock_doc)84 DocUnlock(doc);85}86 87public U0 DocCut(CDoc *doc,CDocEntry *start,CDocEntry *end)88{//Del start to end entry, including end points.89 Bool unlock_doc=DocLock(doc);90 CDocEntry *doc_e1;91 if (start!=doc && (start->last!=end || end==doc))92 do {93 doc_e1=start->next;94 if (start==doc->cur_entry) {95 doc->cur_entry=start->next;96 doc->cur_col=doc->cur_entry->min_col;97 }98 DocEntryDel(doc,start);99 if (start==end)100 break;101 start=doc_e1;102 } while (start!=doc);103 DocRemSoftNewLines(doc,NULL);104 if (unlock_doc)105 DocUnlock(doc);106}107 108public CDoc *DocCopy(CDoc *doc,CDocEntry *start,CDocEntry *end)109{//Copies start to end entry, including end points.110 CDoc *doc2=DocNew;111 Bool unlock_doc=DocLock(doc);112 CDocEntry *doc_ne;113 if (start!=doc && (start->last!=end || end==doc))114 do {115 if (!Bt(doldoc.type_flags_data,start->type_u8)) {116 doc_ne=DocEntryCopy(doc2,start);117 QueIns(doc_ne,doc2->head.last);118 }119 if (start==end)120 break;121 start=start->next;122 } while (start!=doc);123 if (unlock_doc)124 DocUnlock(doc);125 return doc2;126}127 