Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
DocNew.txt387 linesDownload Raw Back to DolDoc
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