Index: ossp-pkg/cfg/cfg_syn.c RCS File: /v/ossp/cvs/ossp-pkg/cfg/cfg_syn.c,v rcsdiff -q -kk '-r1.8' '-r1.9' -u '/v/ossp/cvs/ossp-pkg/cfg/cfg_syn.c,v' 2>/dev/null --- cfg_syn.c 2002/07/05 18:32:37 1.8 +++ cfg_syn.c 2002/07/05 20:49:58 1.9 @@ -29,6 +29,7 @@ */ #include +#include #include "cfg.h" #include "cfg_grid.h" @@ -210,32 +211,40 @@ { const char *cp; char *out; - int n; + int plain; + char c; - if (strcspn(token, " \n\r\t\b\f;{}\\\"'") == strlen(token)) - /* plain text token */ + plain = 1; + for (cp = token; *cp != '\0'; cp++) { + if ( !isprint((int)(*cp)) + || strchr(" \n\r\t\b\f;{}\\\"'", (int)(*cp)) != NULL) { + plain = 0; + break; + } + } + if (plain) export_format(ctx, "%s", token); else { export_format(ctx, "\""); cp = token; - while (*cp != '\0') { - if ((n = strcspn(cp, "\n\r\t\b\f\\\"")) > 0) { - export_format(ctx, "%.*s", n, cp); - cp += n; + while ((c = *cp++) != '\0') { + out = NULL; + switch (c) { + case '\n': out = "\\n"; break; + case '\r': out = "\\r"; break; + case '\t': out = "\\t"; break; + case '\b': out = "\\b"; break; + case '\f': out = "\\f"; break; + case '\\': out = "\\\\"; break; + case '"' : out = "\\\""; break; } - else { - switch (*cp) { - case '\n': out = "\\n"; break; - case '\r': out = "\\r"; break; - case '\t': out = "\\t"; break; - case '\b': out = "\\b"; break; - case '\f': out = "\\f"; break; - case '\\': out = "\\\\"; break; - case '"' : out = "\\\""; break; - default : out = ""; - } + if (out != NULL) export_format(ctx, "%s", out); - cp++; + else { + if (isprint((int)c)) + export_format(ctx, "%c", c); + else + export_format(ctx, "\\x%02x", c); } } export_format(ctx, "\""); Index: ossp-pkg/cfg/cfg_syn_scan.l RCS File: /v/ossp/cvs/ossp-pkg/cfg/cfg_syn_scan.l,v rcsdiff -q -kk '-r1.4' '-r1.5' -u '/v/ossp/cvs/ossp-pkg/cfg/cfg_syn_scan.l,v' 2>/dev/null --- cfg_syn_scan.l 2002/07/05 18:32:37 1.4 +++ cfg_syn_scan.l 2002/07/05 20:49:58 1.5 @@ -59,6 +59,8 @@ yylloc->last = yylloc->first static char closing_brace(char open); +static int hex_nibble(const char hex); +static int hex_sequence(char *out_ptr, size_t out_len, const char *in_ptr, size_t in_len); %} /* scanner options */ @@ -121,6 +123,9 @@ BEGIN(INITIAL); return T_STRING; } +\\\n[ \t]* { + /* no-op */ +} \\[0-7]{1,3} { unsigned int result; (void)sscanf(yytext+1, "%o", &result); @@ -130,23 +135,19 @@ } *cpStr++ = result; } -\\x[0-9a-fA-F]{2} { - unsigned int result; - (void)sscanf(yytext+1, "%x", &result); - if (result > 0xff) { - cfg_syn_error(CTX, CFG_ERR_SYN, yylloc, "escape sequence out of bound"); - return 0; - } - *cpStr++ = result; +\\x\{[0-9a-fA-F]+\} { + cpStr += hex_sequence(cpStr, sizeof(caStr)-(cpStr-caStr), yytext+3, yyleng-3-1); } -\\\n[ \t]* { - /* no-op */ +\\x[0-9a-fA-F]{2} { + cpStr += hex_sequence(cpStr, sizeof(caStr)-(cpStr-caStr), yytext+2, 2); } \\n { *cpStr++ = '\n'; } \\r { *cpStr++ = '\r'; } \\t { *cpStr++ = '\t'; } \\b { *cpStr++ = '\b'; } \\f { *cpStr++ = '\f'; } +\\a { *cpStr++ = '\007'; } +\\e { *cpStr++ = '\033'; } \\(.|\n) { *cpStr++ = yytext[1]; } @@ -312,3 +313,41 @@ return open; } +/* convert a hex digit into a nibble */ +static int hex_nibble(const char hex) +{ + unsigned char nibble; + + if (hex >= '0' && hex <= '9') + nibble = (unsigned char)(hex - '0'); + else if (hex >= 'a' && hex <= 'f') + nibble = (unsigned char)(hex - 'a' + 10); + else if (hex >= 'A' && hex <= 'F') + nibble = (unsigned char)(hex - 'A' + 10); + else + nibble = -1; + return nibble; +} + +/* convert a hex digit sequence into an octet stream */ +static int hex_sequence(char *out_ptr, size_t out_len, const char *in_ptr, size_t in_len) +{ + int i; + size_t out_max; + + out_max = out_len; + if (in_len % 2 != 0) { + *out_ptr++ = hex_nibble(in_ptr[0]); + out_len--; + in_ptr++; + in_len--; + } + for (i = 0; in_len > 0 && out_len > 0; i++) { + *out_ptr++ = ((hex_nibble(in_ptr[0]) << 4) | (hex_nibble(in_ptr[1]))); + out_len--; + in_ptr += 2; + in_len -= 2; + } + return (out_max - out_len); +} + Index: ossp-pkg/cfg/sample2.cfg RCS File: /v/ossp/cvs/ossp-pkg/cfg/Attic/sample2.cfg,v rcsdiff -q -kk '-r1.3' '-r1.4' -u '/v/ossp/cvs/ossp-pkg/cfg/Attic/sample2.cfg,v' 2>/dev/null --- sample2.cfg 2002/07/05 18:32:37 1.3 +++ sample2.cfg 2002/07/05 20:49:58 1.4 @@ -1,8 +1,8 @@ -foo; +foo "<\x40\x41\x42>" "<\x{1404142}>" abd; bar1 q{ f{o}o } 'foo;' "bar2 bar2b" "foo\nbar" q(foo bar -quux); +quux) "foo\n\r bar"; quux1 { quux1a; quux1b;