Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
DocLink.txt360 linesDownload Raw Back to DolDoc
1 2#help_index "DolDoc/Link"3 4/* See TempleOS Link Types.5"filename"6"FI:filename"7"FA:haystack_filename,needle_anchor_str"8"FF:haystack_filename,needle_str"9"FF:haystack_filename,needle_str:occurnum"10"FL:filename,linenum"11"MN:SymName"12"PI:filename"13"PF:haystack_filename,needle_str"14"PF:haystack_filename,needle_str:occurnum"15"PL:filename,linenum"16"BF:haystack_bible_book,needle_str"17"DN:word"18"DN:word,defnum"19"HI:index"20"AD:code_address_number"21 22To edit a doc structure already in memory. See SpriteEdText().23"AI:doc_address"24"AA:haystack_doc_address,needle_anchor_str"25"AF:haystack_doc_address,needle_str"26"AF:haystack_doc_address,needle_str:occurnum"27"AL:doc_address,linenum"28*/29 30#define LK_FILE         031#define LK_FILE_ANCHOR  132#define LK_FILE_FIND    233#define LK_FILE_LINE    334#define LK_MAN_PAGE     435#define LK_PLAIN        536#define LK_PLAIN_FIND   637#define LK_PLAIN_LINE   738#define LK_BIBLE_FIND   839#define LK_DEF          940#define LK_HELP_INDEX   1041#define LK_ADDR         1142#define LK_DOC          12 //See SpriteEdText()43#define LK_DOC_ANCHOR   1344#define LK_DOC_FIND     1445#define LK_DOC_LINE     1546#define LK_PLACE_ANCHOR 1647 48public U8 *DocEntryLink(CDoc *doc,CDocEntry *doc_e)49{//MAlloc new str, either tag or aux_str if link.50  if (doc_e->de_flags&DOCEF_LINK) {51    if (doc_e->de_flags & DOCEF_AUX_STR)52      return StrNew(doc_e->aux_str,doc->mem_task);53    else if (doc_e->de_flags & DOCEF_TAG)54      return StrNew(doc_e->tag,doc->mem_task);55  }56  return NULL;57}58 59Bool DocFileEd(I64 _type,U8 *filename,60        U8 *needle_str,I64 *_num,I64 edf_dof_flags)61{62  I64 type=_type,flags=0,old_border_src=Fs->border_src;63  CDocEntry *doc_e;64  CDoc *doc;65  Bool old_silent=Bt(&Fs->display_flags,DISPLAYf_SILENT),66        res=FALSE,other_found=FALSE;67  U8 *st1,*st2;68  try {69    switch (type) {70      case LK_PLAIN:71        flags=DOCF_PLAIN_TEXT|DOCF_NO_CURSOR;72      case LK_DOC:73        type=LK_FILE;74        break;75      case LK_DOC_ANCHOR:76        type=LK_FILE_ANCHOR;77        break;78      case LK_PLAIN_FIND:79        flags=DOCF_PLAIN_TEXT|DOCF_NO_CURSOR;80      case LK_DOC_FIND:81        type=LK_FILE_FIND;82        break;83      case LK_PLAIN_LINE:84        flags=DOCF_PLAIN_TEXT|DOCF_NO_CURSOR;85      case LK_DOC_LINE:86        type=LK_FILE_LINE;87        break;88      case LK_BIBLE_FIND:89        flags=DOCF_PLAIN_TEXT|DOCF_NO_CURSOR;90        break;91    }92 93    flags|=DOCF_ALLOW_UNDO;94 95    if (LK_DOC<=_type<=LK_DOC_LINE) {96      doc=Str2I64(filename);//See SpriteEdText()97      res=TRUE;98    } else {99      st1=StrNew(filename);100      st2=StrNew(filename);101      StrLastRem(st1,"/",st2); //st2 is name without dir102      if (!FileNameChk(st2))103        doc=NULL;104      else {105        Silent;106        if (Bt(&edf_dof_flags,EDf_BAIL)) //if bail, scan parents107          res=FileFind(filename,,108                FUF_JUST_FILES|FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);109        else if (!(res=FileFind(filename,,FUF_JUST_FILES)))110          other_found=FileFind(filename,,111                FUF_JUST_FILES|FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);112        doc=DocRead(filename,flags);113        doc->desc='Edit';114        Silent(old_silent);115        Fs->border_src=BDS_ED_FILENAME_DRV;116      }117      Free(st1);118      Free(st2);119    }120    if (!doc||doc->doc_signature!=DOC_SIGNATURE_VAL)121      res=FALSE;122    else {123      if (Bt(&edf_dof_flags,EDf_COLLAPSE))124        DocCollapse(TRUE,doc);125      else if (Bt(&edf_dof_flags,EDf_UNCOLLAPSE))126        DocCollapse(FALSE,doc);127 128      if (res || other_found)129        switch (type) {130          case LK_FILE_LINE:131            res=DocGoToLine(doc,*_num);132            break;133          case LK_FILE_ANCHOR:134            res=DocAnchorFind(doc,needle_str);135            break;136          case LK_FILE_FIND:137            res=DocFind(doc,,needle_str,*_num);138            break;139          case LK_BIBLE_FIND:140            res=DocFind(doc,*_num,needle_str);141            break;142          default:143            DocCenter(doc);144        }145      *_num=doc->cur_entry->y+1;146 147      if (edf_dof_flags&EDF_WAS_WRITE)148        res=FALSE;149      if (!(edf_dof_flags&EDF_BAIL)) {150        if (*doc->filename.name)151          doc->filename.dirc=DirContextNew(doc->filename.name);152        else153          doc->filename.dirc=NULL;154        if (DocEd(doc,edf_dof_flags|DOF_DONT_HOME)) {155          DocLock(doc);156          doc_e=doc->cur_entry;157          if (doc_e!=doc)158            DocEntryRun(doc,doc_e,TRUE);159          DocUnlock(doc);160          if (!(LK_DOC<=_type<=LK_DOC_LINE)) {161            DocWrite(doc);162            if (edf_dof_flags&EDF_WAS_WRITE)163              res=TRUE;164          }165        }166        DirContextDel(doc->filename.dirc);167      }168      if (!(LK_DOC<=_type<=LK_DOC_LINE))169        DocDel(doc);170    }171  } catch {172    Silent(old_silent);173    res=FALSE;174  }175  Fs->border_src=old_border_src;176  return res;177}178 179#define DFT_ADDR_LINK_BIN_SIZE  64180 181public I64 EdLinkCvt(U8 *link_st,U8 **_filename=NULL,U8 **_needle_str=NULL,182        I64 *_num=NULL,I64 edf_dof_flags=0)183{//Editor Link--> filename, needle_str and line number.184  U8 *st,*ptr,*src,*filename=NULL,*needle_str=NULL,*filename2;185  I64 res,i,num=1;186  CHashSrcSym *tmph;187  if (!link_st||!*link_st) {188    if (edf_dof_flags&EDF_BAIL)189      return -1;190    link_st=blkdev.tmp_filename;191  }192  st=StrNew(link_st);193  res=LK_FILE;194  if (StrLen(st)>3 && st[2]==':') {195    st[2]=0;196    filename2=st+3;197    switch (res=DefineMatch(st,"ST_LINK_TYPES",LMF_IGNORE_CASE)) {198      case LK_MAN_PAGE:199        if (tmph=HashFind(filename2,Fs->hash_table,HTG_SRC_SYM))200          res=EdLinkCvt(tmph->src_link,&filename,201                &needle_str,&num,edf_dof_flags);202        else203          res=-1;204        goto lc_done;205      case LK_ADDR:206        if (ptr=StrLastOcc(filename2,",")) {207          *ptr=0;208          i=Str2I64(ptr+1);209        } else210          i=DFT_ADDR_LINK_BIN_SIZE;211        if (ptr=SrcEdLink(ExePrint("%s;",filename2),i)) {212          res=EdLinkCvt(ptr,&filename,&needle_str,&num,edf_dof_flags);213          Free(ptr);214        } else215          res=-1;216        goto lc_done;217      case LK_DEF:218        if (ptr=StrLastOcc(filename2,",")) {219          *ptr=0;220          i=Str2I64(ptr+1);221        } else222          i=-1;223        filename=StrNew(filename2);224        num=i;225        goto lc_done;226      case LK_HELP_INDEX:227        filename=StrNew(filename2);228        goto lc_done;229      case LK_BIBLE_FIND:230        if (ptr=StrLastOcc(filename2,",")) {231          *ptr=0;232          src=ptr+1;233          while (*src) { //We do not allow ending verse234            if (*src=='-')235              *src=0;236            src++;237          }238          needle_str=StrNew(ptr+1);239        }240        i=DefineMatch(filename2,"ST_BIBLE_BOOKS",LMF_IGNORE_CASE);241        if (i<0)242          res=-1;243        else {244          num=Str2I64(DefineSub(i,"ST_BIBLE_BOOK_LINES"));245          filename2=BIBLE_FILENAME;246        }247        break;248      case LK_FILE_LINE:249      case LK_PLAIN_LINE:250      case LK_DOC_LINE:251        if (ptr=StrLastOcc(filename2,",")) {252          *ptr=0;253          num=Str2I64(ptr+1);254        }255        break;256      case LK_FILE_ANCHOR:257      case LK_DOC_ANCHOR:258        if (ptr=StrLastOcc(filename2,",")) {259          *ptr=0;260          needle_str=StrNew(ptr+1);261        }262        break;263      case LK_FILE_FIND:264      case LK_PLAIN_FIND:265      case LK_DOC_FIND:266        if (ptr=StrLastOcc(filename2,",")) {267          *ptr=0;268          needle_str=StrNew(ptr+1);269          if (ptr=StrLastOcc(needle_str,":")) {270            *ptr=0;271            num=Str2I64(ptr+1);272          }273        }274        break;275    }276  } else277    filename2=st;278  if (res>=0) {279    if (LK_DOC<=res<=LK_DOC_LINE)280      filename=StrNew(filename2); //Holds document address as number.281    else282      filename=FileNameAbs(filename2,FUF_Z_OR_NOT_Z);283  }284lc_done:285  Free(st);286  if (_filename)287    *_filename=filename;288  else289    Free(filename);290  if (_needle_str)291    *_needle_str=needle_str;292  else293    Free(needle_str);294  if (_num)295    *_num=num;296  return res;297}298 299public Bool DocLinkChk(CDoc *doc,U8 *link_st)300{//Check for bad Editor Link.301  U8 *filename,*st;302  Bool res=FALSE;303  CDirContext *dirc;304  if (link_st) {305    st=FileNameAbs(doc->filename.name);306    dirc=DirContextNew(st);307    Free(st);308    switch (EdLinkCvt(link_st,&filename)) {309      case -1:310        break;311      case LK_FILE_LINE:312      case LK_PLAIN_LINE:313      case LK_FILE:314//We don't check line number315        res=FileFind(filename,,316              FUF_JUST_FILES|FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);317        break;318      case LK_BIBLE_FIND:319        st=StrNew(link_st+3);320        if (StrOcc(st,','))321          StrLastRem(st,",");322        if (DefineMatch(st,"ST_BIBLE_BOOKS",LMF_IGNORE_CASE)>=0)323          res=TRUE;324        Free(st);325        break;326      default://TODO: Need to validate HI: and DN:327        if (Ed(link_st,EDF_BAIL))328          res=TRUE;329    }330    Free(filename);331    DirContextDel(dirc);332  }333  return res;334}335 336public U8 *DocLinkFile(U8 *link_st,CTask *mem_task=NULL)337{//Return the file for an Editor Link Types.338  U8 *filename=NULL,*st,*res=NULL;339  if (link_st) {340    switch (EdLinkCvt(link_st,&filename)) {341      case LK_FILE:342      case LK_FILE_ANCHOR:343      case LK_FILE_FIND:344      case LK_FILE_LINE:345      case LK_PLAIN:346      case LK_PLAIN_FIND:347      case LK_PLAIN_LINE:348        st=FileNameAbs(filename,FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);349        res=StrNew(st);350        Free(st);351        break;352      case LK_BIBLE_FIND:353        res=StrNew(BIBLE_FILENAME,mem_task);354        break;355    }356    Free(filename);357  }358  return res;359}360