1452
|
1 **************************************************
|
|
2 * System Call: F$PrsNam
|
|
3 *
|
|
4 * Function: Parse a path name
|
|
5 *
|
|
6 * Modification to allow '-' in filenames by WG
|
|
7 *
|
|
8 * Input: X = Address of pathlist
|
|
9 *
|
|
10 * Output: X = Updated past optional "/" character
|
|
11 * Y = Address of last character of pathlist + 1
|
|
12 * B = Length of pathlist
|
|
13 *
|
|
14 * Error: CC = C bit set; B = error code
|
|
15 *
|
|
16 FPrsNam equ *
|
|
17 IFGT Level-1
|
|
18 ldx <D.Proc proc desc
|
|
19 leay <P$DATImg,x Y=DAT image ptr
|
|
20 ENDC
|
|
21 ldx R$X,u X=name string
|
|
22 bsr ParseNam get it and length
|
|
23 std R$D,u return length in D
|
|
24 bcs L073E ..err
|
|
25 stx R$X,u and X at name begin
|
|
26 abx plus len
|
|
27 L073E stx R$Y,u return Y=end of name ptr
|
|
28 rts end.
|
|
29
|
|
30 * Parse name
|
|
31 ParseNam equ *
|
|
32 IFGT Level-1
|
|
33 pshs y save DAT image pointer
|
|
34 lbsr AdjBlk0 go find map block...
|
|
35 pshs x,y save X offset within block and Y block pointer
|
|
36 bsr GoGetAXY go get byte at X in block Y...
|
|
37 ELSE
|
|
38 pshs x save X offset
|
|
39 lda ,x+
|
|
40 ENDC
|
|
41 cmpa #'. is the first character a period?
|
|
42 bne IsSlash no, do proper first character checking
|
|
43 IFGT Level-1
|
|
44 lbsr L0AC8 do a LDAXY, without changing X or Y
|
|
45 ELSE
|
|
46 lda ,x
|
|
47 ENDC
|
|
48 bsr ChkFirst is the next character non-period?
|
|
49 lda #'. restore the period character the LDAXY destroyed
|
|
50 bcc Do.Loop if NON-period character, skip 1st char checks
|
|
51
|
|
52 IsSlash cmpa #PDELIM is it a slash?
|
|
53 bne NotSlash no, go keep X offset and block Y...
|
|
54 bsr GetChar go get character...
|
|
55 NotSlash bsr ChkFirst go check if valid first character...
|
|
56 bcs NotValid not valid, go get next name start offset in X...
|
|
57 Do.Loop clrb initialize character counter
|
|
58 LastLoop incb add one character
|
|
59 tsta last character in name string?
|
|
60 bmi LastChar yes, go return valid...
|
|
61 IFGT Level-1
|
|
62 bsr GoGetAXY go get next character...
|
|
63 ELSE
|
|
64 lda ,x+
|
|
65 ENDC
|
|
66 bsr ChkValid go check if valid character...
|
|
67 bcc LastLoop valid, go check if last character...
|
|
68 LastChar andcc #^Carry
|
|
69 bra RtnValid
|
|
70
|
|
71 GetChar
|
|
72 stx 2,s save current offset over old offset
|
|
73 IFGT Level-1
|
|
74 sty 4,s save current block pointer over old block pointer
|
|
75 GoGetAXY lbra LDAXY go get byte at X in block Y in A, & return
|
|
76 ELSE
|
|
77 lda ,x+
|
|
78 rts
|
|
79 ENDC
|
|
80
|
|
81 NextLoop bsr GetChar go get character...
|
|
82 NotValid cmpa #', comma?
|
|
83 beq NextLoop yes, go get next character...
|
|
84 cmpa #C$SPAC space?
|
|
85 beq NextLoop yes, go get next character...
|
|
86 comb error, set Carry
|
|
87 ldb #E$BNam 'Bad Name' error
|
|
88 RtnValid equ *
|
|
89 IFGT Level-1
|
|
90 puls x,y recover offset & pointer
|
|
91 bra L0720 go do a similar exit routine
|
|
92 ELSE
|
|
93 puls x recover offset
|
|
94 rts
|
|
95 ENDC
|
|
96
|
|
97 ChkFirst pshs a save character
|
|
98 anda #$7F drop msbit
|
|
99 bra ChkRst skip dash for first character check
|
|
100
|
|
101 * Determine if character in A is a valid filename character
|
|
102 ChkValid pshs a save character
|
|
103 anda #$7F drop msbit
|
|
104 cmpa #'. period?
|
|
105 beq ValidChr yes, go return valid character...
|
|
106 ChkRest cmpa #'- is it a dash?
|
|
107 beq ValidChr yes, it's valid
|
|
108 ChkRst cmpa #'z greater than "z"?
|
|
109 bhi InvalidC yes, go return invalid character...
|
|
110 cmpa #'a greater than or equal to "a"?
|
|
111 bhs ValidChr yes, go return valid character...
|
|
112 cmpa #'_ underscore?
|
|
113 beq ValidChr yes, go return valid character...
|
|
114 cmpa #'Z greater than "Z"?
|
|
115 bhi InvalidC yes, go return invalid character...
|
|
116 cmpa #'A greater than or equal to "A"?
|
|
117 bhs ValidChr yes, go return valid character...
|
|
118 cmpa #'9 greater than "9"?
|
|
119 bhi InvalidC yes, go return invalid character...
|
|
120 cmpa #'0 greater than or equal to "0"?
|
|
121 bhs ValidChr yes, go return valid character...
|
|
122 cmpa #'$ dollar symbol?
|
|
123 beq ValidChr yes, go return valid character...
|
|
124 InvalidC coma invalid character, set carry
|
|
125 ValidChr puls a,pc
|
|
126
|