"Fossies" - the Fresh Open Source Software Archive 
Member "cpostp2.c" (9 May 1995, 11241 Bytes) of package /linux/misc/old/cpost.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "cpostp2.c" see the
Fossies "Dox" file reference documentation.
1 /*------------------------------------------------------------------
2 * cpostp2.c : pass 2 of cPost
3 *------------------------------------------------------------------
4 * 12-02-91 originally by Patrick J. Mueller
5 * 12-03-92 converted from cBook to cPost
6 *------------------------------------------------------------------*/
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 #include "ctok.h"
13 #include "cpost.h"
14
15 /*------------------------------------------------------------------
16 * static buffer
17 *------------------------------------------------------------------*/
18 #define BUFFER_LEN 8000
19 #define BRACKET_LEN 500
20
21 static unsigned char Buffer [BUFFER_LEN];
22 static unsigned char FuncBuff [MAX_IDENT_LEN+1];
23 static unsigned char CurrFunc [MAX_IDENT_LEN+1];
24 static unsigned char BrackInfo [BRACKET_LEN];
25
26 /*------------------------------------------------------------------
27 * global variables
28 *------------------------------------------------------------------*/
29 static FILE *oFile;
30 static PageEject *pageJ;
31 static char *Xchars[256];
32 static unsigned char currFont;
33 static unsigned long lineNo;
34 static int col;
35
36 /*-/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\-*/
37 /*-\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/-*/
38
39 /*------------------------------------------------------------------
40 * write out the buffer, translating as we go
41 *------------------------------------------------------------------*/
42 static void WriteOut(
43 unsigned char *buffer,
44 int len
45 )
46 {
47 int i;
48 char *xlate;
49
50 /*---------------------------------------------------------------
51 * print each character in buffer
52 *---------------------------------------------------------------*/
53 for (i=0; i<len; i++)
54 {
55 xlate = Xchars[buffer[i]];
56
57 /*------------------------------------------------------------
58 * check for end of line
59 *------------------------------------------------------------*/
60 if ('\n' == buffer[i])
61 {
62 lineNo++;
63
64 /*---------------------------------------------------------
65 * print end of line info
66 *---------------------------------------------------------*/
67 fprintf(oFile,")] showLine %s\n",BrackInfo);
68 BrackInfo[0] = 0;
69
70 /*---------------------------------------------------------
71 * see if there is a new function definition
72 *---------------------------------------------------------*/
73 if (*CurrFunc)
74 {
75 fprintf(oFile,"/currFunc (%s) def\n",CurrFunc);
76 *CurrFunc = 0;
77 }
78
79 /*---------------------------------------------------------
80 * write page eject if we need to
81 *---------------------------------------------------------*/
82 if (info.oBreak && pageJ && (pageJ->lineNo == lineNo))
83 {
84 if (pageJ->next)
85 {
86 int lines;
87
88 lines = pageJ->next->lineNo - pageJ->lineNo;
89 fprintf(oFile,"%d linesFit\n",lines);
90
91 pageJ = pageJ->next;
92 }
93 }
94
95 /*---------------------------------------------------------
96 * print start of line info
97 *---------------------------------------------------------*/
98 fprintf(oFile,"[%c (",currFont);
99
100 col = 0;
101 }
102
103 /*------------------------------------------------------------
104 * plain old character
105 *------------------------------------------------------------*/
106 else if (NULL == xlate)
107 {
108 col++;
109
110 /* fwrite(&(buffer[i]),1,1,oFile); */
111 fputc(buffer[i],oFile);
112 }
113
114 /*------------------------------------------------------------
115 * character to translate
116 *------------------------------------------------------------*/
117 else
118 {
119 char *bChar;
120 char nBuff[20];
121
122 col++;
123
124 /*---------------------------------------------------------
125 * check for bracket character
126 *---------------------------------------------------------*/
127 bChar = NULL;
128 switch(buffer[i])
129 {
130 case '\x01' : bChar = "u"; break;
131 case '\x02' : bChar = "m"; break;
132 case '\x03' : bChar = "l"; break;
133 }
134
135 if (bChar && (strlen(BrackInfo) < BRACKET_LEN - 30))
136 {
137 sprintf(nBuff,"%d",col);
138
139
140 strcat(BrackInfo," ");
141 strcat(BrackInfo,nBuff);
142 strcat(BrackInfo," ");
143 strcat(BrackInfo,bChar);
144 strcat(BrackInfo,"B");
145 }
146
147 /*---------------------------------------------------------
148 * print translation
149 *---------------------------------------------------------*/
150 /* fwrite(xlate,1,strlen(xlate),oFile); */
151 fputs(xlate,oFile);
152 }
153 }
154 }
155
156 /*-/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\-*/
157 /*-\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/-*/
158
159 /*------------------------------------------------------------------
160 * pass 2 - add formatting tags
161 *------------------------------------------------------------------*/
162 int Pass2(
163 File *file,
164 Info *info
165 )
166 {
167 Tok *next;
168 unsigned long offs;
169 unsigned long len;
170 FILE *iFile;
171 int i;
172
173 /*---------------------------------------------------------------
174 * initialize some stuff
175 *---------------------------------------------------------------*/
176 oFile = info->oFile;
177
178 for (i=0; i<256; i++)
179 {
180 Xchars[i] = NULL;
181 }
182
183 Xchars['('] = "\\("; /* ( -> \( */
184 Xchars[')'] = "\\)"; /* ) -> \) */
185 Xchars['\\'] = "\\\\"; /* \ -> \\ */
186
187 Xchars['\x01'] = " ";
188 Xchars['\x02'] = " ";
189 Xchars['\x03'] = " ";
190
191 /*---------------------------------------------------------------
192 * print status and read file
193 *---------------------------------------------------------------*/
194 fprintf(stderr," Reading file %s\n",file->name);
195 cParse(file,info);
196
197 /*---------------------------------------------------------------
198 * write header
199 *---------------------------------------------------------------*/
200 fprintf(info->oFile,"\n%%----------------------------------------------\n");
201
202 if (file->date && file->time && *file->date && *file->time)
203 fprintf(info->oFile,"(%s) (%s %s) startFile\n",file->name,
204 file->date,file->time);
205 else
206 fprintf(info->oFile,"(%s) () startFile\n",file->name);
207
208 /*---------------------------------------------------------------
209 * first line processing
210 *---------------------------------------------------------------*/
211 CurrFunc[0] = 0;
212 BrackInfo[0] = 0;
213 fprintf(oFile,"[n (");
214
215 /*---------------------------------------------------------------
216 * open the input file
217 *---------------------------------------------------------------*/
218 if (file->tempName)
219 iFile = fopen(file->tempName,"r");
220 else
221 iFile = fopen(file->pathName,"r");
222
223 if (!iFile)
224 cPostError(1,"error opening file for reading");
225
226 /*---------------------------------------------------------------
227 * initialize token processing
228 *---------------------------------------------------------------*/
229 next = file->tokList;
230 pageJ = file->breakList;
231 offs = 0;
232 lineNo = 0;
233 col = 0;
234 currFont = 'n';
235
236 /*---------------------------------------------------------------
237 * loop through tokens
238 *---------------------------------------------------------------*/
239 while (next)
240 {
241 /*---------------------------------------------------------
242 * read boring stuff up to first token
243 *---------------------------------------------------------*/
244 if (next->tok.offs != offs)
245 {
246 /*---------------------------------------------------------
247 * read and write it
248 *---------------------------------------------------------*/
249 len = next->tok.offs - offs;
250 while (len > BUFFER_LEN)
251 {
252 fread(Buffer,1,BUFFER_LEN,iFile);
253 WriteOut(Buffer,BUFFER_LEN);
254 len -= BUFFER_LEN;
255 }
256
257 fread(Buffer,1,(int)len,iFile);
258 WriteOut(Buffer,(int)len);
259
260 /*------------------------------------------------------
261 * update the pointer
262 *------------------------------------------------------*/
263 offs = next->tok.offs;
264 }
265
266 /*---------------------------------------------------------
267 * write the token
268 *---------------------------------------------------------*/
269 switch (next->extType)
270 {
271 /*---------------------------------------------------------
272 * get it's font character
273 *---------------------------------------------------------*/
274 case TOKEN_RESER : currFont = 'k'; break;
275 case TOKEN_PREPROC : currFont = 'p'; break;
276 case TOKEN_COMMENT : currFont = 'c'; break;
277 case TOKEN_IDENT : currFont = 'i'; break;
278 case TOKEN_FUNDEF : currFont = 'd'; break;
279 case TOKEN_FUNPRO : currFont = 'f'; break;
280 case TOKEN_FUNUSE : currFont = 'f'; break;
281 default : currFont = 'n'; break;
282 }
283
284 /*------------------------------------------------------------
285 * copy function name into buffer for function definitions
286 *------------------------------------------------------------*/
287 if (TOKEN_FUNDEF == next->extType)
288 strcpy(CurrFunc,next->str);
289
290 /*------------------------------------------------------
291 * read and write token
292 *------------------------------------------------------*/
293 if (currFont != 'n')
294 fprintf(oFile,") %c (",currFont);
295
296 len = next->tok.len;
297 while (len > BUFFER_LEN)
298 {
299 fread(Buffer,1,(int)BUFFER_LEN,iFile);
300 WriteOut(Buffer,(int)BUFFER_LEN);
301 len -= BUFFER_LEN;
302 }
303
304 fread(Buffer,1,(int)len,iFile);
305 WriteOut(Buffer,(int)len);
306
307 if (currFont != 'n')
308 fprintf(info->oFile,") n (");
309
310 currFont = 'n';
311
312 /*------------------------------------------------------------
313 * prepare for next token
314 *------------------------------------------------------------*/
315 offs += next->tok.len;
316 next = next->next;
317 }
318
319 /*---------------------------------------------------------------
320 * last line processing
321 *---------------------------------------------------------------*/
322 fprintf(oFile,")] showLine %s\nendFile",BrackInfo);
323
324 /*---------------------------------------------------------------
325 * close file
326 *---------------------------------------------------------------*/
327 fclose(iFile);
328
329 /*---------------------------------------------------------------
330 * free parser storage
331 *---------------------------------------------------------------*/
332 cParseDone(file,info);
333
334 return 0;
335 }
336