summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1999-02-13 14:14:47 +0000
committerache <ache@FreeBSD.org>1999-02-13 14:14:47 +0000
commit4ecd2d2e401c699a8548987c45ef6217f0230e08 (patch)
tree6de78743c28c477c7da24a8faf2c91815f2579c3
parent4124fd16f07b85b33874d6ba88f393123b8f7d4f (diff)
downloadFreeBSD-src-4ecd2d2e401c699a8548987c45ef6217f0230e08.zip
FreeBSD-src-4ecd2d2e401c699a8548987c45ef6217f0230e08.tar.gz
syntax change: allow symbolic names as substitute first arg
-rw-r--r--usr.bin/colldef/colldef.118
-rw-r--r--usr.bin/colldef/parse.y16
-rw-r--r--usr.bin/colldef/scan.l46
3 files changed, 39 insertions, 41 deletions
diff --git a/usr.bin/colldef/colldef.1 b/usr.bin/colldef/colldef.1
index b668d1a..66bb90f 100644
--- a/usr.bin/colldef/colldef.1
+++ b/usr.bin/colldef/colldef.1
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $Id$
+.\" $Id: colldef.1,v 1.5 1997/06/26 11:25:16 charnier Exp $
.\"
.Dd January, 27 1995
.Dt COLLDEF 1
@@ -124,26 +124,24 @@ representation, and can be only one character in length.
.br
.Ar ...
.Pp
-Symbol names cannot be specified in
-.Ar substitute
-fields.
-.Pp
The
.Ar charmap
statement is optional.
.Pp
.Ar substitute
-"\fIchar\fR"
+\fIsymbol\fR
.Ar with
-"\fIrepl\fR"
+"\fIrepl_string\fR"
.Pp
The
.Ar substitute
statement substitutes the character
-.Ar char
+.Ar symbol
with the string
-.Ar repl .
-.Pp
+.Ar repl_string .
+Symbol names cannot be specified in
+.Ar repl_string
+field.
The
.Ar substitute
statement is optional.
diff --git a/usr.bin/colldef/parse.y b/usr.bin/colldef/parse.y
index 8a81726..da485da 100644
--- a/usr.bin/colldef/parse.y
+++ b/usr.bin/colldef/parse.y
@@ -25,7 +25,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: parse.y,v 1.12 1999/02/12 20:39:05 ache Exp $
+ * $Id: parse.y,v 1.13 1999/02/12 20:56:49 ache Exp $
*/
#include <err.h>
@@ -83,16 +83,12 @@ charmap : DEFN CHAR {
strcpy(charmap_table[$2], $1);
}
;
-substitute : SUBSTITUTE STRING WITH STRING {
- u_char ch = $2[0];
-
- if (strlen($2) > 1)
- yyerror("Only characters can be substituted, not strings");
- if (ch == '\0')
+substitute : SUBSTITUTE CHAR WITH STRING {
+ if ($2 == '\0')
yyerror("NUL character can't be substituted");
- if (strchr($4, ch) != NULL)
- yyerror("Char 0x%02x substitution is recursive", ch);
- strcpy(__collate_substitute_table[ch], $4);
+ if (strchr($4, $2) != NULL)
+ yyerror("Char 0x%02x substitution is recursive", $2);
+ strcpy(__collate_substitute_table[$2], $4);
}
;
order : ORDER order_list {
diff --git a/usr.bin/colldef/scan.l b/usr.bin/colldef/scan.l
index 27439f4..405068d 100644
--- a/usr.bin/colldef/scan.l
+++ b/usr.bin/colldef/scan.l
@@ -1,4 +1,4 @@
-%x string name charmap defn nchar subs
+%x string name charmap defn nchar subs subs2
%{
/*-
* Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: scan.l,v 1.7 1997/02/22 19:54:32 peter Exp $
+ * $Id: scan.l,v 1.8 1999/02/12 20:39:06 ache Exp $
*/
#include <ctype.h>
@@ -37,7 +37,7 @@
#include "collate.h"
#include "y.tab.h"
-int line_no = 1, save_no;
+int line_no = 1, save_no, fromsubs;
u_char buf[STR_LEN], *ptr;
FILE *map_fp;
extern char map_name[];
@@ -48,21 +48,22 @@ YYSTYPE yylval;
#endif /* FLEX_DEBUG */
%}
%%
-<INITIAL,charmap,nchar,subs>[ \t]+ ;
-<subs>\" { ptr = buf; BEGIN(string); }
-<INITIAL>\< { ptr = buf; BEGIN(name); }
+<INITIAL,charmap,nchar,subs,subs2>[ \t]+ ;
+<subs2>\" { ptr = buf; BEGIN(string); }
+<subs>\< { ptr = buf; fromsubs = 1; BEGIN(name); }
+<INITIAL>\< { ptr = buf; fromsubs = 0; BEGIN(name); }
^#.*\n line_no++;
^\n line_no++;
<INITIAL>\\\n line_no++;
-<INITIAL,nchar>\\t { yylval.ch = '\t'; return CHAR; }
-<INITIAL,nchar>\\n { yylval.ch = '\n'; return CHAR; }
-<INITIAL,nchar>\\b { yylval.ch = '\b'; return CHAR; }
-<INITIAL,nchar>\\f { yylval.ch = '\f'; return CHAR; }
-<INITIAL,nchar>\\v { yylval.ch = '\v'; return CHAR; }
-<INITIAL,nchar>\\r { yylval.ch = '\r'; return CHAR; }
-<INITIAL,nchar>\\a { yylval.ch = '\a'; return CHAR; }
-<INITIAL,nchar>\\. { yylval.ch = yytext[1]; return CHAR; }
-<subs>\n {
+<INITIAL,nchar,subs>\\t { yylval.ch = '\t'; return CHAR; }
+<INITIAL,nchar,subs>\\n { yylval.ch = '\n'; return CHAR; }
+<INITIAL,nchar,subs>\\b { yylval.ch = '\b'; return CHAR; }
+<INITIAL,nchar,subs>\\f { yylval.ch = '\f'; return CHAR; }
+<INITIAL,nchar,subs>\\v { yylval.ch = '\v'; return CHAR; }
+<INITIAL,nchar,subs>\\r { yylval.ch = '\r'; return CHAR; }
+<INITIAL,nchar,subs>\\a { yylval.ch = '\a'; return CHAR; }
+<INITIAL,nchar,subs>\\. { yylval.ch = yytext[1]; return CHAR; }
+<subs2>\n {
line_no++;
BEGIN(INITIAL);
return '\n';
@@ -77,18 +78,18 @@ YYSTYPE yylval;
}
<INITIAL>[;,{}()] return *yytext;
<INITIAL>substitute { BEGIN(subs); return SUBSTITUTE; }
-<subs>with return WITH;
+<subs>with { BEGIN(subs2); return WITH; }
<INITIAL>order return ORDER;
<INITIAL>charmap BEGIN(charmap);
<INITIAL>;[ \t]*\.\.\.[ \t]*; return RANGE;
-<INITIAL,nchar>\\[0-7]{3} {
+<INITIAL,nchar,subs>\\[0-7]{3} {
u_int v;
sscanf(&yytext[1], "%o", &v);
yylval.ch = (u_char)v;
return CHAR;
}
-<INITIAL,nchar>\\x[0-9a-z]{2} {
+<INITIAL,nchar,subs>\\x[0-9a-z]{2} {
u_int v;
sscanf(&yytext[2], "%x", &v);
@@ -106,7 +107,7 @@ YYSTYPE yylval;
strcpy(yylval.str, yytext);
return CHAIN;
}
-<nchar>. {
+<nchar,subs>. {
yylval.ch = *yytext;
return CHAR;
}
@@ -151,13 +152,16 @@ YYSTYPE yylval;
buf, line_no);
findit:
yylval.ch = i;
- BEGIN(INITIAL);
+ if (fromsubs)
+ BEGIN(subs);
+ else
+ BEGIN(INITIAL);
return CHAR;
}
<string>\" {
*ptr = '\0';
strcpy(yylval.str, buf);
- BEGIN(subs);
+ BEGIN(subs2);
return STRING;
}
<name,defn>. {
OpenPOWER on IntegriCloud