home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / nuweb / nuwebsrc / Nuweb / src / latex.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-03-13  |  12.5 KB  |  411 lines

  1.  
  2. #line 615 "nuweb.w"
  3. #include "global.h"
  4.  
  5. #line 1129 "nuweb.w"
  6. static void copy_scrap(FILE *file);             /* formats the body of a scrap */
  7. static int print_scrap_numbers(FILE *tex_file, Scrap_Node *scraps);
  8.      /* formats a list of scrap numbers */
  9. static void format_entry(Name *name, FILE *tex_file, int file_flag);
  10.      /* formats an index entry */
  11. static void format_user_entry(Name *name, FILE *tex_file);
  12.  
  13. #line 1142 "nuweb.w"
  14. void write_tex(char *file_name, char *tex_name)
  15. {
  16.   FILE *tex_file = fopen(tex_name, "w");
  17.   if (tex_file) {
  18.     if (verbose_flag)
  19.       fprintf(stderr, "writing %s\n", tex_name);
  20.     source_open(file_name);
  21.     
  22. #line 1163 "nuweb.w"
  23.     {
  24.       int scraps = 1;
  25.       int c = source_get();
  26.       while (c != EOF) {
  27.         if (c == '@')
  28.           
  29. #line 1179 "nuweb.w"
  30.           {
  31.             int big_definition = FALSE;
  32.             c = source_get();
  33.             switch (c) {
  34.               case 'O': big_definition = TRUE;
  35.               case 'o': 
  36. #line 1244 "nuweb.w"
  37.                         {
  38.                           Name *name = collect_file_name();
  39.                           if (!number_flag) fprintf(tex_file, "\\label{scrap%d}\n", scraps);
  40.                           if (!big_definition) fputs("\\begin{nuwebfile}", tex_file);
  41.                           else fputs("\\begin{nuwebbigfile}", tex_file);
  42.                           fprintf(tex_file, "{%s}{", name->spelling);
  43.                           write_single_scrap_ref(tex_file, scraps++);
  44.                           putc('}', tex_file);
  45.                           
  46. #line 1289 "nuweb.w"
  47.                           if (name->defs->next) {
  48.                             int nos = print_scrap_numbers(tex_file, name->defs);
  49.                             fprintf(tex_file, "{%d}", nos);
  50.                           }
  51.                           else fputs("{}{0}", tex_file);
  52.                           
  53. #line 1252 "nuweb.w"
  54.                         
  55.                           fputs("{}{0}", tex_file);
  56.                           putc('\n', tex_file);
  57.                           copy_scrap(tex_file);
  58.                           if (!big_definition) fputs("\\end{nuwebfile}\n", tex_file);
  59.                           else fputs("\\end{nuwebbigfile}\n", tex_file);
  60.                         }
  61.                         
  62. #line 1184 "nuweb.w"
  63.           
  64.                         c = source_get();
  65.                         break;
  66.               case 'D': big_definition = TRUE;
  67.               case 'd': 
  68. #line 1267 "nuweb.w"
  69.                         {
  70.                           Name *name = collect_macro_name();
  71.                           if (!number_flag) fprintf(tex_file, " \\label{scrap%d}\n", scraps);
  72.                           if (!big_definition) fputs("\\begin{nuwebmacro}", tex_file);
  73.                           else fputs("\\begin{nuwebbigmacro}", tex_file);
  74.                           fprintf(tex_file, "{%s}{", name->spelling);
  75.                           write_single_scrap_ref(tex_file, scraps++);
  76.                           putc('}', tex_file);
  77.                           
  78. #line 1289 "nuweb.w"
  79.                           if (name->defs->next) {
  80.                             int nos = print_scrap_numbers(tex_file, name->defs);
  81.                             fprintf(tex_file, "{%d}", nos);
  82.                           }
  83.                           else fputs("{}{0}", tex_file);
  84.                           
  85. #line 1275 "nuweb.w"
  86.                         
  87.                           
  88. #line 1298 "nuweb.w"
  89.                           {
  90.                             if (name->uses) {
  91.                               if (name->uses->next) {
  92.                                 int nos = print_scrap_numbers(tex_file, name->uses);
  93.                                 fprintf(tex_file, "{%d}", nos);
  94.                               }
  95.                               else {
  96.                                 putc('{', tex_file);
  97.                                 write_single_scrap_ref(tex_file, name->uses->scrap);
  98.                                 fputs("}{1}", tex_file);
  99.                               }
  100.                             }
  101.                             else {
  102.                               fputs("{}{0}", tex_file);
  103.                               fprintf(stderr, "%s: <%s> never referenced.\n",
  104.                                       command_name, name->spelling);
  105.                             }
  106.                           }
  107.                           
  108. #line 1276 "nuweb.w"
  109.                         
  110.                           putc('\n', tex_file);
  111.                           copy_scrap(tex_file);
  112.                           if (!big_definition) fputs("\\end{nuwebmacro}\n", tex_file);
  113.                           else fputs("\\end{nuwebbigmacro}\n", tex_file);
  114.                         }
  115.                         
  116. #line 1188 "nuweb.w"
  117.           
  118.                         c = source_get();
  119.                         break;
  120.               case 'f': 
  121. #line 1456 "nuweb.w"
  122.                         {
  123.                           if (file_names)
  124.                             format_entry(file_names, tex_file, TRUE);
  125.                           c = source_get();
  126.                         }
  127.                         
  128. #line 1191 "nuweb.w"
  129.           
  130.                         break;
  131.               case 'm': 
  132. #line 1466 "nuweb.w"
  133.                         {
  134.                           if (macro_names)
  135.                             format_entry(macro_names, tex_file, FALSE);
  136.                           c = source_get();
  137.                         }
  138.                         
  139. #line 1193 "nuweb.w"
  140.           
  141.                         break;
  142.               case 'u': 
  143. #line 1553 "nuweb.w"
  144.                         {
  145.                           if (user_names)
  146.                             format_user_entry(user_names, tex_file);
  147.                           c = source_get();
  148.                         }
  149.                         
  150. #line 1195 "nuweb.w"
  151.           
  152.                         break;
  153.               case '@': putc(c, tex_file);
  154.               default:  c = source_get();
  155.                         break;
  156.             }
  157.           }
  158.           
  159. #line 1168 "nuweb.w"
  160.     
  161.         else {
  162.           putc(c, tex_file);
  163.           c = source_get();
  164.         }
  165.       }
  166.     }
  167.     
  168. #line 1149 "nuweb.w"
  169.  
  170.     fclose(tex_file);
  171.   }
  172.   else
  173.     fprintf(stderr, "%s: can't open %s\n", command_name, tex_name);
  174. }
  175.  
  176. #line 1324 "nuweb.w"
  177. static int print_scrap_numbers(FILE *tex_file, Scrap_Node *scraps)
  178. {
  179.   int page, nos = 0;
  180.   putc('{', tex_file);
  181.   write_scrap_ref(tex_file, scraps->scrap, TRUE, &page);
  182.   scraps = scraps->next;
  183.   nos++;
  184.   while (scraps) {
  185.     write_scrap_ref(tex_file, scraps->scrap, FALSE, &page);
  186.     scraps = scraps->next;
  187.     nos++;
  188.   }
  189.   putc('}', tex_file);
  190.   return nos;
  191. }
  192.  
  193. #line 1346 "nuweb.w"
  194. static void copy_scrap(FILE *file)
  195. {
  196.   int indent = 0;
  197.   int c = source_get();
  198.   while (1) {
  199.     switch (c) {
  200.       case '@':  
  201. #line 1394 "nuweb.w"
  202.                  {
  203.                    c = source_get();
  204.                    switch (c) {
  205.                      case '@': putc('@', file);
  206.                                break;
  207.                      case '|': 
  208. #line 1412 "nuweb.w"
  209.                                {
  210.                                  do {
  211.                                    do
  212.                                      c = source_get();
  213.                                    while (c != '@');
  214.                                    c = source_get();
  215.                                  } while (c != '}');
  216.                                }
  217.                                
  218. #line 1399 "nuweb.w"
  219.                  
  220.                      case '}': return;
  221.                      case '<': 
  222. #line 1425 "nuweb.w"
  223.                                {
  224.                                  Name *name = collect_scrap_name();
  225.                                  fprintf(file, "\\nuwebmacroname{%s}{", name->spelling);
  226.                                  if (name->defs)
  227.                                    
  228. #line 1442 "nuweb.w"
  229.                                    {
  230.                                      Scrap_Node *p = name->defs;
  231.                                      write_single_scrap_ref(file, p->scrap);
  232.                                      p = p->next;
  233.                                      if (p)
  234.                                        fputs(",\\dots", file);
  235.                                    }
  236.                                    
  237. #line 1429 "nuweb.w"
  238.                                
  239.                                  else {
  240.                                    putc('?', file);
  241.                                    fprintf(stderr, "%s: scrap never defined <%s>\n",
  242.                                            command_name, name->spelling);
  243.                                  }
  244.                                  putc('}', file);
  245.                                }
  246.                                
  247. #line 1401 "nuweb.w"
  248.                  
  249.                                break;
  250.                    }
  251.                  }
  252.                  
  253. #line 1352 "nuweb.w"
  254.  
  255.                  break;
  256.       case '\t': 
  257. #line 1382 "nuweb.w"
  258.                  {
  259.                    int delta = 8 - (indent % 8);
  260.                    indent += delta;
  261.                    while (delta > 0) {
  262.                      putc(' ', file);
  263.                      delta--;
  264.                    }
  265.                  }
  266.                  
  267. #line 1354 "nuweb.w"
  268.  
  269.                  break;
  270.       case '\n': c = source_get();
  271.                  if (!skipnl_flag || c != '@' ||
  272.                      (source_next() != '|' && source_next() != '}')) {
  273.                    putc('\n', file);
  274.                    indent = 0;
  275.                  }
  276.                  continue;
  277.       case '{':
  278.       case '}':
  279.       case '\\': fprintf(file, "\\verb!%c!", c);
  280.                  break;
  281.       default:   putc(c, file);
  282.                  indent++;
  283.                  break;
  284.     }
  285.     c = source_get();
  286.   }
  287. }
  288.  
  289. #line 1476 "nuweb.w"
  290. static void format_entry(Name *name, FILE *tex_file, int file_flag)
  291. {
  292.   while (name) {
  293.     format_entry(name->llink, tex_file, file_flag);
  294.     
  295. #line 1489 "nuweb.w"
  296.     {
  297.       fputs("\\item ", tex_file);
  298.       if (file_flag) {
  299.         fprintf(tex_file, "\\verb@\"%s\"@, ", name->spelling);
  300.         
  301. #line 1508 "nuweb.w"
  302.         {
  303.           Scrap_Node *p = name->defs;
  304.           if (p->next)
  305.             print_scrap_numbers(tex_file, p);
  306.           else
  307.             write_single_scrap_ref(tex_file, p->scrap);
  308.         }
  309.         
  310. #line 1493 "nuweb.w"
  311.     
  312.       }
  313.       else {
  314.         fprintf(tex_file, "\\(\\langle\\)%s, ", name->spelling);
  315.         
  316. #line 1519 "nuweb.w"
  317.         {
  318.           Scrap_Node *p = name->defs;
  319.           if (p) {
  320.             int page;
  321.             write_scrap_ref(tex_file, p->scrap, TRUE, &page);
  322.             p = p->next;
  323.             while (p) {
  324.               write_scrap_ref(tex_file, p->scrap, FALSE, &page);
  325.               p = p->next;
  326.             }
  327.           }
  328.           else
  329.             putc('?', tex_file);
  330.         }
  331.         
  332. #line 1497 "nuweb.w"
  333.     
  334.         fputs("\\(\\rangle\\) ", tex_file);
  335.         
  336. #line 1537 "nuweb.w"
  337.         {
  338.           Scrap_Node *p = name->uses;
  339.           if (p) {
  340.             if (p->next)
  341.               print_scrap_numbers(tex_file, p);
  342.             else
  343.               write_single_scrap_ref(tex_file, p->scrap);
  344.           }
  345.           else
  346.             fputs("\\textbf{not referenced}", tex_file);
  347.         }
  348.         
  349. #line 1499 "nuweb.w"
  350.     
  351.       }
  352.       putc('\n', tex_file);
  353.     }
  354.     
  355. #line 1480 "nuweb.w"
  356.  
  357.     name = name->rlink;
  358.   }
  359. }
  360.  
  361. #line 1563 "nuweb.w"
  362. static void format_user_entry(Name *name, FILE *tex_file)
  363. {
  364.   while (name) {
  365.     format_user_entry(name->llink, tex_file);
  366.     
  367. #line 1576 "nuweb.w"
  368.     {
  369.       Scrap_Node *uses = name->uses;
  370.       if (uses) {
  371.         int page;
  372.         Scrap_Node *defs = name->defs;
  373.         fprintf(tex_file, "\\item \\verb@%s@, ", name->spelling);
  374.         if (uses->scrap < defs->scrap) {
  375.           write_scrap_ref(tex_file, uses->scrap, TRUE, &page);
  376.           uses = uses->next;
  377.         }
  378.         else {
  379.           if (defs->scrap == uses->scrap)
  380.             uses = uses->next;
  381.           fputs("\\underline{", tex_file);
  382.           write_single_scrap_ref(tex_file, defs->scrap);
  383.           putc('}', tex_file);
  384.           page = -2;
  385.           defs = defs->next;
  386.         }
  387.         while (uses || defs) {
  388.           if (uses && (!defs || uses->scrap < defs->scrap)) {
  389.             write_scrap_ref(tex_file, uses->scrap, FALSE, &page);
  390.             uses = uses->next;
  391.           }
  392.           else {
  393.             if (uses && defs->scrap == uses->scrap)
  394.               uses = uses->next;
  395.             fputs(", \\underline{", tex_file);
  396.             write_single_scrap_ref(tex_file, defs->scrap);
  397.             putc('}', tex_file);
  398.             page = -2;
  399.             defs = defs->next;
  400.           }
  401.         }
  402.         fputs("\n", tex_file);
  403.       }
  404.     }
  405.     
  406. #line 1567 "nuweb.w"
  407.  
  408.     name = name->rlink;
  409.   }
  410. }
  411.