2 * (C) Copyright 2007-2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
4 * This file is released under the GPLv2. See the COPYING file for more
11 #include <directory.h>
14 #include "direct_grammar.h"
16 static int __fill(struct lexer *lexer, int n)
18 char buf[CONFIG_LRECL];
22 if (unlikely(!lexer->init)) {
23 /* look up the directory file */
24 lexer->file = edf_lookup(lexer->fs, sysconf.direct_fn, sysconf.direct_ft);
25 if (IS_ERR(lexer->file))
26 return PTR_ERR(lexer->file);
28 if ((lexer->file->FST.LRECL != CONFIG_LRECL) ||
29 (lexer->file->FST.RECFM != FSTDFIX))
33 lexer->buflen = sizeof(lexer->buf);
40 lexer->filllen -= lexer->recoff;
41 memmove(lexer->buf, &lexer->buf[lexer->recoff], lexer->filllen);
45 assert(lexer->filllen < CONFIG_LRECL);
47 ret = edf_read_rec(lexer->file, buf, lexer->recno++);
51 ebcdic2ascii((u8*) buf, CONFIG_LRECL);
52 ascii2upper((u8*) buf, CONFIG_LRECL);
54 /* find the last non-blank */
55 for(end=CONFIG_LRECL-1; end>=0; end--)
59 for(i=0; (i<CONFIG_LRECL) && (i<end+1); i++)
60 lexer->buf[lexer->filllen+i] = buf[i];
62 lexer->buf[lexer->filllen+i] = '\n';
63 lexer->filllen += i+1;
67 #define YYFILL(n) do { \
69 int off = cur - &lexer->buf[lexer->recoff]; \
70 ret = __fill(lexer, (n)); \
71 if (ret && !(lexer->filllen - lexer->recoff)) \
73 cur = &lexer->buf[off]; \
75 #define YYRETURN(x) do { \
76 lexer->recoff = cur - lexer->buf; \
79 #define YYSKIP() do { \
80 lexer->recoff = cur - lexer->buf; \
83 int direct_lex(void *data, void *yyval)
85 struct lexer *lexer = data;
90 cur = &lexer->buf[lexer->recoff];
93 re2c:define:YYCTYPE = "char";
94 re2c:define:YYCURSOR = cur;
95 re2c:define:YYLIMIT = &lexer->buf[lexer->filllen];
96 "\n" { YYRETURN(NLINE); }
97 "*" [^\n]* { YYRETURN(COMMENT); }
98 "USER" { YYRETURN(USER); }
99 "MACHINE" { YYRETURN(MACHINE); }
100 "STORAGE" { YYRETURN(STORAGE); }
101 "CONSOLE" { YYRETURN(CONSOLE); }
102 "SPOOL" { YYRETURN(SPOOL); }
103 "READER" { YYRETURN(READER); }
104 "PUNCH" { YYRETURN(PUNCH); }
105 "PRINT" { YYRETURN(PRINT); }
106 "MDISK" { YYRETURN(MDISK); }
107 [0-9]+[KMGTP] { hex(&lexer->buf[lexer->recoff], cur-1, &val->num);
108 bcd2dec(val->num, &val->num);
110 case 'P': val->num *= 1024;
111 case 'T': val->num *= 1024;
112 case 'G': val->num *= 1024;
113 case 'M': val->num *= 1024;
114 case 'K': val->num *= 1024;
119 [0-9A-F]+ { hex(&lexer->buf[lexer->recoff], cur, &val->num);
123 len = cur-&lexer->buf[lexer->recoff];
124 memcpy(lexer->retbuf, &lexer->buf[lexer->recoff], len);
125 lexer->retbuf[len] = '\0';
126 val->ptr = strdup(lexer->retbuf, ZONE_NORMAL);