Support the \W{...}\i\c{...} combination used in the NASM manual.
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 15 Apr 2004 14:21:10 +0000 (14:21 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 15 Apr 2004 14:21:10 +0000 (14:21 +0000)
Halibut is now capable of reading the old NASM manual with only
minor modifications, and probably doing a much better job of
formatting it than rdsrc.pl ever did. (Certainly much _faster_!)

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

doc/input.but
input.c

index 1f16c5c..daf8092 100644 (file)
@@ -316,6 +316,11 @@ and Halibut would produce
 Google is located at \W{http://www.google.com/}\cw{www.google.com}.
 }
 
+If you want the link text to be an index term as well, you can also
+specify \c{\\i} or \c{\\ii}; this has to come before \c{\\c} or
+\c{\\cw} if both are present. (See \k{input-index} for more about
+indexing.)
+
 \S{input-unicode} \c{\\u}: Specifying arbitrary \i{Unicode}
 characters
 
diff --git a/input.c b/input.c
index cb6cf9c..efce410 100644 (file)
--- a/input.c
+++ b/input.c
@@ -1189,12 +1189,43 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
                         * delimiting the text marked by the link.
                         */
                        dtor(t), t = get_token(in);
-                       /*
-                        * Special cases: \W{}\c, \W{}\e, \W{}\cw
-                        */
                        sitem = mknew(struct stack_item);
                        sitem->fpos = wd.fpos;
                        sitem->type = stack_hyper;
+                       /*
+                        * Special cases: \W{}\i, \W{}\ii
+                        */
+                       if (t.type == tok_cmd &&
+                           (t.cmd == c_i || t.cmd == c_ii)) {
+                           if (indexing) {
+                               error(err_nestedindex, &t.pos);
+                           } else {
+                               /* Add an index-reference word with no
+                                * text as yet */
+                               wd.type = word_IndexRef;
+                               wd.text = NULL;
+                               wd.alt = NULL;
+                               wd.aux = 0;
+                               wd.breaks = FALSE;
+                               indexword = addword(wd, &whptr);
+                               /* Set up a rdstring to read the
+                                * index text */
+                               indexstr = nullrs;
+                               /* Flags so that we do the Right
+                                * Things with text */
+                               index_visible = (type != c_I);
+                               index_downcase = (type == c_ii);
+                               indexing = TRUE;
+                               idxwordlist = NULL;
+                               idximplicit = &idxwordlist;
+
+                               sitem->type |= stack_idx;
+                           }
+                           dtor(t), t = get_token(in);
+                       }
+                       /*
+                        * Special cases: \W{}\c, \W{}\e, \W{}\cw
+                        */
                        if (t.type == tok_cmd &&
                            (t.cmd == c_e || t.cmd == c_c || t.cmd == c_cw)) {
                            if (style != word_Normal)