Changes/additions to input character set handling:
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Thu, 17 Feb 2005 19:00:48 +0000 (19:00 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Thu, 17 Feb 2005 19:00:48 +0000 (19:00 +0000)
 - After discussion with Simon, change the default input charset back to ASCII,
   rather than trying to work it out from the locale, for the sake of promoting
   .but file portability.

 - Add a new command-line option "--input-charset=csname", which overrides the
   ASCII default for all input files (since there's no other way to use a
   non-ASCII-compatible input file).

 - Output a warning if -Cinput-charset:foo is specified that it has no effect.

 - Update the docs to match all this. Also try to clarify some other things in
   this area that caught me out.

git-svn-id: svn://svn.tartarus.org/sgt/halibut@5332 cda61777-01e9-0310-a592-d414129be87e

doc/input.but
doc/manpage.but
doc/running.but
error.c
halibut.h
help.c
main.c

index f0097c5..7d5eb97 100644 (file)
@@ -1338,9 +1338,9 @@ For example, \c{iso-8859-1}, \c{iso8859-1} and \c{iso_8859-1} are
 all recognised, \c{GB2312} and \c{EUC-CN} both work, and so on.
 
 This directive takes effect immediately after the \c{\\cfg} command.
 all recognised, \c{GB2312} and \c{EUC-CN} both work, and so on.
 
 This directive takes effect immediately after the \c{\\cfg} command.
-All text after that in the file is expected to be in the new
-character set. You can even change character set several times
-within a file if you really want to.
+All text after that until the end of the input file is expected to be
+in the new character set. You can even change character set several
+times within a file if you really want to. 
 
 When Halibut reads the input file, everything you type will be
 converted into \i{Unicode} from the character set you specify here,
 
 When Halibut reads the input file, everything you type will be
 converted into \i{Unicode} from the character set you specify here,
@@ -1403,8 +1403,10 @@ The \i{default settings} for the above options are:
 \c \cfg{appendix}{Appendix}
 \c \cfg{input-charset}{ASCII}
 
 \c \cfg{appendix}{Appendix}
 \c \cfg{input-charset}{ASCII}
 
-(The default settings for \cw{\\cfg\{quotes\}} are backend-specific;
-see \k{output}.)
+The default for \cw{\\cfg\{input-charset\}} can be changed with the
+\cw{--input-charset} option; see \k{running-options}. The default
+settings for \cw{\\cfg\{quotes\}} are backend-specific; see
+\k{output}.
 
 \H{input-macro} Defining \i{macros}
 
 
 \H{input-macro} Defining \i{macros}
 
index 94b42d6..5889e59 100644 (file)
@@ -106,6 +106,11 @@ Halibut. Using this directive is exactly equivalent to appending an
 extra input file to the command line which contains the directive
 \cw{\\cfg\{}\e{word}\cw{\}\{}\e{word}\cw{\}\{}\e{word}...\cw{\}}.
 
 extra input file to the command line which contains the directive
 \cw{\\cfg\{}\e{word}\cw{\}\{}\e{word}\cw{\}\{}\e{word}...\cw{\}}.
 
+\dt \cw{--input-charset}\cw{=}\e{charset}
+
+\dd Changes the assumed character set for input files from the
+default of ASCII.
+
 \dt \cw{--precise}
 
 \dd Makes Halibut report the column number as well as the line
 \dt \cw{--precise}
 
 \dd Makes Halibut report the column number as well as the line
index 37e36f3..56790ec 100644 (file)
@@ -163,6 +163,10 @@ might have to type four backslashes on your shell command line. This
 is not part of Halibut's own behaviour, and it cannot do anything
 about it.)
 
 is not part of Halibut's own behaviour, and it cannot do anything
 about it.)
 
+Configuration directives created in this way take effect after all
+other input has been processed. (In most cases, this has the effect of
+overriding any other instances of the directive in the input.)
+
 }
 
 The options which set the output file names actually work by
 }
 
 The options which set the output file names actually work by
@@ -178,6 +182,22 @@ directives.)
 
 In addition to these, there are also a few other options:
 
 
 In addition to these, there are also a few other options:
 
+\dt \i\cw{--input-charset}\cw{=}\e{charset}
+
+\dd Changes the default assumed character set for all input files from
+ASCII to something else. (\cw{-Cinput-charset} cannot be used for
+this, as \cw{-C} directives are processed after all other input, so
+wouldn't affect any files.)
+
+\lcont{
+
+Any \cw{\\cfg\{input-charset\}} directives within input files override
+this option.
+
+See \k{input-config} for more information about the input character set.
+
+}
+
 \dt \i\cw{--help}
 
 \dd Print a brief help message and exit immediately. (Don't confuse
 \dt \i\cw{--help}
 
 \dd Print a brief help message and exit immediately. (Don't confuse
diff --git a/error.c b/error.c
index 7b9ceaa..0011b18 100644 (file)
--- a/error.c
+++ b/error.c
@@ -37,6 +37,17 @@ static void do_error(int code, va_list ap) {
        sprintf(error, "unrecognised option `-%.200s'", sp);
        flags = PREFIX;
        break;
        sprintf(error, "unrecognised option `-%.200s'", sp);
        flags = PREFIX;
        break;
+      case err_cmdcharset:
+       sp = va_arg(ap, char *);
+       sprintf(error, "character set `%.200s' not recognised", sp);
+       flags = PREFIX;
+       break;
+      case err_futileopt:
+       sp = va_arg(ap, char *);
+       sp2 = va_arg(ap, char *);
+       sprintf(error, "warning: option `-%s' has no effect%s", sp, sp2);
+       flags = PREFIX;
+       break;
       case err_noinput:                       /* no arguments */
        sprintf(error, "no input files");
        flags = PREFIX;
       case err_noinput:                       /* no arguments */
        sprintf(error, "no input files");
        flags = PREFIX;
index f76d059..8c7caed 100644 (file)
--- a/halibut.h
+++ b/halibut.h
@@ -206,6 +206,8 @@ enum {
     err_nomemory,                     /* out of memory */
     err_optnoarg,                     /* option `-%s' requires an argument */
     err_nosuchopt,                    /* unrecognised option `-%s' */
     err_nomemory,                     /* out of memory */
     err_optnoarg,                     /* option `-%s' requires an argument */
     err_nosuchopt,                    /* unrecognised option `-%s' */
+    err_cmdcharset,                   /* unrecognised charset %s (cmdline) */
+    err_futileopt,                    /* futile option `-%s'%s */
     err_noinput,                      /* no input files */
     err_cantopen,                     /* unable to open input file `%s' */
     err_nodata,                               /* no data in input files */
     err_noinput,                      /* no input files */
     err_cantopen,                     /* unable to open input file `%s' */
     err_nodata,                               /* no data in input files */
diff --git a/help.c b/help.c
index 8104006..7235032 100644 (file)
--- a/help.c
+++ b/help.c
@@ -15,6 +15,7 @@ static char *helptext[] = {
     "         --ps[=filename]       generate PostScript output",
     "         --pdf[=filename]      generate PDF output",
     "         -Cfoo:bar:baz         append \\cfg{foo}{bar}{baz} to input",
     "         --ps[=filename]       generate PostScript output",
     "         --pdf[=filename]      generate PDF output",
     "         -Cfoo:bar:baz         append \\cfg{foo}{bar}{baz} to input",
+    "         --input-charset=cs    change default input file charset",
     "         --precise             report column numbers in error messages",
     "         --help                display this text",
     "         --version             display version number",
     "         --precise             report column numbers in error messages",
     "         --help                display this text",
     "         --version             display version number",
@@ -23,7 +24,7 @@ static char *helptext[] = {
 };
 
 static char *usagetext[] = {
 };
 
 static char *usagetext[] = {
-    "usage: halibut [--format[=filename]] [-Cconfig...] file.but [file.but...]",
+    "usage: halibut [--format[=filename]] [options] file.but [file.but...]",
     NULL
 };
 
     NULL
 };
 
diff --git a/main.c b/main.c
index f09b33e..8334d15 100644 (file)
--- a/main.c
+++ b/main.c
@@ -43,6 +43,7 @@ int main(int argc, char **argv) {
     int nogo;
     int errs;
     int reportcols;
     int nogo;
     int errs;
     int reportcols;
+    int input_charset;
     int debug;
     int backendbits, prebackbits;
     int k, b;
     int debug;
     int backendbits, prebackbits;
     int k, b;
@@ -58,6 +59,7 @@ int main(int argc, char **argv) {
     nfiles = 0;
     nogo = errs = FALSE;
     reportcols = 0;
     nfiles = 0;
     nogo = errs = FALSE;
     reportcols = 0;
+    input_charset = CS_ASCII;
     debug = 0;
     backendbits = 0;
     cfg = cfg_tail = NULL;
     debug = 0;
     backendbits = 0;
     cfg = cfg_tail = NULL;
@@ -113,6 +115,17 @@ int main(int argc, char **argv) {
                            }
                        if (k < (int)lenof(backends)) {
                            /* do nothing */;
                            }
                        if (k < (int)lenof(backends)) {
                            /* do nothing */;
+                       } else if (!strcmp(opt, "-input-charset")) {
+                           if (!val) {
+                               errs = TRUE, error(err_optnoarg, opt);
+                           } else {
+                               int charset = charset_from_localenc(val);
+                               if (charset == CS_NONE) {
+                                   errs = TRUE, error(err_cmdcharset, val);
+                               } else {
+                                   input_charset = charset;
+                               }
+                           }
                        } else if (!strcmp(opt, "-help")) {
                            help();
                            nogo = TRUE;
                        } else if (!strcmp(opt, "-help")) {
                            help();
                            nogo = TRUE;
@@ -193,6 +206,10 @@ int main(int argc, char **argv) {
                            while (*q) {
                                if (*q == ':') {
                                    *r = '\0';
                            while (*q) {
                                if (*q == ':') {
                                    *r = '\0';
+                                   /* XXX ad-hoc diagnostic */
+                                   if (!strcmp(s, "input-charset"))
+                                       error(err_futileopt, "Cinput-charset",
+                                             "; use --input-charset");
                                    cmdline_cfg_add(para, s);
                                    r = s;
                                } else {
                                    cmdline_cfg_add(para, s);
                                    r = s;
                                } else {
@@ -263,7 +280,7 @@ int main(int argc, char **argv) {
        in.pushback = NULL;
        in.reportcols = reportcols;
        in.stack = NULL;
        in.pushback = NULL;
        in.reportcols = reportcols;
        in.stack = NULL;
-       in.defcharset = charset_from_locale();
+       in.defcharset = input_charset;
 
        idx = make_index();
 
 
        idx = make_index();