Lines Matching defs:mdoc
19 * Validation module for mdoc(7) syntax trees used by mandoc(1).
40 #include "mdoc.h"
48 #define POST_ARGS struct roff_man *mdoc
300 /* Validate the subtree rooted at mdoc->last. */
302 mdoc_validate(struct roff_man *mdoc)
313 n = mdoc->last;
319 post_obsolete(mdoc);
331 mdoc->last = mdoc->last->child;
332 while (mdoc->last != NULL) {
333 mdoc_validate(mdoc);
334 if (mdoc->last == n)
335 mdoc->last = mdoc->last->child;
337 mdoc->last = mdoc->last->next;
342 mdoc->last = n;
343 mdoc->next = ROFF_NEXT_SIBLING;
349 check_text(mdoc, n->line, n->pos, n->string);
353 check_text_em(mdoc, n->line, n->pos, n->string);
356 check_toptext(mdoc, n->line, n->pos, n->string);
363 post_root(mdoc);
366 check_args(mdoc, mdoc->last);
382 roff_validate(mdoc);
389 (*p)(mdoc);
390 if (mdoc->last == n)
391 mdoc_state(mdoc, n);
397 check_args(struct roff_man *mdoc, struct roff_node *n)
406 check_argv(mdoc, n, &n->args->argv[i]);
410 check_argv(struct roff_man *mdoc, struct roff_node *n, struct mdoc_argv *v)
415 check_text(mdoc, v->line, v->pos, v->value[i]);
419 check_text(struct roff_man *mdoc, int ln, int pos, char *p)
423 if (mdoc->last->flags & NODE_NOFILL)
431 check_text_em(struct roff_man *mdoc, int ln, int pos, char *p)
436 np = mdoc->last->prev;
437 nn = mdoc->last->next;
482 check_toptext(struct roff_man *mdoc, int ln, int pos, const char *p)
525 tok = mdoc->last->tok;
526 nch = mdoc->last->last;
541 nch == mdoc->last->child ? "" : " ...", nch->string);
558 tok = mdoc->last->tok;
559 nch = mdoc->last->last;
634 nch == mdoc->last->child ? "" : " ...", nch->string);
646 n = mdoc->last->parent;
714 rewrite_macro2len(mdoc, argv->value);
727 rewrite_macro2len(mdoc, argv->value);
815 n = mdoc->last;
849 rewrite_macro2len(mdoc, argv->value);
888 n = mdoc->last;
912 post_useless(mdoc);
913 n = mdoc->last;
919 roff_node_delete(mdoc, n->child);
921 roff_word_alloc(mdoc, n->line, n->pos, n->tok == MDOC_Bt ?
923 mdoc->last->flags |= NODE_EOS | NODE_NOSRC;
924 mdoc->last = n;
928 build_list(struct roff_man *mdoc, int tok)
933 n = mdoc->last->next;
935 roff_elem_alloc(mdoc, n->line, n->pos, tok);
936 mdoc->last->flags |= NODE_NOSRC;
937 roff_node_relink(mdoc, n);
938 n = mdoc->last = mdoc->last->parent;
939 mdoc->next = ROFF_NEXT_SIBLING;
943 roff_word_alloc(mdoc, n->line, n->pos, ",");
944 mdoc->last->flags |= NODE_DELIMC | NODE_NOSRC;
946 n = mdoc->last->next;
948 roff_word_alloc(mdoc, n->line, n->pos, "and");
949 mdoc->last->flags |= NODE_NOSRC;
960 post_std(mdoc);
962 n = mdoc->last;
963 mdoc->next = ROFF_NEXT_CHILD;
964 roff_word_alloc(mdoc, n->line, n->pos, "The");
965 mdoc->last->flags |= NODE_NOSRC;
967 if (mdoc->last->next != NULL)
968 ic = build_list(mdoc, MDOC_Nm);
969 else if (mdoc->meta.name != NULL) {
970 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Nm);
971 mdoc->last->flags |= NODE_NOSRC;
972 roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name);
973 mdoc->last->flags |= NODE_NOSRC;
974 mdoc->last = mdoc->last->parent;
975 mdoc->next = ROFF_NEXT_SIBLING;
982 roff_word_alloc(mdoc, n->line, n->pos,
984 mdoc->last->flags |= NODE_NOSRC;
985 roff_word_alloc(mdoc, n->line, n->pos,
987 mdoc->last->flags |= NODE_EOS | NODE_NOSRC;
988 mdoc->last = n;
997 post_delim_nb(mdoc);
999 n = mdoc->last;
1001 mdoc->next = ROFF_NEXT_CHILD;
1005 roff_word_alloc(mdoc, n->line, n->pos, p);
1006 mdoc->last->flags = NODE_NOSRC;
1007 mdoc->last = n;
1014 roff_word_alloc(mdoc, n->line, n->pos, "library");
1015 mdoc->last->flags = NODE_NOSRC;
1016 roff_word_alloc(mdoc, n->line, n->pos, "\\(lq");
1017 mdoc->last->flags = NODE_DELIMO | NODE_NOSRC;
1018 mdoc->last = mdoc->last->next;
1019 roff_word_alloc(mdoc, n->line, n->pos, "\\(rq");
1020 mdoc->last->flags = NODE_DELIMC | NODE_NOSRC;
1021 mdoc->last = n;
1030 post_std(mdoc);
1032 n = mdoc->last;
1033 mdoc->next = ROFF_NEXT_CHILD;
1035 roff_word_alloc(mdoc, n->line, n->pos, "The");
1036 mdoc->last->flags |= NODE_NOSRC;
1037 ic = build_list(mdoc, MDOC_Fn);
1038 roff_word_alloc(mdoc, n->line, n->pos,
1040 mdoc->last->flags |= NODE_NOSRC;
1041 roff_word_alloc(mdoc, n->line, n->pos,
1044 roff_word_alloc(mdoc, n->line, n->pos, "Upon successful "
1046 mdoc->last->flags |= NODE_NOSRC;
1048 roff_word_alloc(mdoc, n->line, n->pos, "otherwise "
1050 mdoc->last->flags |= NODE_NOSRC;
1051 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Va);
1052 mdoc->last->flags |= NODE_NOSRC;
1053 roff_word_alloc(mdoc, n->line, n->pos, "errno");
1054 mdoc->last->flags |= NODE_NOSRC;
1055 mdoc->last = mdoc->last->parent;
1056 mdoc->next = ROFF_NEXT_SIBLING;
1057 roff_word_alloc(mdoc, n->line, n->pos,
1059 mdoc->last->flags |= NODE_EOS | NODE_NOSRC;
1060 mdoc->last = n;
1068 post_delim(mdoc);
1070 n = mdoc->last;
1085 n = mdoc->last;
1092 roff_node_delete(mdoc, n);
1097 mdoc->next = ROFF_NEXT_CHILD;
1098 roff_word_alloc(mdoc, nch->line, nch->pos, p);
1099 mdoc->last->flags |= NODE_NOSRC;
1100 mdoc->last= n;
1114 n = mdoc->last;
1133 roff_node_delete(mdoc, n);
1146 roff_node_delete(mdoc, nch->next);
1151 roff_node_delete(mdoc, n);
1228 n = mdoc->last;
1239 n = mdoc->last;
1258 np = mdoc->last;
1319 n = mdoc->last;
1341 post_fname(mdoc);
1342 post_fa(mdoc);
1350 n = mdoc->last;
1364 roff_node_delete(mdoc, n->last);
1366 post_delim(mdoc);
1368 post_fname(mdoc);
1377 for (n = mdoc->last->child; n != NULL; n = n->next) {
1389 post_delim_nb(mdoc);
1397 n = mdoc->last;
1400 n->child->type == ROFFT_TEXT && mdoc->meta.msec != NULL)
1401 mandoc_xr_add(mdoc->meta.msec, n->child->string, -1, -1);
1404 roff_node_relink(mdoc, n->last);
1406 if (mdoc->meta.name == NULL)
1407 deroff(&mdoc->meta.name, n);
1409 if (mdoc->meta.name == NULL ||
1410 (mdoc->lastsec == SEC_NAME && n->child == NULL))
1415 post_delim_nb(mdoc);
1418 post_delim(mdoc);
1425 mdoc->meta.name == NULL)
1428 mdoc->next = ROFF_NEXT_CHILD;
1429 roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name);
1430 mdoc->last->flags |= NODE_NOSRC;
1431 mdoc->last = n;
1439 n = mdoc->last;
1450 post_delim(mdoc);
1452 post_hyph(mdoc);
1460 n = mdoc->last;
1466 roff_node_delete(mdoc, n);
1471 post_hyph(mdoc);
1478 mdoc->next = ROFF_NEXT_SIBLING;
1480 roff_node_relink(mdoc,
1482 roff_node_delete(mdoc, n);
1485 post_bd(mdoc);
1486 post_prevpar(mdoc);
1506 n = mdoc->last;
1508 post_delim_nb(mdoc);
1511 mdoc->next = ROFF_NEXT_CHILD;
1514 roff_word_alloc(mdoc, n->line, n->pos, "file");
1515 mdoc->last->flags |= NODE_NOSRC;
1516 roff_word_alloc(mdoc, n->line, n->pos, "...");
1520 roff_word_alloc(mdoc, n->line, n->pos, "~");
1525 mdoc->last->flags |= NODE_NOSRC;
1526 mdoc->last = n;
1535 n = mdoc->last;
1549 mdoc->next = ROFF_NEXT_CHILD;
1551 roff_word_alloc(mdoc, nch->line, nch->pos, att);
1554 roff_word_alloc(mdoc, n->line, n->pos, "AT&T UNIX");
1555 mdoc->last->flags |= NODE_NOSRC;
1556 mdoc->last = n;
1564 post_an_norm(mdoc);
1566 np = mdoc->last;
1573 post_delim_nb(mdoc);
1582 post_tag(mdoc);
1583 tag_put(NULL, TAG_FALLBACK, mdoc->last);
1589 post_obsolete(mdoc);
1590 if (mdoc->last->type == ROFFT_BLOCK)
1591 mdoc->last->norm->Es = mdoc->last_es;
1599 n = mdoc->last;
1605 post_delim_nb(mdoc);
1613 n = mdoc->last;
1622 post_delim_nb(mdoc);
1628 post_obsolete(mdoc);
1629 mdoc->last_es = mdoc->last;
1643 n = mdoc->last;
1650 roff_node_delete(mdoc, n->prev);
1652 post_tag(mdoc);
1662 post_delim_nb(mdoc);
1664 n = mdoc->last;
1685 mdoc->next = ROFF_NEXT_CHILD;
1686 roff_word_alloc(mdoc, n->child->line, n->child->pos, v);
1687 v = mdoc->last->string;
1689 mdoc->last->flags |= NODE_NOSRC;
1690 mdoc->last = n;
1701 mdoc->next = ROFF_NEXT_CHILD;
1702 roff_word_alloc(mdoc, n->line, n->pos, os);
1703 mdoc->last->flags |= NODE_NOSRC;
1704 mdoc->last = n;
1714 post_prevpar(mdoc);
1716 nit = mdoc->last;
1759 roff_node_delete(mdoc, nit);
1789 post_prevpar(mdoc);
1791 n = mdoc->last;
1808 roff_node_relink(mdoc, nc);
1814 roff_node_delete(mdoc, nc);
1866 rewrite_macro2len(struct roff_man *mdoc, char **arg)
1877 else if ((tok = roffhash_find(mdoc->mdocmac, *arg, 0)) != TOKEN_NONE)
1896 post_bl_norm(mdoc);
1898 nh = mdoc->last;
1905 roff_node_delete(mdoc, nch);
1960 nbody = mdoc->last;
1963 post_bl_block(mdoc);
1966 post_bl_head(mdoc);
1986 nchild = mdoc->last;
1988 if (nchild == mdoc->last)
1991 mdoc->last = nbody;
1997 mdoc->last = nbody;
2003 mdoc->last = nbody->parent->parent;
2004 mdoc->next = ROFF_NEXT_CHILD;
2006 mdoc->last = nbody->parent->prev;
2007 mdoc->next = ROFF_NEXT_SIBLING;
2009 roff_node_relink(mdoc, nbody->child);
2028 mdoc->last = nchild->prev;
2029 mdoc->next = ROFF_NEXT_SIBLING;
2030 roff_block_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
2031 roff_head_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
2032 mdoc->next = ROFF_NEXT_SIBLING;
2033 roff_body_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
2035 roff_node_relink(mdoc, nchild);
2040 mdoc->next = ROFF_NEXT_SIBLING;
2042 mdoc->last = nbody;
2045 if (mdoc->meta.os_e != MANDOC_OS_NETBSD)
2080 n = mdoc->last;
2084 roff_node_delete(mdoc, n);
2093 nch = mdoc->last->child;
2096 mdoc->flags ^= MDOC_SMOFF;
2103 mdoc->flags &= ~MDOC_SMOFF;
2107 mdoc->flags |= MDOC_SMOFF;
2112 "%s %s", roff_name[mdoc->last->tok], nch->string);
2113 roff_node_relink(mdoc, nch);
2124 if (mdoc->meta.date == NULL)
2125 mdoc->meta.date = mandoc_normdate(NULL, NULL);
2127 if (mdoc->meta.title == NULL) {
2129 mdoc->meta.title = mandoc_strdup("UNTITLED");
2132 if (mdoc->meta.vol == NULL)
2133 mdoc->meta.vol = mandoc_strdup("LOCAL");
2135 if (mdoc->meta.os == NULL) {
2137 mdoc->meta.os = mandoc_strdup("");
2138 } else if (mdoc->meta.os_e &&
2139 (mdoc->meta.rcsids & (1 << mdoc->meta.os_e)) == 0)
2141 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
2144 if (mdoc->meta.arch != NULL &&
2145 arch_valid(mdoc->meta.arch, mdoc->meta.os_e) == 0) {
2146 n = mdoc->meta.first->child;
2154 "Dt ... %s %s", mdoc->meta.arch,
2155 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
2161 n = mdoc->meta.first->child;
2181 np = mdoc->last;
2273 n = mdoc->last;
2296 n = mdoc->last;
2305 post_delim(mdoc);
2306 post_hyph(mdoc);
2312 post_section(mdoc);
2314 switch (mdoc->last->type) {
2316 post_sh_head(mdoc);
2319 switch (mdoc->lastsec) {
2321 post_sh_name(mdoc);
2324 post_sh_see_also(mdoc);
2327 post_sh_authors(mdoc);
2346 for (n = mdoc->last->child; n != NULL; n = n->next) {
2379 mdoc->last->line, mdoc->last->pos, NULL);
2382 mdoc->last->line, mdoc->last->pos, NULL);
2393 n = mdoc->last->child;
2460 if ( ! child_an(mdoc->last))
2462 mdoc->last->line, mdoc->last->pos, NULL);
2522 sec = mdoc->last->sec;
2526 if (sec != SEC_NAME && mdoc->lastnamed == SEC_NONE)
2528 mdoc->last->line, mdoc->last->pos, "Sh %s",
2530 (nch = mdoc->last->child) == NULL ? "" :
2537 roff_setreg(mdoc->roff, "nS", 1, '=');
2538 mdoc->flags |= MDOC_SYNOPSIS;
2540 roff_setreg(mdoc->roff, "nS", 0, '=');
2541 mdoc->flags &= ~MDOC_SYNOPSIS;
2548 mdoc->lastsec = sec;
2553 if ((nch = mdoc->last->child) == NULL ||
2576 if (sec == mdoc->lastnamed)
2577 mandoc_msg(MANDOCERR_SEC_REP, mdoc->last->line,
2578 mdoc->last->pos, "Sh %s", secnames[sec]);
2580 if (sec < mdoc->lastnamed)
2581 mandoc_msg(MANDOCERR_SEC_ORDER, mdoc->last->line,
2582 mdoc->last->pos, "Sh %s", secnames[sec]);
2586 mdoc->lastnamed = sec;
2590 if (mdoc->meta.msec == NULL)
2596 if (*mdoc->meta.msec == '4')
2602 if (*mdoc->meta.msec == '2')
2604 if (*mdoc->meta.msec == '3')
2610 if (*mdoc->meta.msec == '9')
2615 mdoc->last->line, mdoc->last->pos,
2628 n = mdoc->last;
2641 post_delim_nb(mdoc);
2650 n = mdoc->last;
2653 post_prevpar(mdoc);
2670 post_delim(mdoc);
2671 post_hyph(mdoc);
2684 roff_node_delete(mdoc, nch);
2691 roff_node_delete(mdoc, nch);
2700 n = mdoc->last;
2722 roff_node_delete(mdoc, np);
2731 post_prevpar(mdoc);
2733 np = mdoc->last;
2744 n = mdoc->last;
2747 if (mdoc->meta.date != NULL) {
2749 free(mdoc->meta.date);
2750 } else if (mdoc->flags & MDOC_PBODY)
2752 else if (mdoc->meta.title != NULL)
2755 else if (mdoc->meta.os != NULL)
2759 if (mdoc->quick && n != NULL)
2760 mdoc->meta.date = mandoc_strdup("");
2762 mdoc->meta.date = mandoc_normdate(n->child, n);
2772 n = mdoc->last;
2775 if (mdoc->flags & MDOC_PBODY) {
2780 if (mdoc->meta.title != NULL)
2782 else if (mdoc->meta.os != NULL)
2786 free(mdoc->meta.title);
2787 free(mdoc->meta.msec);
2788 free(mdoc->meta.vol);
2789 free(mdoc->meta.arch);
2791 mdoc->meta.title = NULL;
2792 mdoc->meta.msec = NULL;
2793 mdoc->meta.vol = NULL;
2794 mdoc->meta.arch = NULL;
2801 mdoc->meta.title = mandoc_strdup("UNTITLED");
2803 mdoc->meta.title = mandoc_strdup(nn->string);
2823 "Dt %s", mdoc->meta.title);
2824 mdoc->meta.vol = mandoc_strdup("LOCAL");
2828 mdoc->meta.msec = mandoc_strdup(nn->string);
2836 mdoc->meta.vol = mandoc_strdup(nn->string);
2838 mdoc->meta.vol = mandoc_strdup(cp);
2839 if (mdoc->filesec != '\0' &&
2840 mdoc->filesec != *nn->string &&
2843 "*.%c vs Dt ... %c", mdoc->filesec, *nn->string);
2853 mdoc->meta.arch = mandoc_strdup(nn->string);
2868 post_delim_nb(mdoc);
2870 n = mdoc->last;
2881 mdoc->last = nch;
2883 mdoc->next = ROFF_NEXT_SIBLING;
2884 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2885 mdoc->last->flags |= NODE_NOSRC;
2886 mdoc->next = ROFF_NEXT_SIBLING;
2888 mdoc->next = ROFF_NEXT_CHILD;
2889 roff_word_alloc(mdoc, n->line, n->pos, "BSD");
2890 mdoc->last->flags |= NODE_NOSRC;
2893 mdoc->last = n;
2897 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2898 mdoc->last->flags |= NODE_NOSRC;
2899 mdoc->next = ROFF_NEXT_SIBLING;
2900 roff_word_alloc(mdoc, n->line, n->pos, "-");
2901 mdoc->last->flags |= NODE_NOSRC;
2902 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2903 mdoc->last->flags |= NODE_NOSRC;
2904 mdoc->last = n;
2923 n = mdoc->last;
2926 if (mdoc->meta.os != NULL)
2928 else if (mdoc->flags & MDOC_PBODY)
2931 post_delim(mdoc);
2942 free(mdoc->meta.os);
2943 mdoc->meta.os = NULL;
2944 deroff(&mdoc->meta.os, n);
2945 if (mdoc->meta.os)
2948 if (mdoc->os_s != NULL) {
2949 mdoc->meta.os = mandoc_strdup(mdoc->os_s);
2954 mdoc->meta.os = mandoc_strdup(OSNAME);
2956 if (mdoc->os_r == NULL) {
2959 mdoc->os_r = mandoc_strdup("UNKNOWN");
2961 mandoc_asprintf(&mdoc->os_r, "%s %s",
2964 mdoc->meta.os = mandoc_strdup(mdoc->os_r);
2968 if (mdoc->meta.os_e == MANDOC_OS_OTHER) {
2969 if (strstr(mdoc->meta.os, "OpenBSD") != NULL)
2970 mdoc->meta.os_e = MANDOC_OS_OPENBSD;
2971 else if (strstr(mdoc->meta.os, "NetBSD") != NULL)
2972 mdoc->meta.os_e = MANDOC_OS_NETBSD;
2984 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
2993 if (mdoc->meta.os_e == MANDOC_OS_OPENBSD)
2997 if (mdoc->meta.os_e == MANDOC_OS_NETBSD)