hschumann2/TempleOS-Source-Code
0847
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 