Revamp of the Halibut error handling mechanism.
[sgt/halibut] / main.c
diff --git a/main.c b/main.c
index eb95fc3..405e6ef 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 list_fonts;
     int input_charset;
     int debug;
     int backendbits, prebackbits;
@@ -68,6 +69,7 @@ int main(int argc, char **argv) {
     nfiles = 0;
     nogo = errs = FALSE;
     reportcols = 0;
+    list_fonts = 0;
     input_charset = CS_ASCII;
     debug = 0;
     backendbits = 0;
@@ -83,7 +85,7 @@ int main(int argc, char **argv) {
      */
     while (--argc) {
        char *p = *++argv;
-       if (*p == '-') {
+       if (*p == '-' && p[1]) {
            /*
             * An option.
             */
@@ -126,11 +128,11 @@ int main(int argc, char **argv) {
                            /* do nothing */;
                        } else if (!strcmp(opt, "-input-charset")) {
                            if (!val) {
-                               errs = TRUE, error(err_optnoarg, opt);
+                               errs = TRUE, err_optnoarg(opt);
                            } else {
                                int charset = charset_from_localenc(val);
                                if (charset == CS_NONE) {
-                                   errs = TRUE, error(err_cmdcharset, val);
+                                   errs = TRUE, err_cmdcharset(val);
                                } else {
                                    input_charset = charset;
                                }
@@ -148,10 +150,12 @@ int main(int argc, char **argv) {
                        } else if (!strcmp(opt, "-list-charsets")) {
                            listcharsets();
                            nogo = TRUE;
+                       } else if (!strcmp(opt, "-list-fonts")) {
+                           list_fonts = TRUE;
                        } else if (!strcmp(opt, "-precise")) {
                            reportcols = 1;
                        } else {
-                           errs = TRUE, error(err_nosuchopt, opt);
+                           errs = TRUE, err_nosuchopt(opt);
                        }
                    }
                    p = NULL;
@@ -196,7 +200,7 @@ int main(int argc, char **argv) {
                        char opt[2];
                        opt[0] = c;
                        opt[1] = '\0';
-                       errs = TRUE, error(err_optnoarg, opt);
+                       errs = TRUE, err_optnoarg(opt);
                    }
                    /*
                     * Now c is the option and p is the parameter.
@@ -220,7 +224,7 @@ int main(int argc, char **argv) {
                                    *r = '\0';
                                    /* XXX ad-hoc diagnostic */
                                    if (!strcmp(s, "input-charset"))
-                                       error(err_futileopt, "Cinput-charset",
+                                       err_futileopt("Cinput-charset",
                                              "; use --input-charset");
                                    cmdline_cfg_add(para, s);
                                    r = s;
@@ -252,7 +256,7 @@ int main(int argc, char **argv) {
                        char opt[2];
                        opt[0] = c;
                        opt[1] = '\0';
-                       errs = TRUE, error(err_nosuchopt, opt);
+                       errs = TRUE, err_nosuchopt(opt);
                    }
                }
            }
@@ -260,7 +264,10 @@ int main(int argc, char **argv) {
            /*
             * A non-option argument.
             */
-           infiles[nfiles++] = p;
+           if (!strcmp(p, "-"))
+               infiles[nfiles++] = NULL;   /* special case: read stdin */
+           else
+               infiles[nfiles++] = p;
        }
     }
 
@@ -272,8 +279,8 @@ int main(int argc, char **argv) {
     /*
      * Do the work.
      */
-    if (nfiles == 0) {
-       error(err_noinput);
+    if (nfiles == 0 && !list_fonts) {
+       err_noinput();
        usage();
        exit(EXIT_FAILURE);
     }
@@ -297,6 +304,10 @@ int main(int argc, char **argv) {
        idx = make_index();
 
        sourceform = read_input(&in, idx);
+       if (list_fonts) {
+           listfonts();
+           exit(EXIT_SUCCESS);
+       }
        if (!sourceform)
            exit(EXIT_FAILURE);
 
@@ -459,6 +470,8 @@ static void dbg_prtwordlist(int level, word *w) {
            printf("\"");
        } else
            printf("(no text)");
+       if (w->breaks)
+           printf(" [breaks]");
        if (w->alt) {
            printf(" alt = {\n");
            dbg_prtwordlist(level+1, w->alt);