home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 303.lha / AssemTools / Include / strlib.i < prev    next >
Text File  |  1980-12-03  |  26KB  |  1,303 lines

  1.  
  2. ;  *** Include Library for Handling Character Strings ***
  3. ;  05.08.89 v 1.770 JM     =AMIGA= Metacc Macro Assembler
  4.  
  5. ;    Edited: two bugs fixed on GETIWORD -> v1.3  12.11.88
  6. ;        <ESC>, <LF>, "*" included to BLKCPY -> v1.4 20.11.88
  7. ;        JM's STRCMP added -> v1.5 21.11.88
  8. ;        "addslash, remslash, extfname" added ->1.51 22.11.88
  9. ;        "peekword" added, "strlib" changed to use BSR ->1.52 TM 25.11.88
  10. ;        "blkncpy, getbcpl, putbcpl" -> v1.53 25.11.88
  11. ;        "stable" added, ".S"'s added to branches
  12. ;         -> v1.55 29.12.88
  13. ;        "strscmpi" added -> v1.56 14.01.89
  14. ;        "sblk, chkslash" added -> v1.57 20.01.89
  15. ;        "getbcpl" modified to return a1 -> v1.58 19.02.89
  16. ;        "findnth" added -> v1.59 19.02.89
  17. ;        "ptrlist, listlen, strlist, tsort" added -> v1.6 20.02.89
  18. ;        "tokcmp, findtok" added -> v1.61 20.02.89
  19. ;        "gettokw" added -> v1.62 01.03.89
  20. ;        "strcmpi, tsorti, strrev" added -> v1.7 04.03.89
  21. ;        sortentry.comments added -> v1.71 04.03.88
  22. ;        bubble inflation included into "tsort" and
  23. ;        "tsorti" -> v1.72 07.03.89
  24. ;        pull's changed for a68k -> v1.73 11.03.89
  25. ;        comments of "stable" mod. -> v1.74 260389
  26. ;        "tokcmp" debugt (now does not change a0 if
  27. ;        it points to NULL) -> v1.75 110589
  28. ;        "getrawdata" created -> v1.76 210589
  29. ;        *t, *T added to "blkcpy" -> v1.761 050689
  30. ;        "blkcpy" now does not convert any T into
  31. ;          a tabulator -> v1.762 100689
  32. ;        code compressed & speeded up -> v1.763 22.06.89
  33. ;        "findtok" debugt (now accepts also 'z' in the word)
  34. ;          -> v1.764 02.07.89
  35. ;        "addsuffix" and "remsuffix" created by JM -> v1.77 050889
  36. ;        "findtok" changed to skip over the token (at a0),
  37. ;          if it found the token from the list (just
  38. ;                 as 'tokcmp' does) -> v1.764b 07.08.89
  39.  
  40. *T
  41. *T    STRLIB.I  *  Metacc Include File
  42. *T        Version 1.77b
  43. *T        Date 07.08.89
  44. *T
  45. *B
  46.  
  47. ;  peekword    (peek integer string /double longword/)
  48. ;  in:        a0=*string;
  49. ;  call:    strlib peekword;
  50. ;  out:        d1:d0=string;
  51. ;  notes:    /see getiwordu/
  52.  
  53. ;  getiword    (get integer string /double longword/)
  54. ;  in:        a0=*string;
  55. ;  call:    strlib getiword;
  56. ;  out:        a0=*newstring; d1:d0=string;
  57. ;  notes:    /included characters are:/
  58. ;          /a-z, A-Z for first character/
  59. ;          /a-z, A-Z, 0-9 for other characters/
  60. ;          /no more than 8 characters will be fetched/
  61.  
  62. ;  getiwordu    (get integer string and ucase /double longword/)
  63. ;  in:        a0=*string;
  64. ;  call:    strlib getiwordu;
  65. ;  out:        a0=*newstring; d1:d0=string;
  66. ;  notes:    /see getiword/
  67.  
  68. ;  getrawdata    (get raw data string)
  69. ;  in:        a0=*from, a1=*to;
  70. ;  call:    strlib getrawdata;
  71. ;  out:        a0=*from_rest, a1=*to_end, d0=length_of_TO;
  72. ;  notes:    /The 'raw data' may include one or more
  73. ;           of the following elements, separated by
  74. ;           commas, ending with a blank or NULL:
  75. ;             "blubblub"    8-bit ascii data
  76. ;             123 or 123.b    8-bit decimal data
  77. ;             $ab or $ab.b    8-bit hexadec data
  78. ;             1234.w    16-bit decimal data
  79. ;             $12ab.w    16-bit hexadec data
  80. ;             123456.l    32-bit decimal data
  81. ;             $12ab56.l    32-bit hexadec data
  82. ;           ** Requires 'numlib' (getval)
  83. ;          /
  84.  
  85. ;  ucase    (convert character to upper case /byte/)
  86. ;  in:        d0=char;
  87. ;  call:    strlib ucase;
  88. ;  out:        d0=newchar;
  89.  
  90. ;  locase    (convert character to lower case /byte/)
  91. ;  in:        d0=char;
  92. ;  call:    strlib locase;
  93. ;  out:        d0=newchar;
  94.  
  95. ;  skipblk    (skip blanks /32, 9, 10/)
  96. ;  in:        a0=*string;
  97. ;  call:    strlib skipblk;
  98. ;  out:        a0=*newstring; d0=num_of_skipped_chars;
  99.  
  100. ;  sblk        (simple skip blanks /32, 9, 10/)
  101. ;  in:        a0=*;
  102. ;  call:    strlib sblk;
  103. ;  out:        a0=*;
  104.  
  105. ;  isalpha    (check if alpha /a-z, A-Z/)
  106. ;  in:        d0=char;
  107. ;  call:    strlib isalpha;
  108. ;  out:        p=(flags) result; /eq if true/
  109.  
  110. ;  isalphanum    (check if alphanumeric /a-z, A-Z, 0-9/)
  111. ;  in:        d0=char;
  112. ;  call:    strlib isalphanum;
  113. ;  out:        p=(flags) result; /eq if true/
  114.  
  115. ;  isnumeric    (check if numeric /0-9/)
  116. ;  in:        d0=char;
  117. ;  call:    strlib isnumeric;
  118. ;  out:        p=(flags) result; /eq if true/
  119.  
  120. ;  strupr    (string to upper case /null terminated/)
  121. ;  in:        a0=*string;
  122. ;  call:    strlib strupr;
  123.  
  124. ;  strlwr    (string to lower case /null terminated/)
  125. ;  in:        a0=*string;
  126. ;  call:    strlib strlwr;
  127.  
  128. ;  strcpy    (string copy /null terminated/)
  129. ;  in:        a0=*source_string; a1=*target_string;
  130. ;  call:    strlib strcpy;
  131.  
  132. ;  strscmp    (simple string compare /null terminated/)
  133. ;  in:        a0=*first_string; a1=*second_string;
  134. ;  call:    strlib strscmp;
  135. ;  out:        p.z=(boolean) result; /eq if equals/
  136. ;  notes:    /does not compare alpha order, just/
  137. ;          /equality/
  138.  
  139. ;  strscmpi    (simple string compare /case-insensitive/)
  140. ;  in:        a0=*first_string; a1=*second_string;
  141. ;  call:    strlib strscmpi;
  142. ;  out:        p.z=(boolean) result; /eq if equals/
  143. ;  notes:    /does not compare alpha order, just/
  144. ;          /equality/
  145.  
  146. ;  blkncpy    (string copy /length-limited blkcpy/)
  147. ;  in:        a0=*source_string; a1=*target_string; d0=max_length;
  148. ;  call:    strlib blkncpy
  149. ;  out:        a0=*rest_of_string=*(BLANK or NULL);
  150. ;          a1=*after_target_string=(*NULL)+1;
  151. ;          d0=num_of_chars_left_in_buffer;
  152. ;  notes:    /*n, *N = newline (10)/
  153. ;          /*e, *E = esc (27)/
  154. ;          /*t, *T = tab (9)/
  155.  
  156. ;  blkcpy    (string copy /blank or comma terminated/)
  157. ;  in:        a0=*source_string; a1=*target_string;
  158. ;  call:    strlib blkcpy;
  159. ;  out:        a0=*rest_of_string=*(BLANK or NULL);
  160. ;          a1=*after_target_string=(*NULL)+1;
  161. ;  notes:    /the target string will be null-terminated/
  162. ;          /whilst the source string terminates/
  163. ;          /with either blank, comma or null/
  164. ;        /quotes "" enbrace strings with blanks/
  165. ;        /"*" (in quotes) as in the CLI cmds/
  166.  
  167. ;  isblank    (check if blank /32, 9, 10/)
  168. ;  in:        d0=char;
  169. ;  call:    strlib isblank;
  170. ;  out:        p.z=(boolean) result; /eq if blank/
  171.  
  172. ;  strlen    (compute string length & end address/ null terminated)
  173. ;  in:        a0=*string;
  174. ;  call:    strlib strlen;
  175. ;  out:        d0=length; a0=(*NULL)+1;
  176.  
  177. ;  strnth    (find nth string in list / null terminated/)
  178. ;  in:        a0=*string_list; d0=(uword) count;
  179. ;  call:    strlib strnth;
  180. ;  out:        a0=*string; d0=(uword) $ffff;
  181. ;  notes:    /high speed, 4 instructions incl. rts./
  182. ;        /each string of the list is terminated/
  183. ;        /with a null byte. double-null (end-of-list)/
  184. ;        /will not be noticed./
  185.  
  186. ;  findnth    (find string from list /null terminated/)
  187. ;  in:        a0=*string; a1=*list;
  188. ;  call:    strlib findnth;
  189. ;  out:        d0=count;
  190. ;  notes:    /0 stands for the first string, -1 for error/
  191. ;        /the list should be terminated by an empty/
  192. ;        /string./
  193.  
  194. ;  strcmp    (compare strings /null terminated/)
  195. ;  in:        a0=*first_string; a1=*second_string;
  196. ;  call:    strlib strcmp;
  197. ;  out:        p.flags=result;
  198. ;  notes:    /results flags as CMP first_string, second_string/
  199. ;          /compares also lexicographity/
  200.  
  201. ;  strcmpi    (compare strings /case-insensitive/)
  202. ;  in:        a0=*first_string; a1=*second_string;
  203. ;  call:    strlib strcmpi;
  204. ;  out:        p.flags=result;
  205. ;  notes:    /see strcmp/
  206.  
  207. ;  addslash    (add slash into end of string if not / or :)
  208. ;  in:        a0=*string;
  209. ;  call:    strlib addslash;
  210. ;  out:        a0=*(NULL);
  211.  
  212. ;  remslash    (remove slash , if present, from end of pathname)
  213. ;  in:        a0=*string;
  214. ;  call:    strlib remslash;
  215. ;  out:        a0=*(NULL);
  216.  
  217. ;  chkslash    (check if a this string ends with a / or :)
  218. ;  in:        a0=*string;
  219. ;  call:    strlib chkslash;
  220. ;  out:        p.z=result /Z is set if no "/" or ":"/;
  221.  
  222. ;  extfname    (extract file name from a valid path+filename)
  223. ;  in:        a0=*string;
  224. ;  call:    strlib extfname;
  225. ;  out:        a0=*filename;
  226. ;  notes:    if no filename is present, the last directoryname
  227. ;          must be followed by slash (/).
  228.  
  229. ;  strend    (find end of string)
  230. ;  in:        a0=*string;
  231. ;  call:    strlib strend;
  232. ;  out:        a0=*(NULL)+1;
  233.  
  234. ;  putbcpl    (convert TO BCPL string)
  235. ;  in:        a0=*string; a1=*bcpl_string;
  236. ;  call:    strlib putbcpl;
  237. ;  out:        -
  238. ;  notes:    /the pointers are both APTRs and NOT BPTRs/
  239.  
  240. ;  getbcpl    (convert FROM BCPL string)
  241. ;  in:        a0=*bcpl_string; a1=*string;
  242. ;  call:    strlib getbcpl;
  243. ;  out:        a1=*NULL;
  244. ;  notes:    /the pointers are both APTRs and NOT BPTRs/
  245.  
  246. ;  stable    (seek string from table with modulo)
  247. ;  in:        a0=*string, a1=*string_list, d0=*modulo;
  248. ;  call:    strlib stable;
  249. ;  out:        a0=*data_item /==NULL if not found/;
  250. ;  notes:    /the value returned points to the data area/
  251. ;          /of the string. the parameter given in d0/
  252. ;          /specifies the length of the data entry./
  253. ;          /this entry is overskipped between the/
  254. ;          /string items. a NULL character must exist/
  255. ;          /after each string./
  256. ;          /condition codes are set according to the result./
  257.  
  258. ;  ptrlist    (create string pointer list)
  259. ;  in:        a0=*string_list; a1=*room_for_ptrlist;
  260. ;          d0=max_number_of_ptrs;
  261. ;  call:    strlib ptrlist;
  262. ;  out:        d0=number_of_ptrs;
  263. ;  notes:    /the string list in a0 should be terminated/
  264. ;          /by an empty string/
  265. ;          /collects the starting addresses for each/
  266. ;          /string into the ptrlist./
  267.  
  268. ;  listlen    (measure length of a string list)
  269. ;  in:        a0=*string_list;
  270. ;  call:    strlib listlen;
  271. ;  out:        d0=number_of_bytes; d1=number_of_strings;
  272. ;  notes:    /d0 is the number of bytes occupied by/
  273. ;          /the list, including the end nulls/
  274. ;          /d1 is the number of the string in the list/
  275.  
  276. ;  strlist    (convert a ptrlist into a stringlist)
  277. ;  in:        a0=*ptr_list; a1=*room_for_stringlist;
  278. ;          d0=len_of_buffer;
  279. ;  call:    strlib strlist;
  280. ;  out:        d0=number_of_strings;
  281. ;  notes:    /the check for overflow is only made/
  282. ;          /between the strings, thus the value/
  283. ;          /in d0 should be buffersize-<length-of/
  284. ;          /longest-string>/
  285.  
  286. ;  tsort    (bubble-sort a ptrlist)
  287. ;  in:        a0=*ptr_list;
  288. ;  call:    strlib tsort;
  289. ;  notes:    /a rather slow (?) way of doing this/
  290. ;        /empty strings separate "units": only/
  291. ;        /the units within a unit are ordered./
  292. ;        /the order of units is not changed./
  293.  
  294. ;  tsorti    (bubble-sort a ptrlist /case-insensitive/)
  295. ;  in:        a0=*ptr_list;
  296. ;  call:    strlib tsorti;
  297. ;  notes:    /see tsort/
  298.  
  299. ;  tokcmp    (token compare /case-insensitive/)
  300. ;  in:        a0=*first_string; a1=*second_string;
  301. ;  call:    strlib tokcmp;
  302. ;  out:        p.z=equality; /EQ if token match/
  303. ;          a0=*end_of_1st_string /if they were EQ;
  304. ;          otherwise unchanged/
  305. ;  notes:    /first_string may be terminated with/
  306. ;          /either NULL or BLANK, the second_string/
  307. ;          /must terminate with a NULL./
  308. ;          /the first_string does not need to match/
  309. ;          /the entire string, just the given chars/
  310. ;          /from the beginning/
  311.  
  312. ;  findtok    (find token from list /case-insensitive/)
  313. ;  in:        a0=*token; a1=*list;
  314. ;  call:    strlib findtok;
  315. ;  out:        d0=count; /-1 =^ not found/
  316. ;        a0=*end_of_token /not changed if not found/
  317. ;  notes:    /see tokcmp/
  318.  
  319. ;  gettokw    (get a token word)
  320. ;  in:        a0=txtptr; a1=*buffer; d0=(UWORD)buffer_length;
  321. ;  call:    strlib gettokw;
  322. ;  out:        a0=txtptr /updated/ ; a1=*buffer;
  323. ;          p.c=error; /c=1 if buffer overflow/
  324. ;  notes:    /a token word:/
  325. ;          /- begins with a-z|A-Z|.|_/
  326. ;          /- other chrs are a-z|A-Z|0-9|.|_/
  327. ;          /- must be at least 1 char. long/
  328.  
  329. ;  strrev    (reverse string /null-terminated/)
  330. ;  in:        a0=*string;
  331. ;  call:    strlib    strrev;
  332. ;  notes:    /created just for fun - the 40th routine!/
  333.  
  334. ;  addsuffix    (add suffix (".<suffix>") into end of string)
  335. ;  in:        a0=*suffix; a1=*string;
  336. ;  call:    strlib addsuffix;
  337. ;  out:        a1=*(NULL)+1; a0=*(NULL)+1
  338.  
  339. ;  remsuffix    (remove suffix, if present, from end of string)
  340. ;  in:        a0=*string;
  341. ;  call:    strlib remsuffix;
  342. ;  out:        a0=*(NULL);
  343.  
  344.  
  345. *E
  346.  
  347. ;;;
  348.  
  349.  
  350.  
  351. strlib    macro
  352.  
  353.       ifnc      '\1',''
  354.  
  355. _STRF\1        set        1
  356.         bsr        _STR\1
  357.         mexit
  358.  
  359.       endc
  360.  
  361.  
  362.         ifd        _STRFgetrawdata
  363. _STRgetrawdata    push    d1-d3/a2-a3
  364.         move.l    a1,a3
  365. _STRgetrawd1    move.b    (a0),d0
  366.         beq    _STRgetrawd0
  367.         cmp.b    #32,d0
  368.         beq    _STRgetrawd0
  369.         cmp.b    #9,d0
  370.         beq    _STRgetrawd0
  371.         cmp.b    #10,d0
  372.         beq    _STRgetrawd0
  373.         cmp.b    #'"',d0
  374.         bne.s    _STRgetrawd2
  375.         addq.w    #1,a0
  376. _STRgetrawd1b    move.b    (a0),d0
  377.         beq    _STRgetrawd0
  378.         addq.w    #1,d0
  379.         move.b    d0,(a1)+
  380.         cmp.b    #'"',d0
  381.         bne.s    _STRgetrawd1b
  382.         subq.w    #1,a1
  383. _STRgetrawd1c    cmp.b    #',',(a0)
  384.         bne    _STRgetrawd0
  385.         addq.w    #1,a0
  386.         strlib    sblk
  387.         bra.s    _STRgetrawd1
  388. _STRgetrawd2    cmp.b    #'-',d0
  389.         bne    _STRgetrawd3
  390.         addq.w    #1,a0
  391.         numlib    getval
  392.         neg.l    d0
  393. _STRgetrawd2a    move.l    d0,d1
  394.         cmp.b    #'.',(a0)
  395.         bne.s    _STRgetrawd2b
  396.         move.b    1(a0),d0
  397.         strlib    ucase
  398.         cmp.b    #'B',d0
  399.         bne.s    _STRgetrawd2c
  400. _STRgetrawd2b    move.b    d0,(a1)+
  401. _STRgetrawd2b1    lea.l    2(a0),a0
  402.         bra.s    _STRgetrawd1c
  403. _STRgetrawd2c    cmp.b    #'W',d0
  404.         bne.s    _STRgetrawd2d
  405.         move.b    d0,1(a1)
  406.         lsr.l    #8,d0
  407.         move.b    d0,(a1)
  408.         lea.l    2(a1),a1
  409.         bra.s    _STRgetrawd2b1
  410. _STRgetrawd2d    cmp.b    #'L',d0
  411.         bne    _STRgetrawd1c
  412.         move.b    d0,3(a1)
  413.         lsr.l    #8,d0
  414.         move.b    d0,2(a1)
  415.         lsr.l    #8,d0
  416.         move.b    d0,1(a1)
  417.         lsr.l    #8,d0
  418.         move.b    d0,(a1)
  419.         lea.l    4(a1),a1
  420.         bra.s    _STRgetrawd2b1
  421. _STRgetrawd3    numlib    getval
  422.         bra    _STRgetrawd2a
  423. _STRgetrawd0    move.l    a1,d0
  424.         sub.l    a3,d0
  425.         pull    d1-d3/a2-a3
  426.         rts
  427.         endc
  428.  
  429.  
  430.         ifd        _STRFstrrev
  431.  
  432. _STRstrrev    push    a0-a1/d0
  433.         move.l    a0,a1
  434. _STRstrrev1    tst.b    (a1)+
  435.         bne.s    _STRstrrev1
  436.         subq.w    #1,a1
  437.         bra.s    _STRstrrev3
  438. _STRstrrev2    move.b    (a0),d0
  439.         move.b    -(a1),(a0)+
  440.         move.b    d0,(a1)
  441. _STRstrrev3    cmp.l    a1,a0
  442.         blo.s    _STRstrrev2
  443.         pull    a0-a1/d0
  444.         rts
  445.  
  446.         endc
  447.  
  448.  
  449.         ifd        _STRFgettokw
  450.  
  451. _STRgettokw    push    d0-d1/a1
  452.         move.l    d0,d1
  453.         strlib    sblk
  454.         move.b    (a0)+,d0
  455.         cmp.b    #'.',d0
  456.         beq.s    _STRgettokw1        ;tokenword exists
  457.         cmp.b    #'_',d0
  458.         beq.s    _STRgettokw1
  459.         cmp.b    #'A',d0
  460.         blo.s    _STRgettokw0        ;not tokenword
  461.         cmp.b    #'Z',d0
  462.         bls.s    _STRgettokw1
  463.         cmp.b    #'a',d0
  464.         blo.s    _STRgettokw0
  465.         cmp.b    #'z',d0
  466.         bls.s    _STRgettokw1
  467. _STRgettokw0    subq.w    #1,a0
  468.         clr.b    (a1)
  469.         pull    d0-d1/a1
  470.         clrc
  471.         rts
  472. _STRgettokw.e    pull    d0-d1/a1    ;buffer overflow
  473.         setc
  474.         rts
  475. _STRgettokw1    move.b    d0,(a1)+
  476.         subq.w    #1,d1
  477.         beq.s    _STRgettokw.e
  478.         move.b    (a0)+,d0
  479.         cmp.b    #'.',d0
  480.         beq.s    _STRgettokw1
  481.         cmp.b    #'_',d0
  482.         beq.s    _STRgettokw1
  483.         cmp.b    #'0',d0
  484.         blo.s    _STRgettokw0
  485.         cmp.b    #'9',d0
  486.         bls.s    _STRgettokw1
  487.         cmp.b    #'A',d0
  488.         blo.s    _STRgettokw0
  489.         cmp.b    #'Z',d0
  490.         bls.s    _STRgettokw1
  491.         cmp.b    #'a',d0
  492.         blo.s    _STRgettokw0
  493.         cmp.b    #'z',d0
  494.         bls.s    _STRgettokw1
  495.         bra.s    _STRgettokw0
  496.  
  497.         endc
  498.  
  499.  
  500.         ifd        _STRFtokcmp
  501.  
  502. _STRtokcmp    push    d0-d1/a1
  503.         move.l    a0,-(sp)
  504.         tst.b    (a0)
  505.         beq.s    _STRtokcmp.ne
  506. _STRtokcmp1    move.b    (a0)+,d0
  507.         beq.s    _STRtokcmp.eq
  508.         cmp.b    #32,d0
  509.         beq.s    _STRtokcmp.eq
  510.         cmp.b    #9,d0
  511.         beq.s    _STRtokcmp.eq
  512.         cmp.b    #10,d0
  513.         beq.s    _STRtokcmp.eq
  514.         strlib    ucase
  515.         move.b    (a1)+,d1
  516.         beq.s    _STRtokcmp.ne
  517.         cmp.b    #'a',d1
  518.         blo.s    _STRtokcmp.nlc
  519.         cmp.b    #'z',d1
  520.         bhi.s    _STRtokcmp.nlc
  521.         sub.b    #32,d1
  522. _STRtokcmp.nlc    cmp.b    d0,d1
  523.         beq.s    _STRtokcmp1
  524. _STRtokcmp.ne    move.l    (sp)+,a0
  525.         moveq    #1,d0
  526.         bra.s    _STRtokcmp0
  527. _STRtokcmp.eq    tst.b    d0
  528.         bne.s    _STRtokcmp.eq1
  529.         subq.w    #1,a0
  530. _STRtokcmp.eq1    addq.w    #4,sp
  531.         moveq    #0,d0
  532. _STRtokcmp0    pull    d0-d1/a1
  533.         rts
  534.  
  535.         endc
  536.  
  537.  
  538.         ifd        _STRFlistlen
  539.  
  540. _STRlistlen    move.l    a0,-(sp)
  541.         move.l    a0,d0
  542.         moveq    #-1,d1
  543. _STRlistlen1    tst.b    (a0)+
  544.         bne.s    _STRlistlen1
  545.         addq.l    #1,d1
  546.         tst.b    (a0)+
  547.         bne.s    _STRlistlen1
  548.         sub.l    a0,d0
  549.         neg.l    d0
  550.         move.l    (sp)+,a0
  551.         rts
  552.  
  553.         endc
  554.  
  555.  
  556.         ifd        _STRFptrlist
  557.  
  558. _STRptrlist    push    a0/a1/d1
  559.         move.l    d0,d1
  560.         moveq.l    #-1,d0
  561. _STRptrlist1    move.l    a0,(a1)+
  562.         addq.l    #1,d0
  563.         tst.b    (a0)
  564.         beq.s    _STRptrlist3
  565. _STRptrlist2    tst.b    (a0)+
  566.         bne.s    _STRptrlist2
  567.         cmp.l    d1,d0
  568.         blo.s    _STRptrlist1
  569. _STRptrlist3    clr.l    -(a1)
  570.         pull    a0/a1/d1
  571.         tst.l    d0
  572.         rts
  573.  
  574.         endc
  575.  
  576.  
  577.         ifd        _STRFstrlist
  578.  
  579. _STRstrlist    push    a0-a3/d1
  580.         move.l    d0,a3
  581.         add.l    a1,a3
  582.         moveq.l    #0,d0
  583. _STRstrlist1    move.l    (a0)+,a2
  584.         move.l    a2,d1
  585.         beq.s    _STRstrlist0
  586. _STRstrlist2    move.b    (a2)+,(a1)+
  587.         bne.s    _STRstrlist2
  588.         clr.b    (a1)+
  589.         addq.l    #1,d0
  590.         cmp.l    a3,d0
  591.         blo.s    _STRstrlist1
  592. _STRstrlist0    clr.b    (a1)
  593.         pull    a0-a3/d1
  594.         tst.l    d0
  595.         rts
  596.  
  597.         endc
  598.  
  599.  
  600.         ifd        _STRFtsort
  601.  
  602. _STRtsort    push    a0-a3/d0-d2
  603.         move.l    a0,a3
  604. _STRtsort1    move.l    a3,a2
  605.         moveq    #0,d2
  606. _STRtsort2    move.l    (a2)+,d0
  607.         beq.s    _STRtsort3
  608.         move.l    d0,a0
  609.         move.l    (a2),d0
  610.         beq.s    _STRtsort3
  611.         move.l    d0,a1
  612.         strlib    strcmp
  613.         bhs.s    _STRtsort2    ;right order?
  614.         move.l    a0,(a2)        ;no,
  615.         move.l    a1,-4(a2)    ;exc.
  616.         addq.l    #1,d2
  617.         subq.l    #4,a2
  618.         cmp.l    a3,a2
  619.         beq.s    _STRtsort2
  620.         subq.l    #4,a2
  621.         bra.s    _STRtsort2
  622. _STRtsort3    tst.l    d2        ;more rounds?
  623.         bne.s    _STRtsort1
  624.         pull    a0-a3/d0-d2
  625.         rts
  626.  
  627.         endc
  628.  
  629.  
  630.         ifd        _STRFtsorti
  631.  
  632. _STRtsorti    push    a0-a3/d0-d2
  633.         move.l    a0,a3
  634. _STRtsorti1    move.l    a3,a2
  635.         moveq    #0,d2
  636. _STRtsorti2    move.l    (a2)+,d0
  637.         beq.s    _STRtsorti3
  638.         move.l    d0,a0
  639.         move.l    (a2),d0
  640.         beq.s    _STRtsorti3
  641.         move.l    d0,a1
  642.         strlib    strcmpi
  643.         bhs.s    _STRtsorti2    ;right order?
  644.         move.l    a0,(a2)        ;no,
  645.         move.l    a1,-4(a2)    ;exc.
  646.         addq.l    #1,d2
  647.         subq.l    #4,a2
  648.         cmp.l    a3,a2
  649.         beq.s    _STRtsorti2
  650.         subq.l    #4,a2
  651.         bra.s    _STRtsorti2
  652. _STRtsorti3    tst.l    d2        ;more rounds?
  653.         bne.s    _STRtsorti1
  654.         pull    a0-a3/d0-d2
  655.         rts
  656.  
  657.         endc
  658.  
  659.  
  660.         ifd        _STRFfindnth
  661.  
  662. _STRfindnth    push    a0-a2 ;a0=str, a1=list: d0=cnt
  663.         moveq.l    #0,d0
  664. 1$        move.l    a0,a2
  665. 2$        cmpm.b    (a1)+,(a2)+
  666.         bne.s    3$
  667.         tst.b    -1(a1)
  668.         bne.s    2$
  669. 0$        pull    a0-a2
  670.         tst.l    d0
  671.         rts
  672. 3$        subq.w    #1,a1
  673. 31$        tst.b    (a1)+    ; find end
  674.         bne.s    31$
  675. 4$        addq.l    #1,d0
  676.         tst.b    (a1)    ; last?
  677.         bne.s    1$
  678. 5$        moveq.l    #-1,d0    ; not found
  679.         bra.s    0$
  680.  
  681.         endc
  682.  
  683.  
  684.         ifd        _STRFfindtok
  685.  
  686. _STRfindtok    push    a1-a2/d1-d2 ;a0=token, a1=list: d0=cnt
  687.         moveq.l    #0,d2
  688. _STRfindtok1    move.l    a0,a2
  689. _STRfindtok2    move.b    (a2)+,d0
  690.         beq.s    _STRfindtok0    ;end; found
  691.         cmp.b    #32,d0
  692.         beq.s    _STRfindtok0
  693.         cmp.b    #9,d0
  694.         beq.s    _STRfindtok0
  695.         cmp.b    #10,d0
  696.         beq.s    _STRfindtok0
  697.         strlib    ucase
  698.         move.b    (a1)+,d1
  699.         beq.s    _STRfindtok3
  700.         cmp.b    #'a',d1
  701.         blo.s    _STRfindtok.nlc
  702.         cmp.b    #'z',d1
  703.         bhi.s    _STRfindtok.nlc
  704.         sub.b    #32,d1
  705. _STRfindtok.nlc    cmp.b    d0,d1
  706.         bne.s    _STRfindtok3
  707.         tst.b    d1
  708.         bne.s    _STRfindtok2
  709. _STRfindtok0    lea.l    -1(a2),a0
  710. _STRfindtok0b    move.l    d2,d0
  711.         pull    a1-a2/d1-d2
  712.         rts
  713. _STRfindtok3    tst.b    d1    ; skip to next string
  714.         beq.s    _STRfindtok4
  715. _STRfindtok3b    tst.b    (a1)+    ; find end
  716.         bne.s    _STRfindtok3b
  717. _STRfindtok4    addq.l    #1,d2
  718.         tst.b    (a1)    ; last?
  719.         bne.s    _STRfindtok1
  720. _STRfindtok5    moveq.l    #-1,d2    ; not found
  721.         bra.s    _STRfindtok0b
  722.  
  723.         endc
  724.  
  725.  
  726.         ifd        _STRFstrend
  727.  
  728. _STRstrend    tst.b    (a0)+
  729.         bne.s    _STRstrend
  730.         rts
  731.  
  732.         endc
  733.  
  734.  
  735.         ifd        _STRFgetbcpl
  736.  
  737. _STRgetbcpl    push    a0/d0
  738.         moveq    #0,d0
  739.         move.b    (a0)+,d0
  740.         subq.w    #1,d0
  741.         bmi.s    _getbcpl2
  742. _getbcpl1    move.b    (a0)+,(a1)+
  743.         dbf    d0,_getbcpl1
  744. _getbcpl2    clr.b    (a1)
  745.         pull    a0/d0
  746.         rts
  747.  
  748.         endc
  749.  
  750.  
  751.         ifd        _STRFputbcpl
  752.  
  753. _STRputbcpl    push    a0/d0
  754.         move.l    a1,-(sp)
  755.         addq.l    #1,a1
  756.         moveq    #-1,d0
  757. _putbcpl1    addq.b    #1,d0
  758.         move.b    (a0)+,(a1)+
  759.         bne.s    _putbcpl1
  760.         move.l    (sp)+,a1
  761.         move.b    d0,(a1)
  762.         pull    a0/d0
  763.         rts
  764.  
  765.         endc
  766.  
  767.  
  768.         ifd        _STRFpeekword
  769.  
  770. _STRpeekword    move.l    a0,-(sp)
  771.         strlib    getiwordu
  772.         move.l    (sp)+,a0
  773.         tst.l    d0
  774.         rts
  775.  
  776.         endc
  777.  
  778.         ifd        _STRFgetiwordu
  779.  
  780. _STRgetiwordu    strlib    getiword
  781.         moveq    #7,d1
  782.         push    a0
  783.         move.l    a1,a0
  784. _getiwordu1    move.b    (a0),d0
  785.         strlib    ucase
  786.         move.b    d0,(a0)+
  787.         dbf    d1,_getiwordu1
  788.         move.l    (a1),d1
  789.         move.l    4(a1),d0
  790.         bne.s    _getiwordu2
  791.         tst.l    d1
  792. _getiwordu2    pull    a0/a0
  793.         rts
  794.  
  795.         endc
  796.  
  797.  
  798.         ifd        _STRFgetiword
  799.  
  800. _STRgetiword    moveq    #0,d1
  801. _getiword1    move.b    (a0)+,d0
  802.         lea    _getiwordt(pc),a1
  803.         move.l    d1,(a1)
  804.         move.l    d1,4(a1)
  805.         strlib    isalpha
  806.         bne.s    _getiword3
  807.         move.b    d0,7(a1)
  808. _getiword2    move.b    (a0)+,d0
  809.         strlib    isalphanum
  810.         bne.s    _getiword3
  811.         move.b    1(a1),(a1)
  812.         move.b    2(a1),1(a1)
  813.         move.b    3(a1),2(a1)
  814.         move.b    4(a1),3(a1)
  815.         move.b    5(a1),4(a1)
  816.         move.b    6(a1),5(a1)
  817.         move.b    7(a1),6(a1)
  818.         move.b    d0,7(a1)
  819.         tst.b    (a1)
  820.         beq.s    _getiword2
  821.         addq.l    #1,a0
  822. _getiword3    subq.l    #1,a0
  823.         move.l    (a1),d1
  824.         move.l    4(a1),d0
  825.         beq.s    _getiword4
  826.         tst.l    d1
  827. _getiword4    rts
  828. _getiwordt    dc.l    0,0
  829.  
  830.         endc
  831.  
  832.  
  833.         ifd        _STRFisalphanum
  834.  
  835. _STRisalphanum    strlib    isalpha
  836.         beq.s    _isalphanum1
  837.         strlib    isnumeric
  838. _isalphanum1    rts
  839.  
  840.         endc
  841.  
  842.  
  843.         ifd        _STRFisalpha
  844.  
  845. _STRisalpha    cmp.b    #'A',d0
  846.         blo.s    _isalpha1
  847.         cmp.b    #'z',d0
  848.         bhi.s    _isalpha1
  849.         cmp.b    #'a',d0
  850.         bhs.s    _isalpha2
  851.         cmp.b    #'Z',d0
  852.         bhi.s    _isalpha1
  853. _isalpha2    cmp.b    d0,d0
  854. _isalpha1    rts
  855.  
  856.         endc
  857.  
  858.  
  859.         ifd        _STRFisnumeric
  860.  
  861. _STRisnumeric    cmp.b    #'0',d0
  862.         blo.s    _isnumeric1
  863.         cmp.b    #'9',d0
  864.         bhi.s    _isnumeric1
  865.         cmp.b    d0,d0
  866. _isnumeric1    rts
  867.  
  868.         endc
  869.  
  870.  
  871.         ifd        _STRFstrupr
  872.  
  873. _STRstrupr    push    a0
  874. _strupr1    move.b    (a0),d0
  875.         strlib    ucase
  876.         move.b    d0,(a0)+
  877.         bne.s    _strupr1
  878.         pull    a0
  879.         rts
  880.  
  881.         endc
  882.  
  883.  
  884.         ifd        _STRFstrlwr
  885.  
  886. _STRstrlwr    push    a0
  887. _strlwr1    move.b    (a0),d0
  888.         strlib    locase
  889.         move.b    d0,(a0)+
  890.         bne.s    _strlwr1
  891.         pull    a0
  892.         rts
  893.  
  894.         endc
  895.  
  896.  
  897.         ifd        _STRFucase
  898.  
  899. _STRucase    cmp.b    #'a',d0
  900.         blo.s    _ucase1
  901.         cmp.b    #'z',d0
  902.         bhi.s    _ucase1
  903.         sub.b    #32,d0
  904. _ucase1        rts
  905.  
  906.         endc
  907.  
  908.  
  909.         ifd        _STRFlocase
  910.  
  911. _STRlocase    cmp.b    #'A',d0
  912.         blo.s    _locase1
  913.         cmp.b    #'Z',d0
  914.         bhi.s    _locase1
  915.         add.b    #32,d0
  916. _locase1    rts
  917.  
  918.         endc
  919.  
  920.  
  921.         ifd        _STRFstrcpy
  922.  
  923. _STRstrcpy    push    a0-a1
  924. _strcpy1    move.b    (a0)+,(a1)+
  925.         bne.s    _strcpy1
  926.         pull    a0-a1
  927.         rts
  928.  
  929.         endc
  930.  
  931.  
  932.         ifd        _STRFblkcpy
  933.  
  934. _STRblkcpy    move.l    d0,-(sp)
  935.         moveq    #-1,d0
  936.         strlib    blkncpy
  937.         move.l    (sp)+,d0
  938.         rts
  939.  
  940.         endc
  941.  
  942.  
  943.         ifd        _STRFblkncpy
  944.  
  945. _STRblkncpy    push    d1
  946.         move.l    d0,d1
  947.         cmp.b    #34,(a0)
  948.         beq.s    _blkncpy3
  949. _blkncpy1    move.b    (a0)+,d0
  950.         tst.l    d1
  951.         beq.s    _blkncpy1b
  952.         move.b    d0,(a1)+
  953.         subq.l    #1,d1
  954. _blkncpy1b    tst.b    d0
  955.         beq.s    _blkncpy2
  956.         cmp.b    #32,d0
  957.         beq.s    _blkncpy2
  958.         cmp.b    #9,d0
  959.         beq.s    _blkncpy2
  960.         cmp.b    #',',d0
  961.         beq.s    _blkncpy2
  962.         cmp.b    #10,d0
  963.         bne.s    _blkncpy1
  964. _blkncpy2    subq.l    #1,a0
  965.         subq.l    #1,a1
  966. _blkncpy5    tst.l    d1
  967.         beq.s    _blkncpy7
  968.         clr.b    (a1)+
  969.         subq.l    #1,d1
  970. _blkncpy7    move.l    d1,d0
  971.         pull    d1/d1
  972.         rts
  973. _blkncpy3    addq.l    #1,a0
  974. _blkncpy4    move.b    (a0)+,d0
  975.         beq.s    _blkncpy5
  976.         cmp.b    #34,d0
  977.         beq.s    _blkncpy5
  978.         cmp.b    #'*',d0
  979.         bne.s    _blkncpy7i
  980.         move.b    (a0)+,d0
  981.         beq.s    _blkncpy5
  982.         cmp.b    #'n',d0
  983.         beq.s    _blkncpyN
  984.         cmp.b    #'N',d0
  985.         bne.s    _blkncpynN
  986. _blkncpyN    moveq    #10,d0
  987.         bra.s    _blkncpy6
  988. _blkncpynN    cmp.b    #'e',d0
  989.         beq.s    _blkncpyE
  990.         cmp.b    #'E',d0
  991.         bne.s    _blkncpy6
  992. _blkncpyE    moveq    #27,d0
  993. _blkncpy6    cmp.b    #'t',d0
  994.         beq.s    _blkncpyT
  995.         cmp.b    #'T',d0
  996.         bne.s    _blkncpy7i
  997. _blkncpyT    moveq    #9,d0
  998. _blkncpy7i    tst.l    d1
  999.         beq.s    _blkncpy4
  1000.         move.b    d0,(a1)+
  1001.         subq.l    #1,d1
  1002.         bra.s    _blkncpy4
  1003.  
  1004.         endc
  1005.  
  1006.  
  1007.         ifd        _STRFstrscmp
  1008.  
  1009. _STRstrscmp    push    a0-a1/d0
  1010. _strscmp1    move.b    (a0)+,d0
  1011.         cmp.b    (a1)+,d1
  1012.         bne.s    _strscmp2
  1013.         tst.b    d0
  1014.         bne.s    _strscmp1
  1015. _strscmp2    pull    a0-a1/d0
  1016.         rts
  1017.  
  1018.         endc
  1019.  
  1020.  
  1021.         ifd        _STRFstrscmpi
  1022.  
  1023. _STRstrscmpi    push    a0-a1/d0-d1
  1024. _strscmpi1    move.b    (a0)+,d0
  1025.         move.b    (a1)+,d1
  1026.         cmp.b    #'A',d0
  1027.         blo.s    _strscmpi3
  1028.         cmp.b    #'Z',d0
  1029.         bhi.s    _strscmpi3
  1030.         add.b    #$20,d0
  1031. _strscmpi3    cmp.b    #'A',d1
  1032.         blo.s    _strscmpi4
  1033.         cmp.b    #'Z',d1
  1034.         bhi.s    _strscmpi4
  1035.         add.b    #$20,d1
  1036. _strscmpi4    cmp.b    d1,d0
  1037.         bne.s    _strscmpi2
  1038.         tst.b    d0
  1039.         bne.s    _strscmpi1
  1040. _strscmpi2    pull    a0-a1/d0-d1
  1041.         rts
  1042.  
  1043.         endc
  1044.  
  1045.  
  1046.         ifd        _STRFskipblk
  1047.  
  1048. _STRskipblk    moveq    #0,d0
  1049. _sskipblk1    cmp.b    #32,(a0)
  1050.         beq.s    _sskipblk2
  1051.         cmp.b    #10,(a0)
  1052.         beq.s    _sskipblk2
  1053.         cmp.b    #9,(a0)
  1054.         beq.s    _sskipblk2
  1055.         rts
  1056. _sskipblk2    addq.l    #1,a0
  1057.         addq.l    #1,d0
  1058.         bra    _sskipblk1
  1059.  
  1060.         endc
  1061.  
  1062.  
  1063.         ifd        _STRFisblank
  1064.  
  1065. _STRisblank    cmp.b    #32,d0
  1066.         beq.s    _isblank1
  1067.         cmp.b    #10,d0
  1068.         beq.s    _isblank1
  1069.         cmp.b    #9,d0
  1070. _isblank1    rts
  1071.  
  1072.         endc
  1073.  
  1074.  
  1075.         ifd        _STRFsblk
  1076.  
  1077. _STRsblk    move.w    d0,-(sp)
  1078. _STRsblk1    move.b    (a0)+,d0
  1079.         cmp.b    #32,d0
  1080.         beq.s    _STRsblk1
  1081.         cmp.b    #10,d0
  1082.         beq.s    _STRsblk1
  1083.         cmp.b    #9,d0
  1084.         beq.s    _STRsblk1
  1085.         move.w    (sp)+,d0
  1086.         subq.w    #1,a0
  1087.         rts
  1088.  
  1089.         endc
  1090.  
  1091.  
  1092.         ifd        _STRFstrlen
  1093.  
  1094. _STRstrlen    move.l    a0,d0
  1095. _strlen1    tst.b    (a0)+
  1096.         bne.s    _strlen1
  1097.         sub.l    a0,d0
  1098.         addq.l    #1,d0
  1099.         neg.l    d0
  1100.         rts
  1101.  
  1102.         endc
  1103.  
  1104.  
  1105.         ifd       _STRFstrnth
  1106.  
  1107. _STRstrnth1    tst.b    (a0)+
  1108.         bne.s    _STRstrnth1
  1109. _STRstrnth    dbf    d0,_STRstrnth1
  1110.         rts
  1111.  
  1112.         endc
  1113.  
  1114.  
  1115.         ifd       _STRFstrcmp
  1116.  
  1117. _STRstrcmp    push    a0-a1/d0-d1
  1118. _strcmp1    move.b    (a0)+,d0    cmp str(a0),str(a1)
  1119.         beq.s    _strcmpe1
  1120.         move.b    (a1)+,d1
  1121.         beq.s    _strcmpe2
  1122.         cmp.b    d0,d1
  1123.         beq.s    _strcmp1
  1124. _strcmpe    pull    a0-a1/d0-d1
  1125.         rts
  1126. _strcmpe1    tst.b    (a1)+
  1127.         beq.s    _strcmpe
  1128.         moveq.l    #1,d0
  1129.         bra.s    _strcmpe
  1130. _strcmpe2    moveq.l    #-1,d0
  1131.         bra.s    _strcmpe
  1132.  
  1133.         endc
  1134.  
  1135.  
  1136.         ifd       _STRFstrcmpi
  1137.  
  1138. _STRstrcmpi    push    a0-a1/d0-d1
  1139. _strcmpi1    move.b    (a0)+,d0    cmp str(a0),str(a1)
  1140.         beq.s    _strcmpie1
  1141.         cmp.b    #'A',d0
  1142.         blo.s    _strcmpi1a
  1143.         cmp.b    #'Z',d0
  1144.         bhi.s    _strcmpi1a
  1145.         add.b    #32,d0
  1146. _strcmpi1a    move.b    (a1)+,d1
  1147.         beq.s    _strcmpie2
  1148.         cmp.b    #'A',d1
  1149.         blo.s    _strcmpi1b
  1150.         cmp.b    #'Z',d1
  1151.         bhi.s    _strcmpi1b
  1152.         add.b    #32,d1
  1153. _strcmpi1b    cmp.b    d0,d1
  1154.         beq.s    _strcmpi1
  1155. _strcmpie    pull    a0-a1/d0-d1
  1156.         rts
  1157. _strcmpie1    tst.b    (a1)+
  1158.         beq.s    _strcmpie
  1159.         moveq.l    #1,d0
  1160.         bra.s    _strcmpie
  1161. _strcmpie2    moveq.l    #-1,d0
  1162.         bra.s    _strcmpie
  1163.  
  1164.         endc
  1165.  
  1166.  
  1167.         ifd        _STRFstable
  1168.  
  1169. _STRstable    push    a1-a2/d0-d2
  1170.         move.l    a0,a2        ;a0=string, a1=list, d0=modulo
  1171.         move.l    d0,d2
  1172. _stable1    move.l    a2,a0        ;restore string pointer
  1173.         tst.b    (a1)
  1174.         beq.s    _stable5    ;end of table?
  1175. _stable2    cmpm.b    (a0)+,(a1)+
  1176.         bne.s    _stable3    ;difference found
  1177.         tst.b    -1(a0)
  1178.         bne.s    _stable2    ;end of string?
  1179.         move.l    a1,a0        ;return data pointer
  1180. _stable0    move.l    a0,d0        ;data ptr in a0, =0 if not fnd
  1181.         pull    a1-a2/d0-d2
  1182.         rts
  1183. _stable3    subq.w    #1,a1
  1184. _stable4    tst.b    (a1)+
  1185.         bne.s    _stable4
  1186.         add.l    d2,a1        ;add modulo
  1187.         bra.s    _stable1    ;next string
  1188. _stable5    sub.l    a0,a0        ;string not found
  1189.         bra.s    _stable0
  1190.  
  1191.         endc
  1192.  
  1193.  
  1194.         ifd    _STRFaddslash
  1195.  
  1196. _STRaddslash    tst.b    (a0)+
  1197.         bne.s    _STRaddslash
  1198.         subq.w    #2,a0
  1199.         cmp.b    #':',(a0)
  1200.         beq.s    _addslash2
  1201.         cmp.b    #'/',(a0)+
  1202.         beq.s    _addslash3
  1203.         move.b    #'/',(a0)+
  1204.         clr.b    (a0)
  1205.         rts
  1206. _addslash2    addq.w    #1,a0
  1207. _addslash3    rts
  1208.  
  1209.         endc
  1210.  
  1211.  
  1212.         ifd    _STRFchkslash
  1213.  
  1214. _STRchkslash    move.l    a0,-(sp)
  1215. _chkslash1    tst.b    (a0)+
  1216.         bne.s    _chkslash1
  1217.         subq.w    #2,a0
  1218.         cmp.b    #':',(a0)
  1219.         beq.s    _chkslash2
  1220.         cmp.b    #'/',(a0)
  1221.         beq.s    _chkslash2
  1222.         cmp.b    d0,d0        ;EQ
  1223.         move.l    (sp)+,a0
  1224.         rts
  1225. _chkslash2    cmp.b    #'.',(a0)    ;NE
  1226.         move.l    (sp)+,a0
  1227.         rts
  1228.  
  1229.         endc
  1230.  
  1231.  
  1232.         ifd    _STRFremslash
  1233.  
  1234. _STRremslash    tst.b    (a0)+
  1235.         bne.s    _STRremslash
  1236.         subq.w    #2,a0
  1237.         cmp.b    #'/',(a0)+
  1238.         bne.s    _remslash1
  1239.         clr.b    -(a0)
  1240. _remslash1    rts
  1241.  
  1242.         endc
  1243.  
  1244.  
  1245.         ifd    _STRFextfname
  1246.  
  1247. _STRextfname    push    d0/a1
  1248.         move.l    a0,a1
  1249. _extfname1    tst.b    (a0)+
  1250.         bne.s    _extfname1
  1251. _extfname2    move.b    -(a0),d0
  1252.         cmp.b    #':',d0
  1253.         beq.s    _extfname3
  1254.         cmp.b    #'/',d0
  1255.         beq.s    _extfname3
  1256.         cmp.l    a0,a1
  1257.         bne.s    _extfname2
  1258.         subq.w    #1,a0
  1259. _extfname3    addq.w    #1,a0
  1260.         pull    d0/a1
  1261.         rts
  1262.  
  1263.         endc
  1264.  
  1265.  
  1266.         ifd    _STRFremsuffix
  1267.  
  1268. _STRremsuffix    push    a1-a2        a0=string
  1269.         move.l    a0,a1
  1270. 1$        tst.b    (a0)+
  1271.         bne.s    1$
  1272.         lea    -1(a0),a2    end NULL of string
  1273. 2$        cmpi.b    #'.',-(a0)
  1274.         beq.s    3$
  1275.         cmp.l    a1,a0
  1276.         bhi.s    2$
  1277.         move.l    a2,a0        no suffix found
  1278. 3$        clr.b    (a0)
  1279.         pull    a1-a2
  1280.         rts
  1281.  
  1282.         endc
  1283.  
  1284.  
  1285.         ifd    _STRFaddsuffix
  1286.  
  1287. _STRaddsuffix    push    d0        a1=dest; a0=suffix
  1288. 10$        move.b    (a1)+,d0
  1289.         beq.s    11$
  1290.         cmp.b    #'.',d0
  1291.         bne.s    10$
  1292. 11$        move.b    #'.',-1(a1)
  1293. 12$        move.b    (a0)+,(a1)+
  1294.         bne.s    12$
  1295.         pull    d0
  1296.         rts
  1297.  
  1298.         endc
  1299.  
  1300.  
  1301.     endm
  1302.  
  1303.