comparison parser.pas @ 0:62966dd383ed default tip

initial
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 08 Dec 2013 19:39:15 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:62966dd383ed
1 { File i/o and parsing routines. }
2
3 UNIT Parser;
4
5 INTERFACE
6
7 USES Gzio;
8
9 CONST REMCHAR='#';
10 REMEND=#13;
11 STRCHAR='"';
12 VRBCHAR='\';
13
14 { TYPE CfgFile=FILE OF CHAR; }
15 TYPE CfgFile=gzFile;
16
17 CONST PARSE_NOERROR=0;
18 PARSE_ERR_EOF=1;
19 PARSE_ERR_NUM=2;
20 PARSE_ERR_STR=3;
21 PARSE_ERR_NAM=4;
22 PARSE_ERR_OPN=5;
23
24 VAR errNum:BYTE;
25 actLine: WORD;
26 FUNCTION ReadName(VAR f:CfgFile):STRING;
27 FUNCTION ReadString(VAR f:CfgFile):STRING;
28 FUNCTION ReadNumber(VAR f:CfgFile):INTEGER;
29 PROCEDURE OpenCfg(VAR f:CfgFile; name: STRING);
30 PROCEDURE CloseCfg(VAR f:CfgFile);
31
32 IMPLEMENTATION
33
34 CONST CHR_EOF=#26;
35
36 PROCEDURE OpenCfg(VAR f:CfgFile; name: STRING);
37 BEGIN
38 actLine:=1;
39 errNum:=PARSE_NOERROR;
40
41 f:=gzOpen(name,'r');
42 IF f=NIL THEN BEGIN
43 errNum:=PARSE_ERR_OPN;
44 WriteLn('Can''t open ',name);
45 END;
46 END;
47
48 PROCEDURE CloseCfg(VAR f:CfgFile);
49 BEGIN
50 IF gzClose(f)>0 THEN errNum:=PARSE_ERR_OPN;
51 END;
52
53 FUNCTION ReadChr(VAR f:CfgFile): CHAR;
54 VAR c: CHAR;
55 b: INTEGER;
56 BEGIN
57 b:=gzGetC(f);
58
59 IF (b<0) OR (b>255) OR (c=CHR_EOF) THEN BEGIN
60 errNum:=PARSE_ERR_EOF;
61 c:=CHR_EOF;
62 END ELSE c:=Chr(b);
63
64 IF c=#13 THEN Inc(actLine);
65 ReadChr:=c;
66 END;
67
68 FUNCTION IsEmpty(c:CHAR):BOOLEAN;
69 BEGIN
70 IsEmpty:=(c=' ') OR (c=#9) OR (c=#13) OR (c=#10) OR (c=CHR_EOF);
71 END;
72
73 FUNCTION ReadName(VAR f:CfgFile):STRING;
74 VAR s: STRING;
75 c: CHAR;
76 BEGIN
77 ReadName:='';
78 REPEAT
79 c:=ReadChr(f);
80 IF c=REMCHAR THEN BEGIN
81 REPEAT
82 c:=ReadChr(f);
83 UNTIL (c=REMEND) OR (c=CHR_EOF);
84 IF (c<>CHR_EOF) THEN c:=' ';
85 END;
86 UNTIL (NOT IsEmpty(c)) OR (c=CHR_EOF);
87 s:='';
88 WHILE NOT IsEmpty(c) DO BEGIN
89 s:=Concat(s,UpCase(c));
90 c:=ReadChr(f);
91 END;
92 IF s='' THEN errNum:=PARSE_ERR_NAM;
93 ReadName:=s;
94 END;
95
96 FUNCTION ReadString(VAR f:CfgFile):STRING;
97 VAR s: STRING;
98 c: CHAR;
99 BEGIN
100 ReadString:='';
101 REPEAT
102 c:=ReadChr(f);
103 IF c=REMCHAR THEN BEGIN
104 REPEAT
105 c:=ReadChr(f);
106 UNTIL (c=REMEND) OR (c=CHR_EOF);
107 IF (c<>CHR_EOF) THEN c:=' ';
108 END;
109 UNTIL (NOT IsEmpty(c)) OR (c=CHR_EOF);
110 s:='';
111 IF c<>STRCHAR THEN BEGIN
112 errNum:=PARSE_ERR_STR;
113 END ELSE BEGIN
114 REPEAT
115 c:=ReadChr(f);
116 IF c=STRCHAR THEN Break;
117 IF c=#13 THEN BEGIN
118 ErrNum:=PARSE_ERR_STR;
119 Exit;
120 END;
121 IF c=CHR_EOF THEN Exit;
122 IF c=VRBCHAR THEN BEGIN
123 c:=ReadChr(f);
124 END;
125 s:=Concat(s,c);
126 UNTIL FALSE;
127 END;
128 ReadString:=s;
129 END;
130
131 FUNCTION ReadNumber(VAR f:CfgFile):INTEGER;
132 VAR s: STRING;
133 c: CHAR;
134 i,j: INTEGER;
135 BEGIN
136 ReadNumber:=0;
137 REPEAT
138 c:=ReadChr(f);
139 IF c=REMCHAR THEN BEGIN
140 REPEAT
141 c:=ReadChr(f);
142 UNTIL (c=REMEND) OR (c=CHR_EOF);
143 IF (c<>CHR_EOF) THEN c:=' ';
144 END;
145 UNTIL (NOT IsEmpty(c)) OR (c=CHR_EOF);
146 s:='';
147 WHILE NOT IsEmpty(c) DO BEGIN
148 s:=Concat(s,UpCase(c));
149 c:=ReadChr(f);
150 END;
151 Val(s,i,j);
152 IF j=0 THEN ReadNumber:=i
153 ELSE BEGIN
154 errNum:=PARSE_ERR_NUM;
155 END;
156 END;
157
158 END.