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