home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume13 / lj2ps / part12 < prev    next >
Encoding:
Text File  |  1990-07-02  |  44.6 KB  |  1,158 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v13i097: lj2ps (12 of 12), a LaserJet to PostScript Translator
  3. From: lishka@uwslh.slh.wisc.edu (Chris Lishka (relaxing in the Mad-City) )
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 13, Issue 97
  7. Submitted-by: lishka@uwslh.slh.wisc.edu (Chris Lishka (relaxing in the Mad-City) )
  8. Archive-name: lj2ps/part12
  9.  
  10. ---- Cut Here and unpack ----
  11. #!/bin/sh
  12. # This is part 12 of a multipart archive
  13. if touch 2>&1 | fgrep '[-amc]' > /dev/null
  14.  then TOUCH=touch
  15.  else TOUCH=true
  16. fi
  17. # ============= scan.c ==============
  18. if test X"$1" != X"-c" -a -f 'scan.c'; then
  19.     echo "File already exists: skipping 'scan.c'"
  20. else
  21. echo "x - extracting scan.c (Text)"
  22. sed 's/^X//' << 'SHAR_EOF' > scan.c &&
  23. X/* Project:        lj2ps
  24. X** File:        scan.c
  25. X**
  26. X** Author:        Christopher Lishka
  27. X** Organization:    Wisconsin State Laboratory of Hygiene
  28. X**            Data Processing Dept.
  29. X**
  30. X** Copyright (C) 1990 by Christopher Lishka.
  31. X**
  32. X** This program is free software; you can redistribute it and/or modify
  33. X** it under the terms of the GNU General Public License as published by
  34. X** the Free Software Foundation; either version 1, or (at your option)
  35. X** any later version.
  36. X**
  37. X** This program is distributed in the hope that it will be useful,
  38. X** but WITHOUT ANY WARRANTY; without even the implied warranty of
  39. X** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  40. X** GNU General Public License for more details.
  41. X**
  42. X** You should have received a copy of the GNU General Public License
  43. X** along with this program; if not, write to the Free Software
  44. X** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  45. X*/
  46. X
  47. Xstatic char * ModuleID = "Module scan: v1.0.1.2, production";
  48. X
  49. X  /* Include files
  50. X  */
  51. X#include <stdio.h>
  52. X#include <ctype.h>
  53. X#include "scan.h"
  54. X#include "lj.h"
  55. X#include "lj2ps.h"
  56. X
  57. X  /* External definitions
  58. X  */
  59. X
  60. X  /* Global variables
  61. X  */
  62. Xint    scan_state;        /* Controls which scanner is being used */
  63. Xchar  *text;            /* Text read in for text tokens */
  64. Xchar  *command;            /* Command read in */
  65. Xchar   variable[MAX_BUFFER];    /* Command parameter */
  66. Xchar   number[MAX_BUFFER];    /* Command numeric argument */
  67. Xint    pos_code;        /* Command numeric position code */
  68. Xtoken  curr_token;        /* Where to hold the scanned token */
  69. X
  70. X  /* Global function list
  71. X  */
  72. Xextern int  scan();        /* The entry into the scanners */
  73. Xextern void scan_init();    /* Reset the input for the scanner */
  74. X
  75. X  /* Local constants
  76. X  */
  77. X  /* Scanner state constants */
  78. X  /* These two constants allow access to the START and END states.  I do not
  79. X  ** recommend changing the actual values for them, because they need to be
  80. X  ** defined to the same value for *all* scanners in here.
  81. X  */
  82. X#define START     1
  83. X#define END       0
  84. X  /* Text scanner states */
  85. X#define ST____    END        /* End...must be zero! */
  86. X#define ST_STT    START        /* Start */
  87. X#define ST_CMD    2        /* Command */
  88. X#define ST_CMA    3        /* Command & */
  89. X#define ST_CMS    4        /* Command * */
  90. X#define ST_TLP    5        /* END: Text ( */
  91. X#define ST_TRP    6        /* END: Text ) */
  92. X#define ST_TBS    7        /* END: Text \ */
  93. X#define ST_TNL    8        /* END: Text \n */
  94. X#define ST_TFF    9        /* END: Text \f */
  95. X#define ST_UNK   10        /* END: Error: unknown command */
  96. X#define ST_CEQ   11        /* END: Command = */
  97. X#define ST_C9    12        /* END: Command 9 */
  98. X#define ST_CZ    13        /* END: Command Z */
  99. X#define ST_CY    14        /* END: Command Y */
  100. X#define ST_CE    15        /* END: Command E */
  101. X#define ST_CAa   16        /* END: Command &a */
  102. X#define ST_CAd   17        /* END: Command &d */
  103. X#define ST_CAf   18        /* END: Command &f */
  104. X#define ST_CAk   19        /* END: Command &k */
  105. X#define ST_CAl   20        /* END: Command &l */
  106. X#define ST_CAp   21        /* END: Command &p */
  107. X#define ST_CAs   22        /* END: Command &s */
  108. X#define ST_CSt   23        /* END: Command *t */
  109. X#define ST_CSr   24        /* END: Command *r */
  110. X#define ST_CSp   25        /* END: Command *p */
  111. X#define ST_CSc   26        /* END: Command *c */
  112. X#define ST_CSb   27        /* END: Command *b */
  113. X#define ST_CLs   28        /* END: Command (s */
  114. X#define ST_CRs   29        /* END: Command )s */
  115. X#define ST_CLP   30        /* END: Command ( */
  116. X#define ST_CRP   31        /* END: Command ) */
  117. X#define ST_TXT   32        /* END: Text */
  118. X#define ST_NUL   33        /* END: Null */
  119. X#define ST_TTB   34        /* END: Tab */
  120. X#define ST_TSI   35        /* END: Shift in */
  121. X#define ST_TSO   36        /* END: Shift out */
  122. X#define ST_MAX   37        /* End of these states */
  123. X  /* Parameter scanner states */
  124. X#define SP____    END        /* End state */
  125. X#define SP_PRM    START        /* Parameter */
  126. X#define SP_INT    2        /* Integer */
  127. X#define SP_FLP    3        /* Floating point */
  128. X#define SP_PEO    4        /* END: Parameter end -- other (no argument) */
  129. X#define SP_PE     5        /* END: Parameter end -- normal */
  130. X#define SP_PC     6        /* END: Parameter continue */
  131. X#define SP_UNK    7        /* END: Unknown command */
  132. X#define SP_MAX    8        /* End of these states */
  133. X  /* Text scanner character classes */
  134. X#define CST___    0        /* All other characters */
  135. X#define CST_LP    1        /* ( */
  136. X#define CST_RP    2        /* ) */
  137. X#define CST_BS    3        /* \ */
  138. X#define CST_NL    4        /* \n */
  139. X#define CST_FF    5        /* \f */
  140. X#define CST_NU    6        /* \0 */
  141. X#define CST_ES    7        /* ^[ */
  142. X#define CST_EQ    8        /* = */
  143. X#define CST_AM    9        /* & */
  144. X#define CST_AS   10        /* * */
  145. X#define CST_9    11        /* 9 */
  146. X#define CST_E    12        /* E */
  147. X#define CST_Y    13        /* Y */
  148. X#define CST_Z    14        /* Z */
  149. X#define CST_a    15        /* a */
  150. X#define CST_b    16        /* b */
  151. X#define CST_c    17        /* c */
  152. X#define CST_d    18        /* d */
  153. X#define CST_f    19        /* f */
  154. X#define CST_k    20        /* k */
  155. X#define CST_l    21        /* l */
  156. X#define CST_p    22        /* p */
  157. X#define CST_r    23        /* r */
  158. X#define CST_s    24        /* s */
  159. X#define CST_t    25        /* t */
  160. X#define CST_EF   26        /* EOF */
  161. X#define CST_TB   27        /* Tab */
  162. X#define CST_SI   28        /* Shift in */
  163. X#define CST_SO   29        /* Shift out */
  164. X#define CST_MAX  30        /* End of these classes */
  165. X  /* Parameter scanner character classes */
  166. X#define CSP___    0        /* All other characters */
  167. X#define CSP_SI    1        /* + - */
  168. X#define CSP_DI    2        /* 0 1 2 3 4 5 6 7 8 9 */
  169. X#define CSP_PE    3        /* . */
  170. X#define CSP_LW    4        /* a-z */
  171. X#define CSP_US    5        /* A-Z ! " # $ % & ' ( ) * , / :   */
  172. X                /* ; < = > ? @ [ \ ] ^ _ ` { | } ~ */
  173. X#define CSP_EF    6        /* EOF */
  174. X#define CSP_MAX   7        /* End of these classes */
  175. X
  176. X  /* Local structures and types
  177. X  */
  178. X  /* The text buffer */
  179. Xtypedef struct {        /* Input buffer */
  180. X  int   length;            /* Number of characters put back */
  181. X  char  storage[MAX_BUFFER];    /* Storage for characters in the buffer */
  182. X} buffer;
  183. X
  184. X  /* Local variables
  185. X  */
  186. Xstatic FILE  *in_file;        /* Input file */
  187. Xstatic char   curr_char;    /* The current character */
  188. Xstatic int    end_of_file;    /* True if at the end_of_file */
  189. Xstatic buffer input;        /* Buffer to hold put-back characters */
  190. X
  191. X  /* The text scanner state/input table */
  192. Xstatic int st_states[ST_MAX][CST_MAX] = {
  193. X/* Legend:
  194. X**{ CST___, CST_LP, CST_RP, CST_BS,   CST_NL, CST_FF, CST_NU, CST_ES,
  195. X**  CST_EQ, CST_AM, CST_AS, CST_9 ,   CST_E , CST_Y , CST_Z , CST_a ,
  196. X**  CST_b , CST_c , CST_d , CST_f ,   CST_k , CST_l , CST_p , CST_r ,
  197. X**  CST_s , CST_t , CST_EF, CST_TB,   CST_SI, CST_SO },
  198. X*/
  199. X    /* ST____: END*/
  200. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  201. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  202. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  203. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  204. X    /* ST_STT: Start */
  205. X  { ST_TXT, ST_TLP, ST_TRP, ST_TBS,   ST_TNL, ST_TFF, ST_NUL, ST_CMD,
  206. X    ST_TXT, ST_TXT, ST_TXT, ST_TXT,   ST_TXT, ST_TXT, ST_TXT, ST_TXT,
  207. X    ST_TXT, ST_TXT, ST_TXT, ST_TXT,   ST_TXT, ST_TXT, ST_TXT, ST_TXT,
  208. X    ST_TXT, ST_TXT, ST____, ST_TTB,   ST_TSI, ST_TSO },
  209. X    /* ST_CMD: Command */
  210. X  { ST_UNK, ST_CLP, ST_CRP, ST_UNK,   ST_UNK, ST_UNK, ST_UNK, ST_UNK,
  211. X    ST_CEQ, ST_CMA, ST_CMS, ST_C9 ,   ST_CE , ST_CY , ST_CZ , ST_UNK,
  212. X    ST_UNK, ST_UNK, ST_UNK, ST_UNK,   ST_UNK, ST_UNK, ST_UNK, ST_UNK,
  213. X    ST_UNK, ST_UNK, ST_UNK, ST_UNK,   ST_UNK, ST_UNK },
  214. X    /* ST_CMA: Command & */
  215. X  { ST_UNK, ST_UNK, ST_UNK, ST_UNK,   ST_UNK, ST_UNK, ST_UNK, ST_UNK,
  216. X    ST_UNK, ST_UNK, ST_UNK, ST_UNK,   ST_UNK, ST_UNK, ST_UNK, ST_CAa,
  217. X    ST_UNK, ST_UNK, ST_CAd, ST_CAf,   ST_CAk, ST_CAl, ST_CAp, ST_UNK,
  218. X    ST_CAs, ST_UNK, ST_UNK, ST_UNK,   ST_UNK, ST_UNK },
  219. X    /* ST_CMS: Command * */
  220. X  { ST_UNK, ST_UNK, ST_UNK, ST_UNK,   ST_UNK, ST_UNK, ST_UNK, ST_UNK,
  221. X    ST_UNK, ST_UNK, ST_UNK, ST_UNK,   ST_UNK, ST_UNK, ST_UNK, ST_UNK,
  222. X    ST_CSb, ST_CSc, ST_UNK, ST_UNK,   ST_UNK, ST_UNK, ST_CSp, ST_CSr,
  223. X    ST_UNK, ST_CSt, ST_UNK, ST_UNK,   ST_UNK, ST_UNK },
  224. X    /* ST_TLP: END: Text ( */
  225. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  226. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  227. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  228. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  229. X    /* ST_TRP: END: Text ) */
  230. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  231. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  232. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  233. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  234. X    /* ST_TBS: END: Text \ */
  235. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  236. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  237. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  238. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  239. X    /* ST_TNL: END: Text \n */
  240. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  241. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  242. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  243. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  244. X    /* ST_TFF: END: Text \f */
  245. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  246. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  247. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  248. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  249. X    /* ST_UNK: END: Error: unknown command */
  250. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  251. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  252. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  253. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  254. X    /* ST_CEQ: END: Command = */
  255. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  256. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  257. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  258. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  259. X    /* ST_C9:* END: Command 9 */
  260. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  261. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  262. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  263. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  264. X    /* ST_CZ:* END: Command Z */
  265. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  266. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  267. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  268. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  269. X    /* ST_CY:* END: Command Y */
  270. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  271. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  272. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  273. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  274. X    /* ST_CE:* END: Command E */
  275. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  276. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  277. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  278. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  279. X    /* ST_CAa: END: Command &a */
  280. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  281. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  282. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  283. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  284. X    /* ST_CAd: END: Command &d */
  285. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  286. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  287. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  288. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  289. X    /* ST_CAf: END: Command &f */
  290. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  291. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  292. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  293. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  294. X    /* ST_CAk: END: Command &k */
  295. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  296. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  297. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  298. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  299. X    /* ST_CAl: END: Command &l */
  300. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  301. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  302. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  303. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  304. X    /* ST_CAp: END: Command &p */
  305. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  306. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  307. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  308. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  309. X    /* ST_CAs: END: Command &s */
  310. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  311. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  312. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  313. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  314. X    /* ST_CSt: END: Command *t */
  315. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  316. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  317. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  318. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  319. X    /* ST_CSr: END: Command *r */
  320. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  321. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  322. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  323. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  324. X    /* ST_CSp: END: Command *p */
  325. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  326. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  327. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  328. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  329. X    /* ST_CSc: END: Command *c */
  330. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  331. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  332. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  333. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  334. X    /* ST_CSb: END: Command *b */
  335. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  336. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  337. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  338. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  339. X    /* ST_CLs: END: Command (s */
  340. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  341. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  342. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  343. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  344. X    /* ST_CRs: END: Command )s */
  345. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  346. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  347. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  348. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  349. X    /* ST_CLP: END: Command ( */
  350. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  351. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  352. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  353. X    ST_CLs, ST____, ST____, ST____,   ST____, ST____ },
  354. X    /* ST_CRP: END: Command ) */
  355. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  356. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  357. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  358. X    ST_CRs, ST____, ST____, ST____,   ST____, ST____ },
  359. X    /* ST_TXT: END: Text */
  360. X  { ST_TXT, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  361. X    ST_TXT, ST_TXT, ST_TXT, ST_TXT,   ST_TXT, ST_TXT, ST_TXT, ST_TXT,
  362. X    ST_TXT, ST_TXT, ST_TXT, ST_TXT,   ST_TXT, ST_TXT, ST_TXT, ST_TXT,
  363. X    ST_TXT, ST_TXT, ST____, ST____,   ST____, ST____ },
  364. X    /* ST_NUL: END: Null */
  365. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  366. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  367. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  368. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  369. X    /* ST_TTB: END: Tab */
  370. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  371. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  372. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  373. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  374. X    /* ST_TSI: END: Shift in */
  375. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  376. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  377. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  378. X    ST____, ST____, ST____, ST____,   ST____, ST____ },
  379. X    /* ST_TSO: END: Shift out */
  380. X  { ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  381. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  382. X    ST____, ST____, ST____, ST____,   ST____, ST____, ST____, ST____,
  383. X    ST____, ST____, ST____, ST____,   ST____, ST____ }
  384. X};
  385. X
  386. Xstatic int sp_states[SP_MAX][CSP_MAX] = {
  387. X/* Legend:
  388. X**{ CSP___, CSP_SI, CSP_DI, CSP_PE,   CSP_LW, CSP_US, CSP_EF }
  389. X*/
  390. X    /* SP____: Error */
  391. X  { SP____, SP____, SP____, SP____,   SP____, SP____, SP____ },
  392. X    /* SP_PRM: Parameter */
  393. X  { SP_PEO, SP_INT, SP_INT, SP_PEO,   SP_PC , SP_PE , SP_UNK },
  394. X    /* SP_INT: Integer */
  395. X  { SP_UNK, SP_PE , SP_INT, SP_FLP,   SP_PC , SP_PE , SP_UNK },
  396. X    /* SP_FLP: Floating point */
  397. X  { SP_UNK, SP_PE , SP_FLP, SP_PE ,   SP_PC , SP_PE , SP_UNK },
  398. X    /* SP_PEO: END: Parameter end -- other (no argument) */
  399. X  { SP____, SP____, SP____, SP____,   SP____, SP____, SP____ },
  400. X    /* SP_PE:  END: Parameter end -- normal */
  401. X  { SP____, SP____, SP____, SP____,   SP____, SP____, SP____ },
  402. X    /* SP_PC:  END: Parameter continue */
  403. X  { SP____, SP____, SP____, SP____,   SP____, SP____, SP____ },
  404. X    /* SP_UNK: END: Unknown command */
  405. X  { SP____, SP____, SP____, SP____,   SP____, SP____, SP____ }
  406. X};
  407. X
  408. Xstatic int st_classes[256] = {
  409. X  /* 00 */ CST_NU, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  410. X  /* 08 */ CST___, CST_TB, CST_NL, CST___,   CST_FF, CST___, CST_SO, CST_SI,
  411. X  /* 10 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  412. X  /* 18 */ CST___, CST___, CST___, CST_ES,   CST___, CST___, CST___, CST___,
  413. X  /* 20 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST_AM, CST___,
  414. X  /* 28 */ CST_LP, CST_RP, CST_AS, CST___,   CST___, CST___, CST___, CST___,
  415. X  /* 30 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  416. X  /* 38 */ CST___, CST_9 , CST___, CST___,   CST___, CST_EQ, CST___, CST___,
  417. X  /* 40 */ CST___, CST___, CST___, CST___,   CST___, CST_E , CST___, CST___,
  418. X  /* 48 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  419. X  /* 50 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  420. X  /* 58 */ CST___, CST_Y , CST_Z , CST___,   CST_BS, CST___, CST___, CST___,
  421. X  /* 60 */ CST___, CST_a , CST_b , CST_c ,   CST_d , CST___, CST_f , CST___,
  422. X  /* 68 */ CST___, CST___, CST___, CST_k ,   CST_l , CST___, CST___, CST___,
  423. X  /* 70 */ CST_p , CST___, CST_r , CST_s ,   CST_t , CST___, CST___, CST___,
  424. X  /* 78 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  425. X
  426. X  /* 80 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  427. X  /* 88 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  428. X  /* 90 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  429. X  /* 98 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  430. X  /* a0 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  431. X  /* a8 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  432. X  /* b0 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  433. X  /* b8 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  434. X  /* c0 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  435. X  /* c8 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  436. X  /* d0 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  437. X  /* d8 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  438. X  /* e0 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  439. X  /* e8 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  440. X  /* f0 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___,
  441. X  /* f8 */ CST___, CST___, CST___, CST___,   CST___, CST___, CST___, CST___
  442. X};
  443. X
  444. Xstatic int sp_classes[256] = {
  445. X  /* 00 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  446. X  /* 08 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  447. X  /* 10 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  448. X  /* 18 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  449. X  /* 20 */ CSP___, CSP_US, CSP_US, CSP_US,   CSP_US, CSP_US, CSP_US, CSP_US,
  450. X  /* 28 */ CSP_US, CSP_US, CSP_US, CSP_SI,   CSP_US, CSP_SI, CSP_PE, CSP_US,
  451. X  /* 30 */ CSP_DI, CSP_DI, CSP_DI, CSP_DI,   CSP_DI, CSP_DI, CSP_DI, CSP_DI,
  452. X  /* 38 */ CSP_DI, CSP_DI, CSP_US, CSP_US,   CSP_US, CSP_US, CSP_US, CSP_US,
  453. X  /* 40 */ CSP_US, CSP_US, CSP_US, CSP_US,   CSP_US, CSP_US, CSP_US, CSP_US,
  454. X  /* 48 */ CSP_US, CSP_US, CSP_US, CSP_US,   CSP_US, CSP_US, CSP_US, CSP_US,
  455. X  /* 50 */ CSP_US, CSP_US, CSP_US, CSP_US,   CSP_US, CSP_US, CSP_US, CSP_US,
  456. X  /* 58 */ CSP_US, CSP_US, CSP_US, CSP_US,   CSP_US, CSP_US, CSP_US, CSP_US,
  457. X  /* 60 */ CSP_LW, CSP_LW, CSP_LW, CSP_LW,   CSP_LW, CSP_LW, CSP_LW, CSP_LW,
  458. X  /* 68 */ CSP_LW, CSP_LW, CSP_LW, CSP_LW,   CSP_LW, CSP_LW, CSP_LW, CSP_LW,
  459. X  /* 70 */ CSP_LW, CSP_LW, CSP_LW, CSP_LW,   CSP_LW, CSP_LW, CSP_LW, CSP_LW,
  460. X  /* 78 */ CSP_LW, CSP_LW, CSP_LW, CSP_US,   CSP_US, CSP_US, CSP_US, CSP___,
  461. X
  462. X  /* 80 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  463. X  /* 88 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  464. X  /* 90 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  465. X  /* 98 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  466. X  /* a0 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  467. X  /* a8 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  468. X  /* b0 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  469. X  /* b8 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  470. X  /* c0 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  471. X  /* c8 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  472. X  /* d0 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  473. X  /* d8 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  474. X  /* e0 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  475. X  /* e8 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  476. X  /* f0 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___,
  477. X  /* f8 */ CSP___, CSP___, CSP___, CSP___,   CSP___, CSP___, CSP___, CSP___
  478. X};
  479. X
  480. X
  481. X  /* Local macro definitions
  482. X  */
  483. X
  484. X  /* Local function list
  485. X  */
  486. Xstatic void  parse_argument();
  487. X
  488. X  /* Function bodies
  489. X  */
  490. X
  491. X  /* scan() is the front_end to the scanner.  It runs the proper scanner,
  492. X  ** based on the value of scan_state.  It returns a token number if the
  493. X  ** scan was successful, or zero if the end-of-file was reached.
  494. X  */
  495. Xint
  496. Xscan()
  497. X{
  498. X  register int prev_state;    /* The previous state */
  499. X  register int curr_state;    /* The current state */
  500. X
  501. X rescan:
  502. X
  503. X  curr_token.storage[0] = '\0';  curr_token.length = 0;
  504. X  curr_state = START;
  505. X  
  506. X  do{                /* Main scanning loop */
  507. X    
  508. X    prev_state = curr_state;
  509. X
  510. X      /* Get the next character */
  511. X    if( input.length > 0 ){
  512. X      curr_char = input.storage[--input.length];
  513. X    }
  514. X    else{
  515. X      if( (curr_char = getc(in_file)) == EOF)
  516. X    end_of_file = 1;
  517. X      else
  518. X    end_of_file = 0;
  519. X    }
  520. X
  521. X#ifdef DEBUG
  522. X    if( debug == 2 ) fputc(curr_char, stderr);
  523. X#endif
  524. X
  525. X    if( !end_of_file ){
  526. X
  527. X#ifdef DEBUG
  528. X    if( debug == 3 ){
  529. X      switch( scan_state ){
  530. X      case SS_TEXT:
  531. X    fprintf(stderr,
  532. X        "TEXT  curr % 3.3d (prev % 3.3d)  char %c (0x%2.2x)  class % 3.3d -> % 3.3d\n",
  533. X        curr_state, prev_state,
  534. X        curr_char, (int) curr_char, st_classes[curr_char],
  535. X        st_states[curr_state][st_classes[curr_char]]
  536. X        );
  537. X    break;
  538. X      case SS_PARAM:
  539. X    fprintf(stderr,
  540. X        "TEXT  curr % 3.3d (prev % 3.3d)  char %c (0x%2.2x)  class % 3.3d -> % 3.3d\n",
  541. X        curr_state, prev_state,
  542. X        curr_char, (int) curr_char, sp_classes[curr_char],
  543. X        sp_states[curr_state][sp_classes[curr_char]]
  544. X        );
  545. X    break;
  546. X      default:
  547. X    internal_error("illegal scan state in scan()", "");
  548. X      } /* switch( ... ) */
  549. X    } /* if( debug ... ) */
  550. X#endif
  551. X
  552. X      switch( scan_state ){
  553. X      case SS_TEXT:
  554. X    if( (curr_state = st_states[curr_state][st_classes[curr_char]])
  555. X       == END ){
  556. X
  557. X        /* Put back character */
  558. X      if( input.length == MAX_BUFFER ){
  559. X        internal_error("you blew the put-back buffer!", "");
  560. X      }
  561. X      else{
  562. X        input.storage[input.length] = curr_char;
  563. X        input.length++;
  564. X      }
  565. X
  566. X    }
  567. X    else{
  568. X
  569. X        /* Accept character */
  570. X      if( curr_token.length == MAX_BUFFER ){
  571. X        internal_error("current token is too large", "");
  572. X      }
  573. X      else{
  574. X        curr_token.storage[curr_token.length] = curr_char;
  575. X        curr_token.length++;
  576. X      }
  577. X
  578. X    }
  579. X    break;
  580. X      case SS_PARAM:
  581. X    if( (curr_state = sp_states[curr_state][sp_classes[curr_char]])
  582. X       == END ){
  583. X
  584. X        /* Put back character */
  585. X      if( input.length == MAX_BUFFER ){
  586. X        internal_error("you blew the put-back buffer!", "");
  587. X      }
  588. X      else{
  589. X        input.storage[input.length] = curr_char;
  590. X        input.length++;
  591. X      }
  592. X
  593. X    }
  594. X    else{
  595. X
  596. X        /* Accept character */
  597. X      if( curr_token.length == MAX_BUFFER ){
  598. X        internal_error("current token is too large", "");
  599. X      }
  600. X      else{
  601. X        curr_token.storage[curr_token.length] = curr_char;
  602. X        curr_token.length++;
  603. X      }
  604. X
  605. X    }
  606. X    break;
  607. X      default:
  608. X    internal_error("illegal scan state in scan()", "");
  609. X      } /* switch(...) */
  610. X
  611. X    } /* if( !eof ) */
  612. X    else{
  613. X
  614. X      switch( scan_state ){
  615. X      case SS_TEXT:
  616. X    if( (curr_state = st_states[curr_state][CST_EF])
  617. X       != END ){
  618. X
  619. X      fatal_error("end-of-file found in a command", "");
  620. X
  621. X    }
  622. X    break;
  623. X      case SS_PARAM:
  624. X    if( (curr_state = sp_states[curr_state][CSP_EF])
  625. X       != END ){
  626. X
  627. X      fatal_error("end-of-file found in a command", "");
  628. X
  629. X    }
  630. X    break;
  631. X      default:
  632. X    internal_error("illegal scan state in scan()", "");
  633. X      } /* switch(...) */
  634. X
  635. X    } /* else( !eof ) */
  636. X
  637. X  } while( curr_state != END );
  638. X
  639. X    /* If this point is reached, then an entire token has been scanned.
  640. X    ** The token must be properly saved, and then the appropriate token
  641. X    ** action must be performed.  The switch() and embedded switch()'s
  642. X    ** perform the necessary token actions for each state.
  643. X    */
  644. X  curr_token.storage[curr_token.length] = '\0';
  645. X  switch( scan_state ){
  646. X  case SS_TEXT:
  647. X    switch( prev_state ){
  648. X    case ST_TLP:  scan_state = SS_TEXT;  curr_token.code = TEXT_lp;     break;
  649. X    case ST_TRP:  scan_state = SS_TEXT;  curr_token.code = TEXT_rp;      break;
  650. X    case ST_TBS:  scan_state = SS_TEXT;  curr_token.code = TEXT_bslash;     break;
  651. X    case ST_TNL:  scan_state = SS_TEXT;  curr_token.code = TEXT_NEWLINE; break;
  652. X    case ST_TFF:  scan_state = SS_TEXT;  curr_token.code = TEXT_FORMFEED;break;
  653. X    case ST_UNK:
  654. X      warning("LaserJet command not supported", curr_token.storage);
  655. X      scan_state = SS_TEXT;  goto rescan;
  656. X    case ST_CEQ:  scan_state = SS_TEXT;  curr_token.code = CMD_eq;       break;
  657. X    case ST_C9 :  scan_state = SS_TEXT;  curr_token.code = CMD_9;     break;
  658. X    case ST_CZ :  scan_state = SS_TEXT;  curr_token.code = CMD_Z;     break;
  659. X    case ST_CY :  scan_state = SS_TEXT;  curr_token.code = CMD_Y;     break;
  660. X    case ST_CE :  scan_state = SS_TEXT;  curr_token.code = CMD_E;     break;
  661. X    case ST_CAa:  scan_state = SS_PARAM; curr_token.code = CMD_amp_a;     break;
  662. X    case ST_CAd:  scan_state = SS_PARAM; curr_token.code = CMD_amp_d;     break;
  663. X    case ST_CAf:  scan_state = SS_PARAM; curr_token.code = CMD_amp_f;     break;
  664. X    case ST_CAk:  scan_state = SS_PARAM; curr_token.code = CMD_amp_k;     break;
  665. X    case ST_CAl:  scan_state = SS_PARAM; curr_token.code = CMD_amp_l;     break;
  666. X    case ST_CAp:  scan_state = SS_PARAM; curr_token.code = CMD_amp_p;     break;
  667. X    case ST_CAs:  scan_state = SS_PARAM; curr_token.code = CMD_amp_s;     break;
  668. X    case ST_CSt:  scan_state = SS_PARAM; curr_token.code = CMD_star_t;     break;
  669. X    case ST_CSr:  scan_state = SS_PARAM; curr_token.code = CMD_star_r;     break;
  670. X    case ST_CSp:  scan_state = SS_PARAM; curr_token.code = CMD_star_p;     break;
  671. X    case ST_CSc:  scan_state = SS_PARAM; curr_token.code = CMD_star_c;     break;
  672. X    case ST_CSb:  scan_state = SS_PARAM; curr_token.code = CMD_star_b;     break;
  673. X    case ST_CLs:  scan_state = SS_PARAM; curr_token.code = CMD_lp_s;     break;
  674. X    case ST_CRs:  scan_state = SS_PARAM; curr_token.code = CMD_rp_s;     break;
  675. X    case ST_CLP:  scan_state = SS_PARAM; curr_token.code = CMD_lp;     break;
  676. X    case ST_CRP:  scan_state = SS_PARAM; curr_token.code = CMD_rp;     break;
  677. X    case ST_TXT:  scan_state = SS_TEXT;  curr_token.code = TEXT_CHAR;     break;
  678. X    case ST_NUL:  scan_state = SS_TEXT;  curr_token.code = TEXT_NULL;     break;
  679. X    case ST_TTB:  scan_state = SS_TEXT;  curr_token.code = TEXT_TAB;     break;
  680. X    case ST_TSI:  scan_state = SS_TEXT;  curr_token.code = TEXT_SH_IN;   break;
  681. X    case ST_TSO:  scan_state = SS_TEXT;  curr_token.code = TEXT_SH_OUT;  break;
  682. X    case ST____:
  683. X    case ST_STT:
  684. X    case ST_CMD:
  685. X    case ST_CMA:
  686. X    case ST_CMS:
  687. X    default:
  688. X      if( !end_of_file ){
  689. X    internal_error("illegal state in text scanner token actions", "");
  690. X      }
  691. X    } /* switch( text scanner ) */
  692. X    break;
  693. X  case SS_PARAM:
  694. X    switch( prev_state ){
  695. X    case SP_PE :
  696. X      scan_state = SS_TEXT;
  697. X      curr_token.code = PARAM_END;
  698. X      parse_argument();
  699. X      break;
  700. X    case SP_PC :
  701. X      scan_state = SS_PARAM;
  702. X      curr_token.code = PARAM_CONTINUE;
  703. X      parse_argument();
  704. X      break;
  705. X    case SP_PEO:
  706. X      scan_state = SS_TEXT;
  707. X      curr_token.code = PARAM_END;
  708. X      parse_argument();
  709. X      break;
  710. X    case SP_UNK:
  711. X      warning("illegal character in command parameter", curr_token.storage);
  712. X      scan_state = SS_TEXT; goto rescan;
  713. X    case SP____:
  714. X    case SP_PRM:
  715. X    case SP_INT:
  716. X    case SP_FLP:
  717. X    default:
  718. X      internal_error("illegal state in parameter scanner token actions", "");
  719. X    } /* switch( parameter scanner ) */
  720. X    break;
  721. X  default:
  722. X    internal_error("illegal scan state in token actions", "");
  723. X  } /* switch( scan_state ) */
  724. X
  725. X  return( !end_of_file );
  726. X} /* scan() */
  727. X
  728. X
  729. X
  730. X  /* scan_init() initializes the scanner to a new input stream.  This is
  731. X  ** accomplished by reseting the scan_state, clearing the put-back buffer,
  732. X  ** and various other minor tasks.
  733. X  */
  734. Xvoid
  735. Xscan_init(file)
  736. X     FILE *file;
  737. X{
  738. X
  739. X    /* Initialize the scan state */
  740. X  scan_state = SS_TEXT;
  741. X
  742. X    /* Save the handle to the file */
  743. X  in_file = file;
  744. X  end_of_file = 0;
  745. X
  746. X    /* Reset the buffer */
  747. X  input.length = 0;
  748. X
  749. X    /* Miscellaneous */
  750. X  text = curr_token.storage;
  751. X  command = curr_token.storage;
  752. X
  753. X} /* scan_init() */
  754. X
  755. X
  756. X
  757. X
  758. Xstatic void
  759. Xparse_argument()
  760. X{
  761. X
  762. X    /* Determine whether or not the command has a numeric argument */
  763. X  if( curr_token.length == 1 ){    /* No numeric argument */
  764. X    number[0] = '0';        /* Set number = "0" */
  765. X    number[1] = '\0';
  766. X    pos_code = POS_ABSOLUTE;    /* Set to a constant value */
  767. X  }
  768. X  else{                /* Numeric argument present */
  769. X      /* Check if it is a relative offset */
  770. X    if( !isdigit(curr_token.storage[0]) ){
  771. X      if( curr_token.storage[0] == '+' )       pos_code = POS_REL_POSITIVE;
  772. X      else if( curr_token.storage[0] == '-' )  pos_code = POS_REL_NEGATIVE;
  773. X      else internal_error("illegal relative offset", curr_token.storage);
  774. X    }
  775. X    else{
  776. X      pos_code = POS_ABSOLUTE;
  777. X    }
  778. X      /* Record the scalar value */
  779. X    if( pos_code == POS_ABSOLUTE ){
  780. X      (void) strncpy(number, curr_token.storage, curr_token.length - 1);
  781. X      number[curr_token.length - 1] = '\0';
  782. X    }
  783. X    else{
  784. X      (void) strncpy(number, &(curr_token.storage)[1], curr_token.length - 2);
  785. X      number[curr_token.length - 2] = '\0';
  786. X    }
  787. X  }
  788. X
  789. X    /* Finally, record the command as an *upper-case* single digit string */
  790. X  variable[0] = curr_token.storage[curr_token.length - 1];
  791. X  variable[1] = '\0';
  792. X  if( islower(variable[0]) )  variable[0] = toupper(variable[0]);
  793. X
  794. X} /* parse_argument() */
  795. SHAR_EOF
  796. $TOUCH -am 0630160790 scan.c &&
  797. chmod 0644 scan.c ||
  798. echo "restore of scan.c failed"
  799. set `wc -c scan.c`;Wc_c=$1
  800. if test "$Wc_c" != "32557"; then
  801.     echo original size 32557, current size $Wc_c
  802. fi
  803. fi
  804. # ============= scan.h ==============
  805. if test X"$1" != X"-c" -a -f 'scan.h'; then
  806.     echo "File already exists: skipping 'scan.h'"
  807. else
  808. echo "x - extracting scan.h (Text)"
  809. sed 's/^X//' << 'SHAR_EOF' > scan.h &&
  810. X/*
  811. X** Project:        lj2ps
  812. X** File:        scan.h
  813. X**
  814. X** Author:        Christopher Lishka
  815. X** Organization:    Wisconsin State Laboratory of Hygiene
  816. X**            Data Processing Dept.
  817. X**
  818. X** Copyright (C) 1990 by Christopher Lishka.
  819. X**
  820. X** This program is free software; you can redistribute it and/or modify
  821. X** it under the terms of the GNU General Public License as published by
  822. X** the Free Software Foundation; either version 1, or (at your option)
  823. X** any later version.
  824. X**
  825. X** This program is distributed in the hope that it will be useful,
  826. X** but WITHOUT ANY WARRANTY; without even the implied warranty of
  827. X** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  828. X** GNU General Public License for more details.
  829. X**
  830. X** You should have received a copy of the GNU General Public License
  831. X** along with this program; if not, write to the Free Software
  832. X** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  833. X*/
  834. X
  835. X  /* Global constants
  836. X  */
  837. X#define MAX_BUFFER  1024    /* The maximum size of the token buffer */
  838. X  /* Persistent scanner states */
  839. X#define SS_TEXT            1
  840. X#define SS_PARAM           2
  841. X  /* Tokens returned */
  842. X#define TEXT_lp          201    /* Normal text tokens */
  843. X#define TEXT_rp          202
  844. X#define TEXT_bslash      203
  845. X#define TEXT_NEWLINE     204
  846. X#define TEXT_FORMFEED     205
  847. X#define TEXT_NULL        206
  848. X#define TEXT_CHAR     207
  849. X#define TEXT_TAB         208
  850. X#define TEXT_SH_IN       209
  851. X#define TEXT_SH_OUT      210
  852. X#define CMD_UNDEF        300    /* Command tokens */
  853. X#define CMD_E         301
  854. X#define CMD_Y         302
  855. X#define CMD_Z         303
  856. X#define CMD_9         304
  857. X#define    CMD_eq             305
  858. X#define CMD_lp             306
  859. X#define CMD_rp             307
  860. X#define CMD_lp_s     308
  861. X#define CMD_rp_s     309
  862. X#define CMD_amp_a     310
  863. X#define CMD_amp_d     311
  864. X#define CMD_amp_f     312
  865. X#define CMD_amp_k     313
  866. X#define CMD_amp_l     314
  867. X#define CMD_amp_p     315
  868. X#define CMD_amp_s     316
  869. X#define CMD_star_b       317
  870. X#define CMD_star_c     318
  871. X#define CMD_star_p     319
  872. X#define CMD_star_r     320
  873. X#define CMD_star_t     321
  874. X#define PARAM_CONTINUE   401    /* Parameter tokens */
  875. X#define PARAM_END        402
  876. X#define PARAM_UNDEF      403
  877. X  /* Position codes */
  878. X#define POS_ABSOLUTE     501
  879. X#define POS_REL_POSITIVE 502
  880. X#define POS_REL_NEGATIVE 503
  881. X
  882. X  /* Global structure and type definitions
  883. X  */
  884. Xtypedef struct {        /* Input buffer */
  885. X  int   code;            /* The token code */
  886. X  int   length;            /* Number of characters put back */
  887. X  char  storage[MAX_BUFFER];    /* Storage for characters in the buffer */
  888. X} token;
  889. X
  890. X  /* Global variables
  891. X  */
  892. Xextern int    scan_state;    /* Controls which scanner is being used */
  893. Xextern char  *text;        /* Text read in for text tokens */
  894. Xextern char  *command;        /* Command read in */
  895. Xextern char   variable[];    /* Command parameter */
  896. Xextern char   number[];        /* Command numeric argument */
  897. Xextern int    pos_code;        /* Command numeric position code */
  898. Xextern token  curr_token;    /* Where to hold the scanned token */
  899. X
  900. X  /* Global macro definitions
  901. X  */
  902. X
  903. X  /* Global functions
  904. X  */
  905. Xextern int  scan();        /* The entry into the scanners */
  906. Xextern void scan_init();    /* Reset the input for the scanner */
  907. SHAR_EOF
  908. $TOUCH -am 0630160790 scan.h &&
  909. chmod 0644 scan.h ||
  910. echo "restore of scan.h failed"
  911. set `wc -c scan.h`;Wc_c=$1
  912. if test "$Wc_c" != "3044"; then
  913.     echo original size 3044, current size $Wc_c
  914. fi
  915. fi
  916. # ============= transform.c ==============
  917. if test X"$1" != X"-c" -a -f 'transform.c'; then
  918.     echo "File already exists: skipping 'transform.c'"
  919. else
  920. echo "x - extracting transform.c (Text)"
  921. sed 's/^X//' << 'SHAR_EOF' > transform.c &&
  922. X/* Program:        lj2ps
  923. X** File:       transform.c
  924. X**
  925. X** Author:       Christopher Lishka
  926. X** Organization:   Wisconsin State Laboratory of Hygiene
  927. X**           Data Processing Dept.
  928. X**
  929. X** Copyright (C) 1990 by Christopher Lishka.
  930. X**
  931. X** This program is free software; you can redistribute it and/or modify
  932. X** it under the terms of the GNU General Public License as published by
  933. X** the Free Software Foundation; either version 1, or (at your option)
  934. X** any later version.
  935. X**
  936. X** This program is distributed in the hope that it will be useful,
  937. X** but WITHOUT ANY WARRANTY; without even the implied warranty of
  938. X** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  939. X** GNU General Public License for more details.
  940. X**
  941. X** You should have received a copy of the GNU General Public License
  942. X** along with this program; if not, write to the Free Software
  943. X** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  944. X*/
  945. X
  946. Xstatic char * ModuleID = "Module transform: v1.0.1.2, production";
  947. X
  948. X  /* Include files
  949. X  */
  950. X#include <stdio.h>
  951. X#include "transform.h"
  952. X#include "scan.h"
  953. X#include "lj2ps.h"
  954. X#include "lj.h"
  955. X
  956. X  /* External definitions
  957. X  */
  958. X
  959. X  /* Global variables
  960. X  */
  961. X
  962. X  /* Global function list
  963. X  */
  964. Xextern void  transform();
  965. X
  966. X  /* Local constants
  967. X  */
  968. X
  969. X  /* Local structures and types
  970. X  */
  971. X
  972. X  /* Local variables
  973. X  */
  974. X
  975. X  /* Local macro definitions
  976. X  */
  977. X#define report(x)  fprintf(output_file, "%s", x);
  978. X
  979. X  /* Local function list
  980. X  */
  981. X
  982. X  /* Function bodies
  983. X  */
  984. X
  985. X  /* transform() reads text mixed with laserjet commands from its input
  986. X  ** and "magically" changes it to postscript on its output.  The magic
  987. X  ** is performed in a tight while-loop which acts as a simple decision
  988. X  ** table: for each token type (command, text, parameter) the appropriate
  989. X  ** action is done (which usually involves writing to stdout or calling
  990. X  ** an emulation function).
  991. X  */
  992. Xvoid
  993. Xtransform(input_file, output_file)
  994. X    FILE *input_file, *output_file;
  995. X{
  996. X
  997. X    /* Reset the scanner to read from the input */
  998. X  scan_init(input_file);
  999. X
  1000. X    /* While the input stream still has tokens, handle each token through
  1001. X    ** the switch() jump table.
  1002. X    */
  1003. X  scan_state = SS_TEXT;            /* Set the initial scan state */
  1004. X  while( scan() ){
  1005. X#ifdef DEBUG
  1006. X    if( debug ) fprintf(stderr, "{TOKEN:%d}", curr_token.code);
  1007. X#endif
  1008. X    switch( curr_token.code ){
  1009. X    case TEXT_CHAR:
  1010. X      if( (page_height - current_y) > (text_height + margin_top + LJ_ERROR) ){
  1011. X    lj_page_end(output_file);
  1012. X    lj_page_begin(output_file);
  1013. X      }
  1014. X      lj_text_add(output_file, text);
  1015. X      break;
  1016. X    case TEXT_NULL:        /* Ignore nulls */
  1017. X      warning("encountered a null; ignoring", "");
  1018. X      break;
  1019. X    case TEXT_lp:
  1020. X      lj_text_add(output_file, "\\(");
  1021. X      break;
  1022. X    case TEXT_rp:
  1023. X      lj_text_add(output_file, "\\)");
  1024. X      break;
  1025. X    case TEXT_bslash:
  1026. X      lj_text_add(output_file, "\\\\");
  1027. X      break;
  1028. X    case TEXT_NEWLINE:
  1029. X      if( (page_height - current_y) > (text_height + margin_top + LJ_ERROR) ){
  1030. X    lj_page_end(output_file);
  1031. X    lj_page_begin(output_file);
  1032. X      }
  1033. X      lj_nl(output_file);    /* Write out a newline */
  1034. X      current_line++;
  1035. X      break;
  1036. X    case TEXT_FORMFEED:
  1037. X      lj_page_end(output_file);
  1038. X      /* XXX insert page counting mechanism here! */
  1039. X      lj_page_begin(output_file);
  1040. X      break;
  1041. X    case TEXT_TAB:
  1042. X        /* XXX This should check for either font_p or font_s, and not assume
  1043. X    **     font_p automatically!
  1044. X    */
  1045. X      if( font_p.spacing == LJ_SP_PROPORTIONAL )
  1046. X    warning("a tab is being used with a proportional font!", "");
  1047. X      lj_text_end(output_file);
  1048. X      fputs("TAB ", output_file);
  1049. X      lj_text_begin();
  1050. X      break;
  1051. X    case TEXT_SH_IN:
  1052. X      warning("shift-in is not yet supported -- ignoring", "");
  1053. X      break;
  1054. X    case TEXT_SH_OUT:
  1055. X      warning("shift-out is not yet supported -- ignoring", "");
  1056. X      break;
  1057. X    case CMD_UNDEF:    ljcmd_undefined(input_file, output_file);   break;
  1058. X    case CMD_E:        ljcmd_E(output_file);                       break;
  1059. X    case CMD_Y:        ljcmd_Y(output_file);                        break;
  1060. X    case CMD_Z:        ljcmd_Z(output_file);                        break;
  1061. X    case CMD_9:        ljcmd_9(output_file);                        break;
  1062. X    case CMD_eq:    ljcmd_eq(output_file);                        break;
  1063. X    case CMD_lp:    ljcmd_lp(input_file, output_file);        break;
  1064. X    case CMD_rp:    ljcmd_rp(input_file, output_file);        break;
  1065. X    case CMD_lp_s:    ljcmd_lp_s(input_file, output_file);        break;
  1066. X    case CMD_rp_s:    ljcmd_rp_s(input_file, output_file);        break;
  1067. X    case CMD_amp_a:    ljcmd_amp_a(input_file, output_file);        break;
  1068. X    case CMD_amp_d:    ljcmd_amp_d(input_file, output_file);        break;
  1069. X    case CMD_amp_f:    ljcmd_amp_f(input_file, output_file);        break;
  1070. X    case CMD_amp_k:     ljcmd_amp_k(input_file, output_file);       break;
  1071. X    case CMD_amp_l:    ljcmd_amp_l(input_file, output_file);        break;
  1072. X    case CMD_amp_p:    ljcmd_amp_p(input_file, output_file);        break;
  1073. X    case CMD_amp_s:    ljcmd_amp_s(input_file, output_file);        break;
  1074. X    case CMD_star_b:    ljcmd_star_b(input_file, output_file);      break;
  1075. X    case CMD_star_c:    ljcmd_star_c(input_file, output_file);        break;
  1076. X    case CMD_star_p:    ljcmd_star_p(input_file, output_file);        break;
  1077. X    case CMD_star_r:    ljcmd_star_r(input_file, output_file);        break;
  1078. X    case CMD_star_t:    ljcmd_star_t(input_file, output_file);        break;
  1079. X    case PARAM_CONTINUE:
  1080. X    case PARAM_END:
  1081. X      internal_error("(end)parameter found in transform()", variable);
  1082. X      break;
  1083. X    default:
  1084. X      internal_error("illegal token encountered in transform()", "");
  1085. X    } /* switch(...) */
  1086. X  } /* while(...) */
  1087. X
  1088. X} /* transform() */
  1089. X
  1090. X
  1091. X
  1092. SHAR_EOF
  1093. $TOUCH -am 0630160790 transform.c &&
  1094. chmod 0644 transform.c ||
  1095. echo "restore of transform.c failed"
  1096. set `wc -c transform.c`;Wc_c=$1
  1097. if test "$Wc_c" != "5589"; then
  1098.     echo original size 5589, current size $Wc_c
  1099. fi
  1100. fi
  1101. # ============= transform.h ==============
  1102. if test X"$1" != X"-c" -a -f 'transform.h'; then
  1103.     echo "File already exists: skipping 'transform.h'"
  1104. else
  1105. echo "x - extracting transform.h (Text)"
  1106. sed 's/^X//' << 'SHAR_EOF' > transform.h &&
  1107. X/*
  1108. X** Project:        lj2ps
  1109. X** File:        transform.h
  1110. X**
  1111. X** Author:        Christopher Lishka
  1112. X** Organization:    Wisconsin State Laboratory of Hygiene
  1113. X**            Data Processing Dept.
  1114. X**
  1115. X** Copyright (C) 1990 by Christopher Lishka.
  1116. X**
  1117. X** This program is free software; you can redistribute it and/or modify
  1118. X** it under the terms of the GNU General Public License as published by
  1119. X** the Free Software Foundation; either version 1, or (at your option)
  1120. X** any later version.
  1121. X**
  1122. X** This program is distributed in the hope that it will be useful,
  1123. X** but WITHOUT ANY WARRANTY; without even the implied warranty of
  1124. X** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1125. X** GNU General Public License for more details.
  1126. X**
  1127. X** You should have received a copy of the GNU General Public License
  1128. X** along with this program; if not, write to the Free Software
  1129. X** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1130. X*/
  1131. X
  1132. X  /* Global constants
  1133. X  */
  1134. X
  1135. X  /* Global structure and type definitions
  1136. X  */
  1137. X
  1138. X  /* Global variables
  1139. X  */
  1140. X
  1141. X  /* Global macro definitions
  1142. X  */
  1143. X
  1144. X  /* Global functions
  1145. X  */
  1146. Xextern void  transform();
  1147. SHAR_EOF
  1148. $TOUCH -am 0630160790 transform.h &&
  1149. chmod 0644 transform.h ||
  1150. echo "restore of transform.h failed"
  1151. set `wc -c transform.h`;Wc_c=$1
  1152. if test "$Wc_c" != "1091"; then
  1153.     echo original size 1091, current size $Wc_c
  1154. fi
  1155. fi
  1156. exit 0
  1157.  
  1158.