summaryrefslogtreecommitdiffstats
path: root/usr.bin/colldef/scan.l
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1995-02-17 17:29:50 +0000
committerache <ache@FreeBSD.org>1995-02-17 17:29:50 +0000
commitc6349924aa7d67be521264ae9a91dad452d2b244 (patch)
tree235ae344fbaf3bc46d9fd7825b7763044594a183 /usr.bin/colldef/scan.l
downloadFreeBSD-src-c6349924aa7d67be521264ae9a91dad452d2b244.zip
FreeBSD-src-c6349924aa7d67be521264ae9a91dad452d2b244.tar.gz
collate tables compiler
Submitted by: alex@elvisti.kiev.ua
Diffstat (limited to 'usr.bin/colldef/scan.l')
-rw-r--r--usr.bin/colldef/scan.l212
1 files changed, 212 insertions, 0 deletions
diff --git a/usr.bin/colldef/scan.l b/usr.bin/colldef/scan.l
new file mode 100644
index 0000000..3be0463
--- /dev/null
+++ b/usr.bin/colldef/scan.l
@@ -0,0 +1,212 @@
+%x string name charmap
+%{
+/*-
+ * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
+ * at Electronni Visti IA, Kiev, Ukraine.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id: scan.l,v 1.1 1995/01/22 20:37:31 alex Exp alex $
+ */
+
+#include <err.h>
+#include <unistd.h>
+#include <string.h>
+#include <sysexits.h>
+#include "collate.h"
+#include "y.tab.h"
+
+int line_no = 1;
+u_char buf[STR_LEN], *ptr;
+FILE *map_fp;
+YY_BUFFER_STATE main_buf, map_buf;
+#ifdef FLEX_DEBUG
+YYSTYPE yylval;
+#endif /* FLEX_DEBUG */
+%}
+%%
+<INITIAL,charmap>[ \t] ;
+\" { ptr = buf; BEGIN(string); }
+\< { ptr = buf; BEGIN(name); }
+^#.*\n line_no++;
+^\n line_no++;
+\\\n line_no++;
+\\t { yylval.ch = '\t'; return CHAR; }
+\\n { yylval.ch = '\n'; return CHAR; }
+\\b { yylval.ch = '\b'; return CHAR; }
+\\f { yylval.ch = '\f'; return CHAR; }
+\\v { yylval.ch = '\v'; return CHAR; }
+\\r { yylval.ch = '\r'; return CHAR; }
+\\a { yylval.ch = '\a'; return CHAR; }
+\\. { yylval.ch = yytext[1]; return CHAR; }
+<INITIAL,charmap>\n { line_no++; return '\n'; }
+[;,{}()] return *yytext;
+substitute return SUBSTITUTE;
+with return WITH;
+order return ORDER;
+charmap BEGIN(charmap);
+;[ \t]*\.\.\.[ \t]*; return RANGE;
+\\[0-7]{3} {
+ u_int v;
+
+ sscanf(&yytext[1], "%o", &v);
+ yylval.ch = (u_char)v;
+ return CHAR;
+}
+\\x[0-9a-z]{2} {
+ u_int v;
+
+ sscanf(&yytext[2], "%x", &v);
+ yylval.ch = (u_char)v;
+ return CHAR;
+}
+[^;,{}() \t\n"<]+ {
+ if(yyleng == 1) {
+ yylval.ch = *yytext;
+ return CHAR;
+ }
+ if(yyleng > STR_LEN - 1)
+ errx(EX_UNAVAILABLE, "chain buffer overflaw near line %u",
+ line_no);
+ strcpy(yylval.str, yytext);
+ return CHAIN;
+}
+<name>\\\> {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '>';
+}
+<string>\\\" {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '"';
+}
+<name>\> {
+ *ptr = '\0';
+ strcpy(yylval.str, buf);
+ BEGIN(INITIAL);
+ return NAME;
+}
+<string>\" {
+ *ptr = '\0';
+ strcpy(yylval.str, buf);
+ BEGIN(INITIAL);
+ return STRING;
+}
+<name,string>. {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = *yytext;
+}
+<name,string>\\t {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '\t';
+}
+<name,string>\\b {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '\b';
+}
+<name,string>\\f {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '\f';
+}
+<name,string>\\v {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '\v';
+}
+<name,string>\\n {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '\n';
+}
+<name,string>\\r {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '\r';
+}
+<name,string>\\a {
+ if(ptr >= buf + sizeof(buf) - 1)
+ errx(EX_UNAVAILABLE, "name/string buffer overflaw near line %u",
+ line_no);
+ *ptr++ = '\a';
+}
+<name,string><<EOF>> {
+ errx(EX_UNAVAILABLE, "unterminated name/string near line %u", line_no);
+}
+<name,string>\\x[0-9a-f]{2} {
+ u_int v;
+
+ sscanf(&yytext[2], "%x", &v);
+ *ptr++ = (u_char)v;
+}
+<name,string>\\[0-7]{3} {
+ u_int v;
+
+ sscanf(&yytext[1], "%o", &v);
+ *ptr++ = (u_char)v;
+}
+<charmap>[^ \t\n]+ {
+ if((map_fp = fopen(yytext, "r")) == 0)
+ err(EX_UNAVAILABLE, "can't open charmap file %s near line %u",
+ yytext, line_no);
+ map_buf = yy_new_buffer(map_fp, YY_BUF_SIZE);
+ main_buf = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer(map_buf);
+ BEGIN(INITIAL);
+}
+<charmap><<EOF>> {
+ errx(EX_UNAVAILABLE, "charmap file name expected near line %u",
+ line_no);
+}
+<<EOF>> {
+ if(map_fp) {
+ yy_switch_to_buffer(main_buf);
+ yy_delete_buffer(map_buf);
+ fclose(map_fp);
+ map_fp = 0;
+ }
+ else
+ yyterminate();
+}
+%%
+#ifdef FLEX_DEBUG
+main()
+{
+ while(yylex())
+ ;
+ return 0;
+}
+#endif /* FLEX_DEBUG */
OpenPOWER on IntegriCloud