Index: ossp-pkg/cfg/cfg_syn.c RCS File: /v/ossp/cvs/ossp-pkg/cfg/cfg_syn.c,v rcsdiff -q -kk '-r1.7' '-r1.8' -u '/v/ossp/cvs/ossp-pkg/cfg/cfg_syn.c,v' 2>/dev/null --- cfg_syn.c 2002/07/05 17:21:40 1.7 +++ cfg_syn.c 2002/07/05 18:32:37 1.8 @@ -208,10 +208,38 @@ static void export_token(export_t *ctx, const char *token) { - if (strcspn(token, " {};\\") != strlen(token)) - export_format(ctx, "\"%s\"", token); - else + const char *cp; + char *out; + int n; + + if (strcspn(token, " \n\r\t\b\f;{}\\\"'") == strlen(token)) + /* plain text token */ 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; + } + 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 = ""; + } + export_format(ctx, "%s", out); + cp++; + } + } + export_format(ctx, "\""); + } return; } 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.3' '-r1.4' -u '/v/ossp/cvs/ossp-pkg/cfg/cfg_syn_scan.l,v' 2>/dev/null --- cfg_syn_scan.l 2002/07/05 15:11:20 1.3 +++ cfg_syn_scan.l 2002/07/05 18:32:37 1.4 @@ -139,6 +139,9 @@ } *cpStr++ = result; } +\\\n[ \t]* { + /* no-op */ +} \\n { *cpStr++ = '\n'; } \\r { *cpStr++ = '\r'; } \\t { *cpStr++ = '\t'; } @@ -167,6 +170,9 @@ BEGIN(INITIAL); return T_STRING; } +\\\n[ \t]* { + /* no-op */ +} \\(.|\n) { *cpStr++ = yytext[1]; } @@ -200,6 +206,9 @@ *cpStr++ = yytext[1]; } } +\\\n[ \t]* { + /* no-op */ +} [^\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~] { char *cp = yytext; while (*cp != '\0') @@ -228,12 +237,18 @@ "}" { return T_CLOSE; } /* plain text word */ +\\\n[ \t]* { + /* no-op */ +} (.|\n) { cpStr = caStr; *cpStr++ = yytext[0]; BEGIN(SS_PT); } -[^ \t\n;{}"']+ { +\\\n[ \t]* { + /* no-op */ +} +[^ \t\n;{}\\"']+ { char *cp = yytext; while (*cp != '\0') *cpStr++ = *cp++; Index: ossp-pkg/cfg/cfg_test.c RCS File: /v/ossp/cvs/ossp-pkg/cfg/cfg_test.c,v rcsdiff -q -kk '-r1.3' '-r1.4' -u '/v/ossp/cvs/ossp-pkg/cfg/cfg_test.c,v' 2>/dev/null --- cfg_test.c 2002/07/05 15:32:42 1.3 +++ cfg_test.c 2002/07/05 18:32:37 1.4 @@ -33,7 +33,7 @@ else { cfg_syn_export(NULL, node, &buf_ptr); cfg_syn_destroy(NULL, node); - fprintf(stdout, "%s\n", buf_ptr); + fprintf(stdout, "%s", buf_ptr); } return 0; Index: ossp-pkg/cfg/sample2.cfg RCS File: /v/ossp/cvs/ossp-pkg/cfg/Attic/sample2.cfg,v rcsdiff -q -kk '-r1.2' '-r1.3' -u '/v/ossp/cvs/ossp-pkg/cfg/Attic/sample2.cfg,v' 2>/dev/null --- sample2.cfg 2002/07/05 14:33:10 1.2 +++ sample2.cfg 2002/07/05 18:32:37 1.3 @@ -1,11 +1,14 @@ foo; -bar1 q{ f{o}o } 'foo;' "bar2 bar2b"; +bar1 q{ f{o}o } 'foo;' "bar2 bar2b" "foo\nbar" q(foo +bar +quux); quux1 { quux1a; quux1b; } quux2 { - quux2a; + q(quu\ + x2a); quux2b; };