home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / FILENAME.I < prev    next >
Encoding:
Text File  |  1994-03-29  |  11.8 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE FileNames;
  2. ⓪ (*$Y+, L-*)
  3. ⓪ 
  4. ⓪ (*
  5. ⓪!03.12.90  Fehler bei SplitName behoben, so daß nun kein Fehler mehr mit
  6. ⓪+68020 passieren dürfte. (D0 war bei CopyA0OnStack-Aufruf um
  7. ⓪+eins zu hoch, was ggf. ein Byte zuviel kopierte und damit den
  8. ⓪+Stack überschrieb).
  9. ⓪!31.01.91  ValidatePath verwendet "fileUpper" statt Strings.Upper
  10. ⓪!29.03.93  StrToDrv erlaubt nun Drives v. A-Z (bisher A-P)
  11. ⓪ *)
  12. ⓪ 
  13. ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;
  14. ⓪ IMPORT Strings;
  15. ⓪ FROM MOSGlobals IMPORT FileStr, PathStr, DriveStr, NameStr, SfxStr, PfxStr,
  16. ⓪(OutOfStack, StringOverflow, fNotDeleted, fPathNotFound, fFileNotFound,
  17. ⓪(Drive, DriveSet;
  18. ⓪ 
  19. ⓪ CONST drvZ = 26;
  20. ⓪ 
  21. ⓪ VAR strok: BOOLEAN;
  22. ⓪ 
  23. ⓪ 
  24. ⓪ PROCEDURE fileUpper (VAR s: ARRAY OF CHAR);
  25. ⓪"(* "Upper" für Dateinamen: berücksichtigt nur die unteren 128 Zeichen *)
  26. ⓪"VAR n: CARDINAL;
  27. ⓪"BEGIN
  28. ⓪$(*
  29. ⓪$FOR n:= 0 TO HIGH (s) DO
  30. ⓪&IF s[n]='' THEN RETURN END;
  31. ⓪&IF s[n]<CHR(128) THEN s[n]:=CAP(s[n]) END
  32. ⓪$END
  33. ⓪$*)
  34. ⓪$ASSEMBLER
  35. ⓪(MOVE.W  -(A3),D1
  36. ⓪(MOVE.L  -(A3),A1
  37. ⓪(CLR.W   D0
  38. ⓪&luup:
  39. ⓪(MOVE.B  (A1)+,D0
  40. ⓪(BEQ     ende
  41. ⓪(BMI     next
  42. ⓪(JSR     @CAP    ;/A2
  43. ⓪(MOVE.B  D0,-1(A1)
  44. ⓪&next:
  45. ⓪(DBRA    D1,luup
  46. ⓪&ende:
  47. ⓪$END
  48. ⓪"END fileUpper;
  49. ⓪ 
  50. ⓪ 
  51. ⓪ PROCEDURE copyA0OnStack;
  52. ⓪"(*
  53. ⓪#* Kopiert String in A0/D0.W auf Stack und korrigiert A0
  54. ⓪#*)
  55. ⓪"BEGIN
  56. ⓪$ASSEMBLER
  57. ⓪(MOVE.L  (A7)+,(A3)+     ; Rücksprung-Adr retten
  58. ⓪(MOVE.L  A1,(A3)+        ; A1 retten
  59. ⓪(MOVE.W  D0,(A3)+        ; D0 retten
  60. ⓪(ADDQ    #2,D0           ; wichtig: es muß mind. -2- sein!
  61. ⓪(BCLR    #0,D0           ; SYNC D0
  62. ⓪(SUBA.W  D0,A7
  63. ⓪(CMPA.L  A3,A7
  64. ⓪(BCC     N
  65. ⓪(TRAP    #6
  66. ⓪(DC.W    OutOfStack
  67. ⓪&N MOVE.L  A7,A1
  68. ⓪(MOVE.W  -2(A3),D0
  69. ⓪&L MOVE.B  (A0)+,(A1)+
  70. ⓪(DBEQ    D0,L
  71. ⓪(MOVE.L  A7,A0
  72. ⓪(MOVE.W  -(A3),D0
  73. ⓪(MOVE.L  -(A3),A1
  74. ⓪(MOVE.L  -(A3),-(A7)     ; und Rücksprung
  75. ⓪$END
  76. ⓪"END copyA0OnStack;
  77. ⓪ 
  78. ⓪ PROCEDURE ConcatName (REF prefix, suffix: ARRAY OF CHAR; VAR name: ARRAY OF CHAR);
  79. ⓪"(*$L+*)
  80. ⓪"VAR s1, s2: SfxStr; n1: NameStr; app: BOOLEAN;
  81. ⓪"BEGIN
  82. ⓪$(* aufpassen, da 'prefix'/'suffix' mit 'name' identisch sein können! *)
  83. ⓪$app:= suffix[0] # 0C;
  84. ⓪$IF app THEN
  85. ⓪&Strings.Copy (suffix, Strings.Pos ('.', suffix, 0) + 1, 3, s1, strok);
  86. ⓪$END;
  87. ⓪$SplitPath (prefix, name, n1);
  88. ⓪$SplitName (n1, n1, s2);
  89. ⓪$Strings.Append (n1, name, strok);
  90. ⓪$IF app THEN
  91. ⓪&Strings.Append ('.', name, strok);
  92. ⓪&Strings.Append (s1, name, strok);
  93. ⓪$END;
  94. ⓪"END ConcatName;
  95. ⓪"(*$L=*)
  96. ⓪ 
  97. ⓪ PROCEDURE ConcatPath (REF path, name: ARRAY OF CHAR; VAR fullname: ARRAY OF CHAR);
  98. ⓪"(*$L+*)
  99. ⓪"VAR p1: PathStr; n2, n1: NameStr;
  100. ⓪"BEGIN
  101. ⓪$(* aufpassen, da 'path'/'name' mit 'fullName' identisch sein können! *)
  102. ⓪$SplitPath (name, p1, n1);
  103. ⓪$SplitPath (path, fullname, n2);
  104. ⓪$Strings.Append (n1, fullname, strok);
  105. ⓪"END ConcatPath;
  106. ⓪"(*$L=*)
  107. ⓪ 
  108. ⓪ PROCEDURE NameConc ( REF prefix, suffix: ARRAY OF CHAR ): FileStr;
  109. ⓪"(*$L+*)
  110. ⓪"VAR n1: FileStr;
  111. ⓪"BEGIN
  112. ⓪$ConcatName (prefix, suffix, n1);
  113. ⓪$RETURN n1
  114. ⓪"END NameConc;
  115. ⓪"(*$L=*)
  116. ⓪ 
  117. ⓪ PROCEDURE PathConc ( REF path, name: ARRAY OF CHAR ): FileStr;
  118. ⓪"(*$L+*)
  119. ⓪"VAR p1: FileStr;
  120. ⓪"BEGIN
  121. ⓪$ConcatPath (path, name, p1);
  122. ⓪$RETURN p1
  123. ⓪"END PathConc;
  124. ⓪"(*$L=*)
  125. ⓪ 
  126. ⓪ PROCEDURE SplitName ( REF source: ARRAY OF CHAR; VAR prfx, sfx: ARRAY OF CHAR );
  127. ⓪"BEGIN
  128. ⓪$ASSEMBLER
  129. ⓪(LINK    A5,#0
  130. ⓪(
  131. ⓪(MOVE    -(A3),D2
  132. ⓪(MOVE.L  -(A3),A2        ; sfx
  133. ⓪(MOVE    -(A3),D1
  134. ⓪(MOVE.L  -(A3),A1        ; prfx
  135. ⓪(MOVE    -(A3),D0
  136. ⓪(MOVE.L  -(A3),A0        ; source
  137. ⓪(
  138. ⓪(CMPA.L  A2,A0
  139. ⓪(BNE     a2NotEqu
  140. ⓪(JSR     copyA0OnStack
  141. ⓪(BRA     a1NotEqu
  142. ⓪&a2NotEqu
  143. ⓪(CMPA.L  A1,A0
  144. ⓪(BNE     a1NotEqu
  145. ⓪(JSR     copyA0OnStack
  146. ⓪&a1NotEqu
  147. ⓪(
  148. ⓪(ADDQ    #1,D0
  149. ⓪(MOVE    D3,-(A7)
  150. ⓪(
  151. ⓪(; Fehler melden, wenn 'prfx' zu klein
  152. ⓪(CMPI    #7,D1
  153. ⓪(BEQ     OK1
  154. ⓪(BHI     OK2
  155. ⓪(TRAP    #6
  156. ⓪(DC.W    StringOverflow-$4000        ; callerCaused
  157. ⓪(ADDQ    #1,D1
  158. ⓪(BRA     OK3
  159. ⓪&OK2:
  160. ⓪(CLR.B   8(A1)
  161. ⓪&OK1:
  162. ⓪(MOVEQ   #8,D1
  163. ⓪&OK3:
  164. ⓪(
  165. ⓪(; Fehler melden, wenn 'sfx' zu klein
  166. ⓪(CMPI    #2,D2
  167. ⓪(BEQ     OK4
  168. ⓪(BHI     OK5
  169. ⓪(TRAP    #6
  170. ⓪(DC.W    StringOverflow
  171. ⓪(ADDQ    #1,D2
  172. ⓪(BRA     OK6
  173. ⓪&OK5:
  174. ⓪(CLR.B   3(A2)
  175. ⓪&OK4:
  176. ⓪(MOVEQ   #3,D2
  177. ⓪&OK6:
  178. ⓪(
  179. ⓪&L1:
  180. ⓪(SUBQ    #1,D0
  181. ⓪(BCS     EMPTY
  182. ⓪(MOVE.B  (A0)+,D3
  183. ⓪(BEQ     EMPTY
  184. ⓪(CMPI.B  #'.',D3
  185. ⓪(BEQ     POINT
  186. ⓪(SUBQ    #1,D1
  187. ⓪(BMI     L1
  188. ⓪(MOVE.B  D3,(A1)+
  189. ⓪(BRA     L1
  190. ⓪(
  191. ⓪&POINT:
  192. ⓪(SUBQ    #1,D0
  193. ⓪(BCS     EMPTY
  194. ⓪(MOVE.B  (A0)+,D3
  195. ⓪(BEQ     EMPTY
  196. ⓪(SUBQ    #1,D2
  197. ⓪(BCS     EMPTY
  198. ⓪(MOVE.B  D3,(A2)+
  199. ⓪(BRA     POINT
  200. ⓪(
  201. ⓪&EMPTY:
  202. ⓪(TST     D1
  203. ⓪(BLE     EM1
  204. ⓪(CLR.B   (A1)
  205. ⓪&EM1:
  206. ⓪(TST     D2
  207. ⓪(BLE     EM2
  208. ⓪(CLR.B   (A2)
  209. ⓪&EM2:
  210. ⓪(
  211. ⓪(MOVE    (A7)+,D3
  212. ⓪(UNLK    A5
  213. ⓪$END
  214. ⓪"END SplitName;
  215. ⓪ 
  216. ⓪ PROCEDURE SplitPath ( REF source: ARRAY OF CHAR; VAR path, name: ARRAY OF CHAR );
  217. ⓪"BEGIN
  218. ⓪$ASSEMBLER
  219. ⓪(LINK    A5,#0
  220. ⓪(
  221. ⓪(MOVE.L  -18(A3),A0      ; ADR (source)
  222. ⓪(MOVE.L  A0,A1
  223. ⓪(MOVE.W  -14(A3),D0      ; HIGH (source)
  224. ⓪(MOVE.W  D0,D2
  225. ⓪(
  226. ⓪(MOVE.L  A1,D1
  227. ⓪ len     TST.B   (A1)+
  228. ⓪(DBEQ    D2,len
  229. ⓪(BNE     cle
  230. ⓪(SUBQ.L  #1,A1
  231. ⓪ cle     SUBA.L  D1,A1
  232. ⓪(MOVE.W  A1,D1
  233. ⓪(BEQ     ende0
  234. ⓪(
  235. ⓪&lupo:
  236. ⓪(MOVE.B  -1(A0,D1.W),D2
  237. ⓪(CMPI.B  #':',D2
  238. ⓪(BEQ     ende0
  239. ⓪(CMPI.B  #'\',D2
  240. ⓪(BEQ     ende0
  241. ⓪(SUBQ    #1,D1
  242. ⓪(BNE     lupo
  243. ⓪&ende0:
  244. ⓪(
  245. ⓪(MOVE.L  -12(A3),A1      ; ADR (path)
  246. ⓪(MOVE.L  -06(A3),A2      ; ADR (name)
  247. ⓪(
  248. ⓪(CMPA.L  A2,A0
  249. ⓪(BNE     a2NotEqu
  250. ⓪(JSR     copyA0OnStack
  251. ⓪(BRA     a1NotEqu
  252. ⓪&a2NotEqu
  253. ⓪(CMPA.L  A1,A0
  254. ⓪(BNE     a1NotEqu
  255. ⓪(JSR     copyA0OnStack
  256. ⓪&a1NotEqu
  257. ⓪(
  258. ⓪(CLR.B   (A1)
  259. ⓪(CLR.B   (A2)
  260. ⓪(
  261. ⓪(MOVEM.L D3-D7,-(A7)
  262. ⓪(
  263. ⓪(MOVE.W  -08(A3),D5      ; HIGH (path)
  264. ⓪(MOVE.W  -(A3),D6        ; HIGH (name)
  265. ⓪(SUBA.W  #16,A3
  266. ⓪(
  267. ⓪(MOVE    #1,-(A7)        ; Flag: Bisher kein Überlauf
  268. ⓪(
  269. ⓪(MOVEQ   #0,D2           ; source-counter
  270. ⓪ l       CMP     D1,D2           ; pos erreicht ?
  271. ⓪(BGE     scnd
  272. ⓪(CMP     D0,D2           ; source geleert ?
  273. ⓪(BHI     err             ; ja.
  274. ⓪(CMP     D5,D2
  275. ⓪(BHI     full
  276. ⓪(MOVE.B  (A0)+,(A1)+
  277. ⓪ c       BEQ     err2
  278. ⓪(ADDQ    #1,D2
  279. ⓪(BRA     l
  280. ⓪(
  281. ⓪ full    CLR     (A7)
  282. ⓪(TST.B   (A0)+
  283. ⓪(BRA     c
  284. ⓪(
  285. ⓪ full2   TST     D7
  286. ⓪(BNE     full3
  287. ⓪(TST     D3
  288. ⓪(BNE     ende
  289. ⓪ full3   TST.B   (A0)+
  290. ⓪(BEQ     ende
  291. ⓪(
  292. ⓪ err     CMP     D5,D2
  293. ⓪(BHI     err2
  294. ⓪(CLR.B   (A1)+           ; Endemarke bei dest1 setzen
  295. ⓪(
  296. ⓪ err2    CLR     (A7)
  297. ⓪(BRA     ende
  298. ⓪(
  299. ⓪ scnd    CMP     D5,D2
  300. ⓪(BHI     scnd0
  301. ⓪(CLR.B   (A1)+           ; Endemarke bei dest1 setzen
  302. ⓪ scnd0   MOVEQ   #0,D4
  303. ⓪(MOVEQ   #0,D3           ; Flag f. prefix/suffix
  304. ⓪(MOVEQ   #8,D7
  305. ⓪ l2      CMP     D6,D4           ; dest2 voll ?
  306. ⓪(BHI     full2
  307. ⓪(MOVE.B  (A0)+,D1
  308. ⓪(BEQ     ende2
  309. ⓪(CMPI.B  #'.',D1
  310. ⓪(BNE     l22
  311. ⓪(MOVEQ   #0,D7
  312. ⓪(TST     D3
  313. ⓪(BNE     l22
  314. ⓪(MOVEQ   #1,D3
  315. ⓪(MOVEQ   #4,D7
  316. ⓪ l22     TST     D7
  317. ⓪(BEQ     l21
  318. ⓪(SUBQ    #1,D7
  319. ⓪(MOVE.B  D1,(A2)+
  320. ⓪(ADDQ    #1,D4
  321. ⓪ l21     ADDQ    #1,D2
  322. ⓪(CMP     D0,D2
  323. ⓪(BLS     l2
  324. ⓪ ende2   CMP     D6,D4
  325. ⓪(BHI     ende
  326. ⓪(CLR.B   (A2)+           ; Endemarke bei dest2 setzen
  327. ⓪ ende
  328. ⓪(TST.W   (A7)+
  329. ⓪(BNE     ok
  330. ⓪(TRAP    #6
  331. ⓪(DC.W    StringOverflow
  332. ⓪&ok:
  333. ⓪(MOVEM.L (A7)+,D3-D7
  334. ⓪(UNLK    A5
  335. ⓪$END
  336. ⓪"END SplitPath;
  337. ⓪ 
  338. ⓪ PROCEDURE FileName   ( REF filename: ARRAY OF CHAR ): NameStr;
  339. ⓪"(*$L+*)
  340. ⓪"VAR path: PathStr; name: NameStr;
  341. ⓪"BEGIN
  342. ⓪$SplitPath (filename, path, name);
  343. ⓪$RETURN name
  344. ⓪"END FileName;
  345. ⓪"(*$L=*)
  346. ⓪ 
  347. ⓪ PROCEDURE FilePath   ( REF filename: ARRAY OF CHAR ): PathStr;
  348. ⓪"(*$L+*)
  349. ⓪"VAR path: PathStr; name: NameStr;
  350. ⓪"BEGIN
  351. ⓪$SplitPath (filename, path, name);
  352. ⓪$RETURN path
  353. ⓪"END FilePath;
  354. ⓪"(*$L=*)
  355. ⓪ 
  356. ⓪ PROCEDURE FilePrefix ( REF filename: ARRAY OF CHAR ): PfxStr;
  357. ⓪"(*$L+*)
  358. ⓪"VAR path: PathStr; name: NameStr; pfx: PfxStr; sfx: SfxStr;
  359. ⓪"BEGIN
  360. ⓪$SplitPath (filename, path, name);
  361. ⓪$SplitName (name, pfx, sfx);
  362. ⓪$RETURN pfx
  363. ⓪"END FilePrefix;
  364. ⓪"(*$L=*)
  365. ⓪ 
  366. ⓪ PROCEDURE FileSuffix ( REF filename: ARRAY OF CHAR ): SfxStr;
  367. ⓪"(*$L+*)
  368. ⓪"VAR path: PathStr; name: NameStr; pfx: PfxStr; sfx: SfxStr;
  369. ⓪"BEGIN
  370. ⓪$SplitPath (filename, path, name);
  371. ⓪$SplitName (name, pfx, sfx);
  372. ⓪$RETURN sfx
  373. ⓪"END FileSuffix;
  374. ⓪"(*$L=*)
  375. ⓪ 
  376. ⓪ PROCEDURE DriveToStr ( driveNo: Drive ): DriveStr;
  377. ⓪"BEGIN
  378. ⓪$ASSEMBLER
  379. ⓪(MOVE    -(A3),D0
  380. ⓪(BEQ     DFT
  381. ⓪(ADDI.B  #$40,D0
  382. ⓪(MOVE.B  D0,(A3)+
  383. ⓪(MOVE.B  #':',(A3)+
  384. ⓪(RTS
  385. ⓪&DFT:
  386. ⓪(CLR     (A3)+
  387. ⓪$END
  388. ⓪"END DriveToStr;
  389. ⓪ 
  390. ⓪ PROCEDURE StrToDrive ( REF driveStr: ARRAY OF CHAR ): Drive;
  391. ⓪"BEGIN
  392. ⓪$ASSEMBLER
  393. ⓪(CLR     D0
  394. ⓪(TST.W   -(A3)
  395. ⓪(MOVE.L  -(A3),A0
  396. ⓪(BEQ     DFT
  397. ⓪(TST.B   (A0)
  398. ⓪(BEQ     DFT
  399. ⓪(CMPI.B  #':',1(A0)
  400. ⓪(BNE     DFT
  401. ⓪(MOVE.B  (A0),D0
  402. ⓪(CMPI.B  #'Z',D0
  403. ⓪(BLS     nolower
  404. ⓪(SUBI.B  #32,D0  ; change to lower case
  405. ⓪&nolower
  406. ⓪(SUBI.B  #'A',D0
  407. ⓪(BCS     err
  408. ⓪(ADDQ    #1,D0
  409. ⓪(CMPI.W  #drvZ,D0
  410. ⓪(BLS     DFT
  411. ⓪&err
  412. ⓪(CLR     D0
  413. ⓪&DFT:
  414. ⓪(MOVE    D0,(A3)+
  415. ⓪$END
  416. ⓪"END StrToDrive;
  417. ⓪ 
  418. ⓪ PROCEDURE ValidatePath ( VAR path: ARRAY OF CHAR );
  419. ⓪"BEGIN
  420. ⓪$ASSEMBLER
  421. ⓪(MOVE.L  -6(A3),-(A7)
  422. ⓪(MOVE.W  -2(A3),-(A7)
  423. ⓪(JSR     fileUpper
  424. ⓪(MOVE.W  (A7)+,D0
  425. ⓪(MOVE.L  (A7)+,A0
  426. ⓪(TST.B   (A0)
  427. ⓪(BEQ     e
  428. ⓪&l TST.B   (A0)+
  429. ⓪(DBEQ    D0,l
  430. ⓪(BNE     a
  431. ⓪(SUBQ.L  #1,A0
  432. ⓪&a SUBQ.L  #1,A0
  433. ⓪(CMPI.B  #':',(A0)
  434. ⓪(BEQ     e
  435. ⓪(CMPI.B  #'\',(A0)
  436. ⓪(BEQ     e
  437. ⓪(TST.W   D0
  438. ⓪(BPL     o
  439. ⓪(; string ist schon voll!
  440. ⓪(TRAP    #6
  441. ⓪(DC.W    StringOverflow
  442. ⓪(BRA     e
  443. ⓪&o BEQ     f
  444. ⓪(CLR.B   2(A0)           ; wenn mit '\' nicht voll, NUL-Zeichen dran
  445. ⓪&f MOVE.B  #'\',1(A0)
  446. ⓪&e
  447. ⓪$END
  448. ⓪"END ValidatePath;
  449. ⓪"
  450. ⓪ PROCEDURE PathValidated ( REF path: ARRAY OF CHAR ): PathStr;
  451. ⓪"(*$L+*)
  452. ⓪"VAR newpath: PathStr; ok: BOOLEAN;
  453. ⓪"BEGIN
  454. ⓪$Strings.Assign (path, newpath, ok);
  455. ⓪$ValidatePath (newpath);
  456. ⓪$RETURN newpath
  457. ⓪"END PathValidated;
  458. ⓪"(*$L=*)
  459. ⓪ 
  460. ⓪ 
  461. ⓪ PROCEDURE NameUnique ( REF fileName: ARRAY OF CHAR ): BOOLEAN;
  462. ⓪"BEGIN
  463. ⓪$ASSEMBLER
  464. ⓪(MOVE.W  -(A3),D0
  465. ⓪(MOVE.L  -(A3),A0
  466. ⓪(MOVEQ   #'?',D1
  467. ⓪(MOVEQ   #'*',D2
  468. ⓪&L TST.B   (A0)
  469. ⓪(BEQ     T
  470. ⓪(CMP.B   (A0),D1
  471. ⓪(BEQ     F
  472. ⓪(CMP.B   (A0)+,D2
  473. ⓪(BEQ     F
  474. ⓪(DBRA    D0,L
  475. ⓪&T MOVE    #1,(A3)+
  476. ⓪(RTS
  477. ⓪&F CLR     (A3)+
  478. ⓪$END
  479. ⓪"END NameUnique;
  480. ⓪ 
  481. ⓪ 
  482. ⓪ PROCEDURE NameMatching ( REF fileName, wildcard: ARRAY OF CHAR ): BOOLEAN;
  483. ⓪"BEGIN
  484. ⓪$ASSEMBLER
  485. ⓪((*
  486. ⓪*MOVE.W  -(A3),D1
  487. ⓪*MOVE.L  -(A3),A1        ; A1: wildcard
  488. ⓪*MOVE.W  -(A3),D0
  489. ⓪*MOVE.L  -(A3),A0        ; A0: filename
  490. ⓪*TST.B   4(A0)
  491. ⓪*BEQ     F               ; leerer filename ergibt FALSE
  492. ⓪(*)
  493. ⓪(LINK    A5,#0
  494. ⓪ 
  495. ⓪(MOVE.L  -12(A3),(A3)+
  496. ⓪(MOVE.W  -08(A3),(A3)+
  497. ⓪(JSR     fileUpper
  498. ⓪(MOVE.L  -06(A3),(A3)+
  499. ⓪(MOVE.W  -02(A3),(A3)+
  500. ⓪(JSR     fileUpper
  501. ⓪ 
  502. ⓪(MOVE.L  -12(A3),A0
  503. ⓪(TST.B   (A0)
  504. ⓪(BEQ.W   F               ; leerer filename ergibt FALSE
  505. ⓪ 
  506. ⓪(BRA     C0
  507. ⓪ 
  508. ⓪%U0 ; Strings auf Stack löschen!
  509. ⓪(MOVE.L  (A7)+,D0
  510. ⓪(CLR.L   -(A7)
  511. ⓪(CLR.L   -(A7)
  512. ⓪(CLR.W   -(A7)
  513. ⓪(MOVE.L  A7,(A3)+        ; VAR pfx
  514. ⓪(MOVE    #8,(A3)+
  515. ⓪(CLR.L   -(A7)
  516. ⓪(MOVE.L  A7,(A3)+        ; VAR sfx
  517. ⓪(MOVE    #3,(A3)+
  518. ⓪(MOVE.L  D0,-(A7)
  519. ⓪(JMP     SplitName
  520. ⓪ 
  521. ⓪%C0 BSR     U0
  522. ⓪(BSR     U0
  523. ⓪(; Stack (alle Strings Null-terminiert):
  524. ⓪(;  0(A7): sfx(filename)
  525. ⓪(;  4(A7): pfx(filename)
  526. ⓪(; 14(A7): sfx(wildcard)
  527. ⓪(; 18(A7): pfx(wildcard)
  528. ⓪ 
  529. ⓪(LEA     18(A7),A0
  530. ⓪(LEA     4(A7),A1
  531. ⓪%L1 MOVE.B  (A0)+,D0        ; Zeichen aus 'wildcard'
  532. ⓪(BEQ     E1              ; filename muß zu ende sein
  533. ⓪(CMPI.B  #'*',D0
  534. ⓪(BEQ     T1              ; filename ist egal
  535. ⓪(CMP.B   (A1)+,D0
  536. ⓪(BEQ     L1
  537. ⓪(CMPI.B  #'?',D0
  538. ⓪(BEQ     L1              ; zeichen ist egal
  539. ⓪(BRA     F
  540. ⓪ 
  541. ⓪%E1 TST.B   (A1)
  542. ⓪(BNE     F
  543. ⓪ 
  544. ⓪%T1 LEA     14(A7),A0
  545. ⓪(LEA     (A7),A1
  546. ⓪%L2 MOVE.B  (A0)+,D0
  547. ⓪(BEQ     S1              ; filename muß zu ende sein
  548. ⓪(CMPI.B  #'*',D0
  549. ⓪(BEQ     T               ; filename ist egal
  550. ⓪(CMP.B   (A1)+,D0
  551. ⓪(BEQ     L2
  552. ⓪(CMPI.B  #'?',D0
  553. ⓪(BEQ     L2              ; zeichen ist egal
  554. ⓪(BRA     F
  555. ⓪ 
  556. ⓪%S1 TST.B   (A1)
  557. ⓪(BNE     F
  558. ⓪ 
  559. ⓪&T MOVE    #1,(A3)+
  560. ⓪(UNLK    A5
  561. ⓪(RTS
  562. ⓪ 
  563. ⓪&F CLR     (A3)+
  564. ⓪(UNLK    A5
  565. ⓪$END
  566. ⓪"END NameMatching;
  567. ⓪ 
  568. ⓪ END FileNames.
  569. ⓪ ə
  570. (* $FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$000020AC$FFECF05A$00002CAF$FFECF05A$00001E79$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05AÇ$00000195T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000002BD$0000015C$00000164$00000195$0000016B$000002B2$FFEE7904$0000275D$FFE2D09E$00000404$FFF13E0C$00000410$00000404$00001E79$000020AC$00001F6FÿÇé*)
  571.