ReturnSourceCode
From Pickwiki
Jump to navigationJump to searchFFT.BP 'RETURN.SOURCE.PATH' BASIC 55 lines Level: 3 0001 SUBROUTINE RETURN.SOURCE.PATH(K.GLOBAL.CATDIR,SOURCE.PATH,ERRMSG) 0002 * Return the source path from the end of the GLOBAL.CATDIR opcode 0003 * Will Johnson, March 2013, 0004 * Released under CC-BY-2.0 license 0005 * 0006 * In this next routine, the source location cannot be READ directly 0007 * from the corresponding record in the GLOBAL.CATDIR file if there is 0008 * a ^255 in that record, which truncates the record prematurely. 0009 * Examining the record in the up-arrow mode of the EDitor, we can see 0010 * that the source code location is at the end of the item, and is 0011 * bounded by SEQ(0), but not the last SEQ(0) because they can't make it 0012 * easy can they? So strip off the last two SEQ(0)s, and then get the 0013 * last FIELD and that should be the filepath. 0014 * 0015 * SO in the below code we blockread throwing out any hex FF's (255), 0016 * then retrieve the last attribute of that and then we convert the 0017 * non-printables to periods ("MCP" conversion) and THEN we walk 0018 * backward through it until we just have the last field delimited by two 0019 * non-printables ("."), and that's our filepath. Exhausted yet? 0020 * 0021 EQUATE FALSE TO 0, TRUE TO 1 0022 SOURCE.PATH = '' 0023 ERRMSG = '' 0024 OPENSEQ "GLOBAL.CATDIR",K.GLOBAL.CATDIR TO F.GLOBAL.CATDIR ELSE 0025 ERRMSG = "Can't read this item '":K.GLOBAL.CATDIR:"'" 0026 ERRMSG := " from the GLOBAL.CATDIR file." 0027 RETURN 0028 END 0029 * 0030 DONE = FALSE ; OBJECT.CODE = '' 0031 LOOP 0032 READBLK T.BLOCK FROM F.GLOBAL.CATDIR,1 THEN NULL ELSE 0033 DONE = TRUE 0034 END 0035 UNTIL DONE DO 0036 BEGIN CASE 0037 CASE T.BLOCK = CHAR(255) ; NULL 0038 CASE 1 ; OBJECT.CODE := T.BLOCK 0039 END CASE 0040 REPEAT 0041 S.OBJECT.CODE = DCOUNT(OBJECT.CODE,@AM) 0042 PR.FILE = OCONV(OBJECT.CODE<S.OBJECT.CODE>,"MCP") 0043 * 0044 FILEPATH = '' ; L.PR.FILE = LEN(PR.FILE) 0045 STATE = 0 ; LAST = '' ; I.PR.FILE = L.PR.FILE 0046 LOOP 0047 CH = PR.FILE[I.PR.FILE,1] 0048 FILEPATH = CH:FILEPATH 0049 IF LAST = '.' AND CH = '.' THEN STATE += 1 0050 UNTIL STATE = 2 OR I.PR.FILE = 1 DO 0051 LAST = CH ; I.PR.FILE -= 1 0052 REPEAT 0053 SOURCE.PATH = FILEPATH[3,LEN(FILEPATH)-4] 0054 RETURN 0055 END