xref: /original-bsd/contrib/dungeon/lex.c (revision b8338845)
1 #define FALSE	0
2 #define TRUE	1
3 
4 lex_(inbuf, inlnt, outbuf, op, vbflag, lprscon)
5 	char inbuf[78];
6 	int outbuf[40], *inlnt, *op, *vbflag;
7 	int *lprscon;	/* added */
8 {
9 	/*
10 	 * lex - lexical analyzer, converted from fortran
11 	 *
12 	 * input: one line of ascii characters
13 	 * output: tokenized input, packed in radix-50 format
14 	 */
15 
16 	char	j;
17 	int	cp, i, k, prsptr;
18 	static int	num601 = {601};
19 
20 	for (i=0; i<40; i++)
21 		outbuf[i] = 0;
22 	*op = -1;
23 	prsptr = *lprscon - 1;
24 	/* printf("lex: inbuf=%s, inlnt=%d\n", inbuf, *inlnt); */
25 
26 toknlp:
27 	*op += 2;
28 	cp = 0;
29 	while ((*lprscon)++ <= *inlnt) {
30 		j = inbuf[prsptr++];
31 		/* printf("lex: chr=%c\n", j); */
32 		if ((j == '.') || (j == ','))
33 			break;
34 		else if (j == ' ')
35 			if (cp)		/* if (cp != 0) */
36 				goto toknlp;
37 			else
38 				continue;   /* first token */
39 		else if ((j >= 'A') && (j <= 'Z'))
40 			j -= '@';
41 		else if (((j >= '1') && (j <= '9')) || (j == '-'))
42 			j -= 0x12;
43 		else {
44 			if (*vbflag)
45 				rspeak_(&num601);
46 			return(FALSE);
47 		}
48 
49 		if (cp >= 6)
50 			/*
51 			 * ignore remainder of any token > 6 chars
52 			 */
53 			continue;
54 		/*
55 		 * pack three chars per word in radix-50 format
56 		 */
57 		k = *op + (cp/3) - 1;
58 		/* printf("*op=%d, cp=%d, k=%d\n", *op, cp, k); */
59 		switch (cp%3) {
60 			case 0:
61 				outbuf[k] += j * 1560;
62 			case 1:
63 				outbuf[k] += j * 39;
64 			case 2:
65 				outbuf[k] += j;
66 		}
67 		cp++;
68 	}
69 	if (*lprscon > *inlnt)
70 		*lprscon = 1;
71 	if (!cp)	/* if (cp == 0) */
72 		if (*op == 1)
73 			return(FALSE);   /* no valid tokens */
74 		else {
75 			*op -= 2;
76 			return(TRUE);
77 		};
78 }
79