This is scan.c in view mode; [Download] [Up]
/* Project: lj2ps
** File: scan.c
**
** Author: Christopher Lishka
** Organization: Wisconsin State Laboratory of Hygiene
** Data Processing Dept.
**
** Copyright (C) 1990 by Christopher Lishka.
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 1, or (at your option)
** any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
static char * ModuleID = "Module scan: v1.0.1.2, production";
/* Include files
*/
#include <stdio.h>
#if defined (NeXT)
#include <stdlib.h>
#endif
#include <ctype.h>
#include "scan.h"
#include "lj.h"
#include "lj2ps.h"
/* External definitions
*/
/* Global variables
*/
int scan_state; /* Controls which scanner is being used */
char *text; /* Text read in for text tokens */
char *command; /* Command read in */
char variable[MAX_BUFFER]; /* Command parameter */
char number[MAX_BUFFER]; /* Command numeric argument */
int pos_code; /* Command numeric position code */
token curr_token; /* Where to hold the scanned token */
/* Global function list
*/
extern int scan(); /* The entry into the scanners */
extern void scan_init(); /* Reset the input for the scanner */
/* Local constants
*/
/* Scanner state constants */
/* These two constants allow access to the START and END states. I do not
** recommend changing the actual values for them, because they need to be
** defined to the same value for *all* scanners in here.
*/
#define START 1
#define END 0
/* Text scanner states */
#define ST____ END /* End...must be zero! */
#define ST_STT START /* Start */
#define ST_CMD 2 /* Command */
#define ST_CMA 3 /* Command & */
#define ST_CMS 4 /* Command * */
#define ST_TLP 5 /* END: Text ( */
#define ST_TRP 6 /* END: Text ) */
#define ST_TBS 7 /* END: Text \ */
#define ST_TNL 8 /* END: Text \n */
#define ST_TFF 9 /* END: Text \f */
#define ST_UNK 10 /* END: Error: unknown command */
#define ST_CEQ 11 /* END: Command = */
#define ST_C9 12 /* END: Command 9 */
#define ST_CZ 13 /* END: Command Z */
#define ST_CY 14 /* END: Command Y */
#define ST_CE 15 /* END: Command E */
#define ST_CAa 16 /* END: Command &a */
#define ST_CAd 17 /* END: Command &d */
#define ST_CAf 18 /* END: Command &f */
#define ST_CAk 19 /* END: Command &k */
#define ST_CAl 20 /* END: Command &l */
#define ST_CAp 21 /* END: Command &p */
#define ST_CAs 22 /* END: Command &s */
#define ST_CSt 23 /* END: Command *t */
#define ST_CSr 24 /* END: Command *r */
#define ST_CSp 25 /* END: Command *p */
#define ST_CSc 26 /* END: Command *c */
#define ST_CSb 27 /* END: Command *b */
#define ST_CLs 28 /* END: Command (s */
#define ST_CRs 29 /* END: Command )s */
#define ST_CLP 30 /* END: Command ( */
#define ST_CRP 31 /* END: Command ) */
#define ST_TXT 32 /* END: Text */
#define ST_NUL 33 /* END: Null */
#define ST_TTB 34 /* END: Tab */
#define ST_TSI 35 /* END: Shift in */
#define ST_TSO 36 /* END: Shift out */
#define ST_MAX 37 /* End of these states */
/* Parameter scanner states */
#define SP____ END /* End state */
#define SP_PRM START /* Parameter */
#define SP_INT 2 /* Integer */
#define SP_FLP 3 /* Floating point */
#define SP_PEO 4 /* END: Parameter end -- other (no argument) */
#define SP_PE 5 /* END: Parameter end -- normal */
#define SP_PC 6 /* END: Parameter continue */
#define SP_UNK 7 /* END: Unknown command */
#define SP_MAX 8 /* End of these states */
/* Text scanner character classes */
#define CST___ 0 /* All other characters */
#define CST_LP 1 /* ( */
#define CST_RP 2 /* ) */
#define CST_BS 3 /* \ */
#define CST_NL 4 /* \n */
#define CST_FF 5 /* \f */
#define CST_NU 6 /* \0 */
#define CST_ES 7 /* ^[ */
#define CST_EQ 8 /* = */
#define CST_AM 9 /* & */
#define CST_AS 10 /* * */
#define CST_9 11 /* 9 */
#define CST_E 12 /* E */
#define CST_Y 13 /* Y */
#define CST_Z 14 /* Z */
#define CST_a 15 /* a */
#define CST_b 16 /* b */
#define CST_c 17 /* c */
#define CST_d 18 /* d */
#define CST_f 19 /* f */
#define CST_k 20 /* k */
#define CST_l 21 /* l */
#define CST_p 22 /* p */
#define CST_r 23 /* r */
#define CST_s 24 /* s */
#define CST_t 25 /* t */
#define CST_EF 26 /* EOF */
#define CST_TB 27 /* Tab */
#define CST_SI 28 /* Shift in */
#define CST_SO 29 /* Shift out */
#define CST_MAX 30 /* End of these classes */
/* Parameter scanner character classes */
#define CSP___ 0 /* All other characters */
#define CSP_SI 1 /* + - */
#define CSP_DI 2 /* 0 1 2 3 4 5 6 7 8 9 */
#define CSP_PE 3 /* . */
#define CSP_LW 4 /* a-z */
#define CSP_US 5 /* A-Z ! " # $ % & ' ( ) * , / : */
/* ; < = > ? @ [ \ ] ^ _ ` { | } ~ */
#define CSP_EF 6 /* EOF */
#define CSP_MAX 7 /* End of these classes */
/* Local structures and types
*/
/* The text buffer */
typedef struct { /* Input buffer */
int length; /* Number of characters put back */
char storage[MAX_BUFFER]; /* Storage for characters in the buffer */
} buffer;
/* Local variables
*/
static FILE *in_file; /* Input file */
static char curr_char; /* The current character */
static int end_of_file; /* True if at the end_of_file */
static buffer input; /* Buffer to hold put-back characters */
/* The text scanner state/input table */
static int st_states[ST_MAX][CST_MAX] = {
/* Legend:
**{ CST___, CST_LP, CST_RP, CST_BS, CST_NL, CST_FF, CST_NU, CST_ES,
** CST_EQ, CST_AM, CST_AS, CST_9 , CST_E , CST_Y , CST_Z , CST_a ,
** CST_b , CST_c , CST_d , CST_f , CST_k , CST_l , CST_p , CST_r ,
** CST_s , CST_t , CST_EF, CST_TB, CST_SI, CST_SO },
*/
/* ST____: END*/
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_STT: Start */
{ ST_TXT, ST_TLP, ST_TRP, ST_TBS, ST_TNL, ST_TFF, ST_NUL, ST_CMD,
ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT,
ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT,
ST_TXT, ST_TXT, ST____, ST_TTB, ST_TSI, ST_TSO },
/* ST_CMD: Command */
{ ST_UNK, ST_CLP, ST_CRP, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK,
ST_CEQ, ST_CMA, ST_CMS, ST_C9 , ST_CE , ST_CY , ST_CZ , ST_UNK,
ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK,
ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK },
/* ST_CMA: Command & */
{ ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK,
ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_CAa,
ST_UNK, ST_UNK, ST_CAd, ST_CAf, ST_CAk, ST_CAl, ST_CAp, ST_UNK,
ST_CAs, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK },
/* ST_CMS: Command * */
{ ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK,
ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_UNK,
ST_CSb, ST_CSc, ST_UNK, ST_UNK, ST_UNK, ST_UNK, ST_CSp, ST_CSr,
ST_UNK, ST_CSt, ST_UNK, ST_UNK, ST_UNK, ST_UNK },
/* ST_TLP: END: Text ( */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_TRP: END: Text ) */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_TBS: END: Text \ */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_TNL: END: Text \n */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_TFF: END: Text \f */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_UNK: END: Error: unknown command */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CEQ: END: Command = */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_C9:* END: Command 9 */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CZ:* END: Command Z */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CY:* END: Command Y */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CE:* END: Command E */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CAa: END: Command &a */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CAd: END: Command &d */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CAf: END: Command &f */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CAk: END: Command &k */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CAl: END: Command &l */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CAp: END: Command &p */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CAs: END: Command &s */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CSt: END: Command *t */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CSr: END: Command *r */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CSp: END: Command *p */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CSc: END: Command *c */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CSb: END: Command *b */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CLs: END: Command (s */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CRs: END: Command )s */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_CLP: END: Command ( */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST_CLs, ST____, ST____, ST____, ST____, ST____ },
/* ST_CRP: END: Command ) */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST_CRs, ST____, ST____, ST____, ST____, ST____ },
/* ST_TXT: END: Text */
{ ST_TXT, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT,
ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT, ST_TXT,
ST_TXT, ST_TXT, ST____, ST____, ST____, ST____ },
/* ST_NUL: END: Null */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_TTB: END: Tab */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_TSI: END: Shift in */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ },
/* ST_TSO: END: Shift out */
{ ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____, ST____, ST____,
ST____, ST____, ST____, ST____, ST____, ST____ }
};
static int sp_states[SP_MAX][CSP_MAX] = {
/* Legend:
**{ CSP___, CSP_SI, CSP_DI, CSP_PE, CSP_LW, CSP_US, CSP_EF }
*/
/* SP____: Error */
{ SP____, SP____, SP____, SP____, SP____, SP____, SP____ },
/* SP_PRM: Parameter */
{ SP_PEO, SP_INT, SP_INT, SP_PEO, SP_PC , SP_PE , SP_UNK },
/* SP_INT: Integer */
{ SP_UNK, SP_PE , SP_INT, SP_FLP, SP_PC , SP_PE , SP_UNK },
/* SP_FLP: Floating point */
{ SP_UNK, SP_PE , SP_FLP, SP_PE , SP_PC , SP_PE , SP_UNK },
/* SP_PEO: END: Parameter end -- other (no argument) */
{ SP____, SP____, SP____, SP____, SP____, SP____, SP____ },
/* SP_PE: END: Parameter end -- normal */
{ SP____, SP____, SP____, SP____, SP____, SP____, SP____ },
/* SP_PC: END: Parameter continue */
{ SP____, SP____, SP____, SP____, SP____, SP____, SP____ },
/* SP_UNK: END: Unknown command */
{ SP____, SP____, SP____, SP____, SP____, SP____, SP____ }
};
static int st_classes[256] = {
/* 00 */ CST_NU, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 08 */ CST___, CST_TB, CST_NL, CST___, CST_FF, CST___, CST_SO, CST_SI,
/* 10 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 18 */ CST___, CST___, CST___, CST_ES, CST___, CST___, CST___, CST___,
/* 20 */ CST___, CST___, CST___, CST___, CST___, CST___, CST_AM, CST___,
/* 28 */ CST_LP, CST_RP, CST_AS, CST___, CST___, CST___, CST___, CST___,
/* 30 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 38 */ CST___, CST_9 , CST___, CST___, CST___, CST_EQ, CST___, CST___,
/* 40 */ CST___, CST___, CST___, CST___, CST___, CST_E , CST___, CST___,
/* 48 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 50 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 58 */ CST___, CST_Y , CST_Z , CST___, CST_BS, CST___, CST___, CST___,
/* 60 */ CST___, CST_a , CST_b , CST_c , CST_d , CST___, CST_f , CST___,
/* 68 */ CST___, CST___, CST___, CST_k , CST_l , CST___, CST___, CST___,
/* 70 */ CST_p , CST___, CST_r , CST_s , CST_t , CST___, CST___, CST___,
/* 78 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 80 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 88 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 90 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* 98 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* a0 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* a8 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* b0 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* b8 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* c0 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* c8 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* d0 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* d8 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* e0 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* e8 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* f0 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___,
/* f8 */ CST___, CST___, CST___, CST___, CST___, CST___, CST___, CST___
};
static int sp_classes[256] = {
/* 00 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* 08 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* 10 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* 18 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* 20 */ CSP___, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US,
/* 28 */ CSP_US, CSP_US, CSP_US, CSP_SI, CSP_US, CSP_SI, CSP_PE, CSP_US,
/* 30 */ CSP_DI, CSP_DI, CSP_DI, CSP_DI, CSP_DI, CSP_DI, CSP_DI, CSP_DI,
/* 38 */ CSP_DI, CSP_DI, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US,
/* 40 */ CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US,
/* 48 */ CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US,
/* 50 */ CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US,
/* 58 */ CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US, CSP_US,
/* 60 */ CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW,
/* 68 */ CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW,
/* 70 */ CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW, CSP_LW,
/* 78 */ CSP_LW, CSP_LW, CSP_LW, CSP_US, CSP_US, CSP_US, CSP_US, CSP___,
/* 80 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* 88 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* 90 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* 98 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* a0 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* a8 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* b0 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* b8 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* c0 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* c8 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* d0 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* d8 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* e0 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* e8 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* f0 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___,
/* f8 */ CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___, CSP___
};
/* Local macro definitions
*/
/* Local function list
*/
static void parse_argument();
/* Function bodies
*/
/* scan() is the front_end to the scanner. It runs the proper scanner,
** based on the value of scan_state. It returns a token number if the
** scan was successful, or zero if the end-of-file was reached.
*/
int
scan()
{
register int prev_state; /* The previous state */
register int curr_state; /* The current state */
rescan:
curr_token.storage[0] = '\0'; curr_token.length = 0;
curr_state = START;
do{ /* Main scanning loop */
prev_state = curr_state;
/* Get the next character */
if( input.length > 0 ){
curr_char = input.storage[--input.length];
}
else{
if( (curr_char = getc(in_file)) == EOF)
end_of_file = 1;
else
end_of_file = 0;
}
#ifdef DEBUG
if( debug == 2 ) fputc(curr_char, stderr);
#endif
if( !end_of_file ){
#ifdef DEBUG
if( debug == 3 ){
switch( scan_state ){
case SS_TEXT:
fprintf(stderr,
"TEXT curr % 3.3d (prev % 3.3d) char %c (0x%2.2x) class % 3.3d -> % 3.3d\n",
curr_state, prev_state,
curr_char, (int) curr_char, st_classes[curr_char],
st_states[curr_state][st_classes[curr_char]]
);
break;
case SS_PARAM:
fprintf(stderr,
"TEXT curr % 3.3d (prev % 3.3d) char %c (0x%2.2x) class % 3.3d -> % 3.3d\n",
curr_state, prev_state,
curr_char, (int) curr_char, sp_classes[curr_char],
sp_states[curr_state][sp_classes[curr_char]]
);
break;
default:
internal_error("illegal scan state in scan()", "");
} /* switch( ... ) */
} /* if( debug ... ) */
#endif
switch( scan_state ){
case SS_TEXT:
if( (curr_state = st_states[curr_state][st_classes[curr_char]])
== END ){
/* Put back character */
if( input.length == MAX_BUFFER ){
internal_error("you blew the put-back buffer!", "");
}
else{
input.storage[input.length] = curr_char;
input.length++;
}
}
else{
/* Accept character */
if( curr_token.length == MAX_BUFFER ){
internal_error("current token is too large", "");
}
else{
curr_token.storage[curr_token.length] = curr_char;
curr_token.length++;
}
}
break;
case SS_PARAM:
if( (curr_state = sp_states[curr_state][sp_classes[curr_char]])
== END ){
/* Put back character */
if( input.length == MAX_BUFFER ){
internal_error("you blew the put-back buffer!", "");
}
else{
input.storage[input.length] = curr_char;
input.length++;
}
}
else{
/* Accept character */
if( curr_token.length == MAX_BUFFER ){
internal_error("current token is too large", "");
}
else{
curr_token.storage[curr_token.length] = curr_char;
curr_token.length++;
}
}
break;
default:
internal_error("illegal scan state in scan()", "");
} /* switch(...) */
} /* if( !eof ) */
else{
switch( scan_state ){
case SS_TEXT:
if( (curr_state = st_states[curr_state][CST_EF])
!= END ){
fatal_error("end-of-file found in a command", "");
}
break;
case SS_PARAM:
if( (curr_state = sp_states[curr_state][CSP_EF])
!= END ){
fatal_error("end-of-file found in a command", "");
}
break;
default:
internal_error("illegal scan state in scan()", "");
} /* switch(...) */
} /* else( !eof ) */
} while( curr_state != END );
/* If this point is reached, then an entire token has been scanned.
** The token must be properly saved, and then the appropriate token
** action must be performed. The switch() and embedded switch()'s
** perform the necessary token actions for each state.
*/
curr_token.storage[curr_token.length] = '\0';
switch( scan_state ){
case SS_TEXT:
switch( prev_state ){
case ST_TLP: scan_state = SS_TEXT; curr_token.code = TEXT_lp; break;
case ST_TRP: scan_state = SS_TEXT; curr_token.code = TEXT_rp; break;
case ST_TBS: scan_state = SS_TEXT; curr_token.code = TEXT_bslash; break;
case ST_TNL: scan_state = SS_TEXT; curr_token.code = TEXT_NEWLINE; break;
case ST_TFF: scan_state = SS_TEXT; curr_token.code = TEXT_FORMFEED;break;
case ST_UNK:
warning("LaserJet command not supported", curr_token.storage);
scan_state = SS_TEXT; goto rescan;
case ST_CEQ: scan_state = SS_TEXT; curr_token.code = CMD_eq; break;
case ST_C9 : scan_state = SS_TEXT; curr_token.code = CMD_9; break;
case ST_CZ : scan_state = SS_TEXT; curr_token.code = CMD_Z; break;
case ST_CY : scan_state = SS_TEXT; curr_token.code = CMD_Y; break;
case ST_CE : scan_state = SS_TEXT; curr_token.code = CMD_E; break;
case ST_CAa: scan_state = SS_PARAM; curr_token.code = CMD_amp_a; break;
case ST_CAd: scan_state = SS_PARAM; curr_token.code = CMD_amp_d; break;
case ST_CAf: scan_state = SS_PARAM; curr_token.code = CMD_amp_f; break;
case ST_CAk: scan_state = SS_PARAM; curr_token.code = CMD_amp_k; break;
case ST_CAl: scan_state = SS_PARAM; curr_token.code = CMD_amp_l; break;
case ST_CAp: scan_state = SS_PARAM; curr_token.code = CMD_amp_p; break;
case ST_CAs: scan_state = SS_PARAM; curr_token.code = CMD_amp_s; break;
case ST_CSt: scan_state = SS_PARAM; curr_token.code = CMD_star_t; break;
case ST_CSr: scan_state = SS_PARAM; curr_token.code = CMD_star_r; break;
case ST_CSp: scan_state = SS_PARAM; curr_token.code = CMD_star_p; break;
case ST_CSc: scan_state = SS_PARAM; curr_token.code = CMD_star_c; break;
case ST_CSb: scan_state = SS_PARAM; curr_token.code = CMD_star_b; break;
case ST_CLs: scan_state = SS_PARAM; curr_token.code = CMD_lp_s; break;
case ST_CRs: scan_state = SS_PARAM; curr_token.code = CMD_rp_s; break;
case ST_CLP: scan_state = SS_PARAM; curr_token.code = CMD_lp; break;
case ST_CRP: scan_state = SS_PARAM; curr_token.code = CMD_rp; break;
case ST_TXT: scan_state = SS_TEXT; curr_token.code = TEXT_CHAR; break;
case ST_NUL: scan_state = SS_TEXT; curr_token.code = TEXT_NULL; break;
case ST_TTB: scan_state = SS_TEXT; curr_token.code = TEXT_TAB; break;
case ST_TSI: scan_state = SS_TEXT; curr_token.code = TEXT_SH_IN; break;
case ST_TSO: scan_state = SS_TEXT; curr_token.code = TEXT_SH_OUT; break;
case ST____:
case ST_STT:
case ST_CMD:
case ST_CMA:
case ST_CMS:
default:
if( !end_of_file ){
internal_error("illegal state in text scanner token actions", "");
}
} /* switch( text scanner ) */
break;
case SS_PARAM:
switch( prev_state ){
case SP_PE :
scan_state = SS_TEXT;
curr_token.code = PARAM_END;
parse_argument();
break;
case SP_PC :
scan_state = SS_PARAM;
curr_token.code = PARAM_CONTINUE;
parse_argument();
break;
case SP_PEO:
scan_state = SS_TEXT;
curr_token.code = PARAM_END;
parse_argument();
break;
case SP_UNK:
warning("illegal character in command parameter", curr_token.storage);
scan_state = SS_TEXT; goto rescan;
case SP____:
case SP_PRM:
case SP_INT:
case SP_FLP:
default:
internal_error("illegal state in parameter scanner token actions", "");
} /* switch( parameter scanner ) */
break;
default:
internal_error("illegal scan state in token actions", "");
} /* switch( scan_state ) */
return( !end_of_file );
} /* scan() */
/* scan_init() initializes the scanner to a new input stream. This is
** accomplished by reseting the scan_state, clearing the put-back buffer,
** and various other minor tasks.
*/
void
scan_init(file)
FILE *file;
{
/* Initialize the scan state */
scan_state = SS_TEXT;
/* Save the handle to the file */
in_file = file;
end_of_file = 0;
/* Reset the buffer */
input.length = 0;
/* Miscellaneous */
text = curr_token.storage;
command = curr_token.storage;
} /* scan_init() */
static void
parse_argument()
{
/* Determine whether or not the command has a numeric argument */
if( curr_token.length == 1 ){ /* No numeric argument */
number[0] = '0'; /* Set number = "0" */
number[1] = '\0';
pos_code = POS_ABSOLUTE; /* Set to a constant value */
}
else{ /* Numeric argument present */
/* Check if it is a relative offset */
if( !isdigit(curr_token.storage[0]) ){
if( curr_token.storage[0] == '+' ) pos_code = POS_REL_POSITIVE;
else if( curr_token.storage[0] == '-' ) pos_code = POS_REL_NEGATIVE;
else internal_error("illegal relative offset", curr_token.storage);
}
else{
pos_code = POS_ABSOLUTE;
}
/* Record the scalar value */
if( pos_code == POS_ABSOLUTE ){
(void) strncpy(number, curr_token.storage, curr_token.length - 1);
number[curr_token.length - 1] = '\0';
}
else{
(void) strncpy(number, &(curr_token.storage)[1], curr_token.length - 2);
number[curr_token.length - 2] = '\0';
}
}
/* Finally, record the command as an *upper-case* single digit string */
variable[0] = curr_token.storage[curr_token.length - 1];
variable[1] = '\0';
if( islower(variable[0]) ) variable[0] = toupper(variable[0]);
} /* parse_argument() */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.