hschumann2/TempleOS-Source-Code
0847
1 2#help_index "DolDoc"3 4public Bool DocLock(CDoc *doc)5{//Make this task have exclusive access to this doc.6 if (!Bt(&doc->locked_flags,DOClf_LOCKED) || doc->owning_task!=Fs) {7 while (LBts(&doc->locked_flags,DOClf_LOCKED))8 Yield;9 if (doc->owning_task!=Fs)10 LBEqu(&doc->flags,DOCf_BREAK_UNLOCKED,BreakLock(Fs));11 doc->owning_task=Fs;12 return TRUE;13 } else14 return FALSE;15}16 17public Bool DocUnlock(CDoc *doc)18{//Release exclusive lock on access to doc.19 Bool unlock_break;20 if (Bt(&doc->locked_flags,DOClf_LOCKED) && doc->owning_task==Fs) {21 doc->owning_task=0;22 unlock_break=Bt(&doc->flags,DOCf_BREAK_UNLOCKED);23 LBtr(&doc->locked_flags,DOClf_LOCKED);24 if (unlock_break)25 BreakUnlock(Fs);26 return TRUE;27 } else28 return FALSE;29}30 31Bool IsEditableText(CDocEntry *doc_e)32{33 if (doc_e->type_u8==DOCT_TEXT&&!(doc_e->de_flags&DOCEG_DONT_EDIT))34 return TRUE;35 else36 return FALSE;37}38 39CDocEntry *DocEntryNewBase(CDoc *doc,I64 type,I64 de_flags=0,40 I64 x=0,I64 y=0,I64 page_line_num=0)41{//See also MAllocIdent and CDocEntry.42 CDocEntry *res=CAlloc(sizeof(CDocEntryBase),doc->mem_task);43 res->type=type;44 res->de_flags=de_flags|doldoc.dft_de_flags[type.u8[0]];45 res->x=x;46 res->y=y;47 res->page_line_num=page_line_num;48 return res;49}50 51CDocEntry *DocEntryNewTag(CDoc *doc,CDocEntry *doc_ce,U8 *tag)52{53 I64 l=StrLen(tag);54 CDocEntry *res=DocEntryNewBase(doc,doc_ce->type,doc_ce->de_flags,55 doc_ce->x,doc_ce->y,doc_ce->page_line_num);56 res->de_flags=doc_ce->de_flags; //Override57 res->max_col=l;58 res->tag=MAlloc(l+1,doc->mem_task);59 MemCpy(res->tag,tag,l+1);60 MemCpy(&res->settings,&doc_ce->settings,sizeof(CDocSettings));61 return res;62}63 64public U0 DocEntryDel(CDoc *doc,CDocEntry *doc_e)65{//Free entry and all parts of entry.66 if (!doc || doc==doc_e)67 RawPrint(3000,"DocEntryDel");68 else {69 if (doc->cur_entry==doc_e)70 doc->cur_entry=doc_e->next;71 QueRem(doc_e);72 if (doc_e->de_flags & DOCEF_TAG)73 Free(doc_e->tag);74 if (doc_e->de_flags & DOCEF_AUX_STR)75 Free(doc_e->aux_str);76 if (doc_e->de_flags & DOCEF_DEFINE)77 Free(doc_e->define_str);78 if (doc_e->de_flags & DOCEF_HTML_LINK)79 Free(doc_e->html_link);80 if (doc_e->de_flags & DOCEF_LEFT_MACRO)81 Free(doc_e->left_macro);82 if (doc_e->de_flags & DOCEF_RIGHT_MACRO)83 Free(doc_e->right_macro);84 if (doc_e->de_flags & DOCEF_BIN_PTR_LINK)85 Free(doc_e->bin_ptr_link);86 if (doc_e->de_flags & DOCEF_HAS_BIN)87 DocBinDel(doc,doc_e->bin_data);88 if (doc_e->de_flags & DOCEF_REMALLOC_DATA)89 Free(doc_e->data);90 Free(doc_e);91 }92}93 94public I64 DocEntrySize(CDoc *,CDocEntry *doc_e)95{//Mem size of entry and all parts.96 I64 res;97 if (!doc_e) return 0;98 res=MSize2(doc_e);99 if (doc_e->de_flags & DOCEF_TAG)100 res+=MSize2(doc_e->tag);101 if (doc_e->de_flags & DOCEF_AUX_STR)102 res+=MSize2(doc_e->aux_str);103 if (doc_e->de_flags & DOCEF_DEFINE)104 res+=MSize2(doc_e->define_str);105 if (doc_e->de_flags & DOCEF_HTML_LINK)106 res+=MSize2(doc_e->html_link);107 if (doc_e->de_flags & DOCEF_LEFT_MACRO)108 res+=MSize2(doc_e->left_macro);109 if (doc_e->de_flags & DOCEF_RIGHT_MACRO)110 res+=MSize2(doc_e->right_macro);111 if (doc_e->de_flags & DOCEF_BIN_PTR_LINK)112 res+=MSize2(doc_e->bin_ptr_link);113 if (doc_e->de_flags & DOCEF_REMALLOC_DATA)114 res+=MSize2(doc_e->data);115 return res;116}117 118U0 DocUndoDel(CDoc *,CDocUndo *u)119{120 Free(u->body);121 Free(u);122}123 124U0 DocUndoCntSet(CDoc *doc)125{126 Bool unlock=DocLock(doc);127 CDocUndo *u=doc->undo_head.next;128 doc->undo_cnt=0;129 while (u!=&doc->undo_head) {130 doc->undo_cnt++;131 u=u->next;132 }133 if (unlock)134 DocUnlock(doc);135}136 137public CDocEntry *DocEntryCopy(CDoc *doc,CDocEntry *doc_e)138{//Make copy of entry and all parts of entry.139 CDocEntry *doc_ne;140 CDocBin *tmpb;141 CTask *task=doc->mem_task;142 doc_ne=MAllocIdent(doc_e,task);143 doc_ne->next=doc_ne;144 doc_ne->last=doc_ne;145 if (doc_e->de_flags & DOCEF_TAG)146 doc_ne->tag=MAllocIdent(doc_e->tag,task);147 if (doc_e->de_flags & DOCEF_AUX_STR)148 doc_ne->aux_str=MAllocIdent(doc_e->aux_str,task);149 if (doc_e->de_flags & DOCEF_DEFINE)150 doc_ne->define_str=MAllocIdent(doc_e->define_str,task);151 if (doc_e->de_flags & DOCEF_HTML_LINK)152 doc_ne->html_link=MAllocIdent(doc_e->html_link,task);153 if (doc_e->de_flags & DOCEF_LEFT_MACRO)154 doc_ne->left_macro=MAllocIdent(doc_e->left_macro,task);155 if (doc_e->de_flags & DOCEF_RIGHT_MACRO)156 doc_ne->right_macro=MAllocIdent(doc_e->right_macro,task);157 if (doc_e->de_flags & DOCEF_BIN_PTR_LINK)158 doc_ne->bin_ptr_link=MAllocIdent(doc_e->bin_ptr_link,task);159 if (doc_e->de_flags & DOCEF_HAS_BIN) {160 tmpb=MAllocIdent(doc_e->bin_data,task);161 tmpb->data=MAllocIdent(doc_e->bin_data->data,task);162 doc_ne->bin_num=doc->cur_bin_num;163 tmpb->num=doc->cur_bin_num++;164 doc_ne->bin_data=tmpb;165 if (doc_e->de_flags&DOCEF_TAG && doc_e->tag && *doc_e->tag)166 tmpb->tag=StrNew(doc_e->tag,task);167 else168 tmpb->tag=NULL;169 QueIns(tmpb,doc->bin_head.last);170 }171 if (doc_e->de_flags & DOCEF_REMALLOC_DATA)172 doc_ne->data=MAllocIdent(doc_e->data,task);173 return doc_ne;174}175 176U0 DocRemSoftNewLines(CDoc *doc=NULL,CDocEntry *doc_e=NULL)177{178 CDocEntry *doc_e2,*saved_ll=doc_e;179 Bool unlock;180 if (!doc && !(doc=DocPut))181 return;182 unlock=DocLock(doc);183 if (!doc_e) doc_e=doc->head.next;184 while (doc_e!=doc) {185 doc_e2=doc_e->next;186 if (doc_e->type_u8==DOCT_SOFT_NEW_LINE) {187 if (doc->cur_entry==doc_e) {188 doc->cur_entry=doc_e2;189 doc->cur_col=doc->cur_entry->min_col;190 }191 DocEntryDel(doc,doc_e);192 } else if (saved_ll && doc_e->type_u8==DOCT_NEW_LINE)193 break;194 doc_e=doc_e2;195 }196 if (unlock)197 DocUnlock(doc);198}199 200public U0 DocInsEntry(CDoc *doc,CDocEntry *doc_e)201{//Insert entry into doc, updating its vals.202 U8 *dst;203 Bool unlock=DocLock(doc);204 CDocEntry *doc_ce=doc->cur_entry,*doc_ne;205 206 doc_e->x=doc_ce->x;207 doc_e->y=doc_ce->y;208 doc_e->page_line_num=doc_ce->page_line_num;209 MemCpy(&doc_e->settings,&doc_ce->settings,sizeof(CDocSettings));210 if (doc->cur_col>0 &&211 doc_ce->type_u8==DOCT_TEXT &&212 !(doc_ce->de_flags&(DOCEF_TAG_CB|DOCEF_DEFINE|DOCEF_AUX_STR|213 DOCEF_HTML_LINK|DOCEF_BIN_PTR_LINK)) &&214 doc->cur_col<doc_ce->max_col) {215 dst=doc_ce->tag+doc->cur_col;216 doc_ne=DocEntryNewTag(doc,doc_ce,dst);217 *dst=0;218 doc_ne->type=DOCT_TEXT|doc_ce->type&0xFFFFFF00;219 doc_ce->max_col=doc->cur_col;220 QueIns(doc_ne,doc_ce);221 doc->cur_col=0;222 doc_ce=doc_ne;223 }224 if (doc_ce->type_u8==DOCT_TEXT && doc->cur_col>=doc_ce->max_col) {225 QueIns(doc_e,doc_ce);226 doc->cur_entry=doc_e->next;227 } else {228 QueIns(doc_e,doc_ce->last);229 doc->cur_entry=doc_ce;230 }231 doc->cur_col=doc->cur_entry->min_col;232 DocRemSoftNewLines(doc,doc->cur_entry);233 if (unlock)234 DocUnlock(doc);235}236 237public U0 DocRst(CDoc *doc,Bool is_old)238{//Del all entries and set doc to dfts.239 Bool unlock;240 CDocEntry *doc_e,*doc_e2;241 CDocUndo *u,*u8;242 CDocSettings *s;243 CDocBin *b,*b1;244 if (!doc && !(doc=DocPut))245 return;246 unlock=DocLock(doc);247 if (is_old) {248 doc_e=doc->head.next;249 while (doc_e!=doc) {250 doc_e2=doc_e->next;251 DocEntryDel(doc,doc_e);252 doc_e=doc_e2;253 }254 u=doc->undo_head.next;255 while (u!=&doc->undo_head) {256 u8=u->next;257 DocUndoDel(doc,u);258 u=u8;259 }260 b=doc->bin_head.next;261 while (b!=&doc->bin_head) {262 b1=b->next;263 QueRem(b);264 Free(b->data);265 Free(b);266 b=b1;267 }268 }269//Check DocInsDoc270 doc->flags&=DOCF_BREAK_UNLOCKED;271 doc->head.next=doc->head.last=doc;272 QueInit(&doc->bin_head);273 QueInit(&doc->undo_head);274 doc->undo_head.time_stamp=0;275 doc->undo_cnt=0;276 doc->cur_bin_num=1;277 doc->dollar_buf_ptr=0;278 doc->cmd_U8=CH_SPACE;279 doc->page_line_num=0;280 doc->best_d=I64_MAX;281 282 s=&doc->settings_head;283 s->left_margin=DOC_DFT;284 s->right_margin=DOC_DFT;285 s->indent=0;286 s->page_len=66;287 s->header=DOC_DFT;288 s->footer=DOC_DFT;289 s->state=DOCSS_NORMAL;290 s->comment_depth=0;291 s->paren_depth=0;292 s->brace_depth=0;293 s->shifted_x=0;294 s->shifted_y=0;295 s->cur_text_attr=s->dft_text_attr=DOC_ATTR_DFT_TEXT;296 297 doc_e=&doc->head;298 doc_e->type=DOCT_ERROR;299 doc_e->de_flags=0;300 doc_e->x=0;301 doc_e->y=0;302 doc_e->min_col=0;303 doc_e->max_col=0;304 doc_e->page_line_num=doc->page_line_num;305 MemCpy(&doc_e->settings,s,sizeof(CDocSettings));306 307 DocTop(doc);308 if (unlock)309 DocUnlock(doc);310}311 312public U0 DocDel(CDoc *doc)313{//Free entire doc and entries.314 if (!doc || doc->doc_signature!=DOC_SIGNATURE_VAL) return;315 DocLock(doc);316 doc->doc_signature=0;317 DocRst(doc,TRUE);318 Free(doc->find_replace);319 Free(doc->dollar_buf);320 DocUnlock(doc);321 Free(doc);322}323 324public I64 DocSize(CDoc *doc)325{//Mem size of doc and all its entries.326 Bool unlock;327 CDocEntry *doc_e;328 CDocUndo *u;329 CDocBin *b;330 I64 res=0;331 332 if (!doc || doc->doc_signature!=DOC_SIGNATURE_VAL) return 0;333 unlock=DocLock(doc);334 335 doc_e=doc->head.next;336 while (doc_e!=doc) {337 res+=DocEntrySize(doc,doc_e);338 doc_e=doc_e->next;339 }340 341 u=doc->undo_head.next;342 while (u!=&doc->undo_head) {343 res+=MSize2(u->body);344 res+=MSize2(u);345 u=u->next;346 }347 348 b=doc->bin_head.next;349 while (b!=&doc->bin_head) {350 res+=MSize2(b->data);351 res+=MSize2(b);352 b=b->next;353 }354 355 res+=MSize2(doc->find_replace);356 res+=MSize2(doc->dollar_buf);357 res+=MSize2(doc);358 if (unlock)359 DocUnlock(doc);360 return res;361}362 363#help_index "DolDoc"364public CDoc *DocNew(U8 *filename=NULL,CTask *task=NULL)365{//MAlloc new DolDoc. (Begin a new doc.)366 CDoc *doc;367 if (!task) task=Fs;368 doc=CAlloc(sizeof(CDoc),task);369 if (filename)370 StrCpy(doc->filename.name,filename);371 else372 StrCpy(doc->filename.name,blkdev.tmp_filename);373 doc->find_replace=CAlloc(sizeof(CEdFindText),task);374 doc->find_replace->scan_fwd=TRUE;375 doc->find_replace->match_case=TRUE;376 doc->find_replace->pmt=TRUE;377 doc->left_click_link=&EdLeftClickLink;378 doc->dollar_buf_size=84;379 doc->dollar_buf=MAlloc(doc->dollar_buf_size,task);380 doc->max_entries=I64_MAX;381 doc->win_task=task;382 doc->mem_task=task;383 DocRst(doc,FALSE);384 doc->doc_signature=DOC_SIGNATURE_VAL;385 return doc;386}387 