1 #include "parser.ih"
2 
3 static int s_nested = 0;
4 
p_paragraph(register Parser * pp,String const * sp)5 void p_paragraph(register Parser *pp, String const *sp)
6 {
7     register HashItem *item;
8 
9     if
10     (
11         s_nested++
12         ||
13         (item = hashmap_find(pp->d_symtab_ptr, "PARAGRAPH", MACRO))
14                                                             == PFAILED
15     )
16         (*pp->d_insert)(pp, string_str(sp));        /* no paragraph macro   */
17 
18     else if (!ostream_empty(pp->d_outs_ptr))
19     {                                               /* get paragraph funct  */
20         char const *def = macro_definition(hashitem_value(item));
21 
22         if (def == PFAILED)
23         {
24             if (message_show(MSG_ERR))
25                 message("MACRO PARAGRAPH': no expansion");
26         }
27         else
28         {
29             register void (*saved)(struct Parser *, char const *);
30             register char *evaluated;
31 
32             HashItem *paragraph =
33                     hashmap_find(pp->d_symtab_ptr, "XXparagraph", SYMBOL);
34 
35                                                /* See if we have a new par. */
36             HashItem *parcount =
37                     hashmap_find(pp->d_symtab_ptr, "XXwrotetext", COUNTER);
38 
39             if (paragraph != PFAILED)
40                 symbol_set(paragraph, string_str(sp));
41 
42             if (parcount != PFAILED)
43                 counter_set(parcount,
44                             (int)ostream_inserted_text(pp->d_outs_ptr));
45 
46             evaluated = parser_eval(pp, new_str(def));
47 
48             saved = parser_suppress_chartab(&parser);
49             (*pp->d_insert)(pp, evaluated);
50             pp->d_insert = saved;
51 
52             ostream_inserted_blanks(pp->d_outs_ptr);
53             free(evaluated);
54         }
55 
56     }
57     s_nested--;
58 }
59