Lines Matching defs:mdoc
19 * Validation module for mdoc(7) syntax trees used by mandoc(1).
38 #include "mdoc.h"
46 #define POST_ARGS struct roff_man *mdoc
298 /* Validate the subtree rooted at mdoc->last. */
300 mdoc_validate(struct roff_man *mdoc)
311 n = mdoc->last;
317 post_obsolete(mdoc);
329 mdoc->last = mdoc->last->child;
330 while (mdoc->last != NULL) {
331 mdoc_validate(mdoc);
332 if (mdoc->last == n)
333 mdoc->last = mdoc->last->child;
335 mdoc->last = mdoc->last->next;
340 mdoc->last = n;
341 mdoc->next = ROFF_NEXT_SIBLING;
347 check_text(mdoc, n->line, n->pos, n->string);
351 check_text_em(mdoc, n->line, n->pos, n->string);
354 check_toptext(mdoc, n->line, n->pos, n->string);
361 post_root(mdoc);
364 check_args(mdoc, mdoc->last);
380 roff_validate(mdoc);
387 (*p)(mdoc);
388 if (mdoc->last == n)
389 mdoc_state(mdoc, n);
395 check_args(struct roff_man *mdoc, struct roff_node *n)
404 check_argv(mdoc, n, &n->args->argv[i]);
408 check_argv(struct roff_man *mdoc, struct roff_node *n, struct mdoc_argv *v)
413 check_text(mdoc, v->line, v->pos, v->value[i]);
417 check_text(struct roff_man *mdoc, int ln, int pos, char *p)
421 if (mdoc->last->flags & NODE_NOFILL)
429 check_text_em(struct roff_man *mdoc, int ln, int pos, char *p)
434 np = mdoc->last->prev;
435 nn = mdoc->last->next;
480 check_toptext(struct roff_man *mdoc, int ln, int pos, const char *p)
523 tok = mdoc->last->tok;
524 nch = mdoc->last->last;
539 nch == mdoc->last->child ? "" : " ...", nch->string);
556 tok = mdoc->last->tok;
557 nch = mdoc->last->last;
632 nch == mdoc->last->child ? "" : " ...", nch->string);
644 n = mdoc->last->parent;
712 rewrite_macro2len(mdoc, argv->value);
725 rewrite_macro2len(mdoc, argv->value);
813 n = mdoc->last;
847 rewrite_macro2len(mdoc, argv->value);
886 n = mdoc->last;
910 post_useless(mdoc);
911 n = mdoc->last;
917 roff_node_delete(mdoc, n->child);
919 roff_word_alloc(mdoc, n->line, n->pos, n->tok == MDOC_Bt ?
921 mdoc->last->flags |= NODE_EOS | NODE_NOSRC;
922 mdoc->last = n;
926 build_list(struct roff_man *mdoc, int tok)
931 n = mdoc->last->next;
933 roff_elem_alloc(mdoc, n->line, n->pos, tok);
934 mdoc->last->flags |= NODE_NOSRC;
935 roff_node_relink(mdoc, n);
936 n = mdoc->last = mdoc->last->parent;
937 mdoc->next = ROFF_NEXT_SIBLING;
941 roff_word_alloc(mdoc, n->line, n->pos, ",");
942 mdoc->last->flags |= NODE_DELIMC | NODE_NOSRC;
944 n = mdoc->last->next;
946 roff_word_alloc(mdoc, n->line, n->pos, "and");
947 mdoc->last->flags |= NODE_NOSRC;
958 post_std(mdoc);
960 n = mdoc->last;
961 mdoc->next = ROFF_NEXT_CHILD;
962 roff_word_alloc(mdoc, n->line, n->pos, "The");
963 mdoc->last->flags |= NODE_NOSRC;
965 if (mdoc->last->next != NULL)
966 ic = build_list(mdoc, MDOC_Nm);
967 else if (mdoc->meta.name != NULL) {
968 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Nm);
969 mdoc->last->flags |= NODE_NOSRC;
970 roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name);
971 mdoc->last->flags |= NODE_NOSRC;
972 mdoc->last = mdoc->last->parent;
973 mdoc->next = ROFF_NEXT_SIBLING;
980 roff_word_alloc(mdoc, n->line, n->pos,
982 mdoc->last->flags |= NODE_NOSRC;
983 roff_word_alloc(mdoc, n->line, n->pos,
985 mdoc->last->flags |= NODE_EOS | NODE_NOSRC;
986 mdoc->last = n;
994 post_delim_nb(mdoc);
996 n = mdoc->last;
998 mdoc->next = ROFF_NEXT_CHILD;
999 roff_word_alloc(mdoc, n->line, n->pos, "library");
1000 mdoc->last->flags = NODE_NOSRC;
1001 roff_word_alloc(mdoc, n->line, n->pos, "\\(lq");
1002 mdoc->last->flags = NODE_DELIMO | NODE_NOSRC;
1003 mdoc->last = mdoc->last->next;
1004 roff_word_alloc(mdoc, n->line, n->pos, "\\(rq");
1005 mdoc->last->flags = NODE_DELIMC | NODE_NOSRC;
1006 mdoc->last = n;
1015 post_std(mdoc);
1017 n = mdoc->last;
1018 mdoc->next = ROFF_NEXT_CHILD;
1020 roff_word_alloc(mdoc, n->line, n->pos, "The");
1021 mdoc->last->flags |= NODE_NOSRC;
1022 ic = build_list(mdoc, MDOC_Fn);
1023 roff_word_alloc(mdoc, n->line, n->pos,
1025 mdoc->last->flags |= NODE_NOSRC;
1026 roff_word_alloc(mdoc, n->line, n->pos,
1029 roff_word_alloc(mdoc, n->line, n->pos, "Upon successful "
1031 mdoc->last->flags |= NODE_NOSRC;
1033 roff_word_alloc(mdoc, n->line, n->pos, "otherwise "
1035 mdoc->last->flags |= NODE_NOSRC;
1036 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Va);
1037 mdoc->last->flags |= NODE_NOSRC;
1038 roff_word_alloc(mdoc, n->line, n->pos, "errno");
1039 mdoc->last->flags |= NODE_NOSRC;
1040 mdoc->last = mdoc->last->parent;
1041 mdoc->next = ROFF_NEXT_SIBLING;
1042 roff_word_alloc(mdoc, n->line, n->pos,
1044 mdoc->last->flags |= NODE_EOS | NODE_NOSRC;
1045 mdoc->last = n;
1053 post_delim(mdoc);
1055 n = mdoc->last;
1070 n = mdoc->last;
1077 roff_node_delete(mdoc, n);
1082 mdoc->next = ROFF_NEXT_CHILD;
1083 roff_word_alloc(mdoc, nch->line, nch->pos, p);
1084 mdoc->last->flags |= NODE_NOSRC;
1085 mdoc->last= n;
1099 n = mdoc->last;
1118 roff_node_delete(mdoc, n);
1131 roff_node_delete(mdoc, nch->next);
1136 roff_node_delete(mdoc, n);
1213 n = mdoc->last;
1224 n = mdoc->last;
1243 np = mdoc->last;
1304 n = mdoc->last;
1326 post_fname(mdoc);
1327 post_fa(mdoc);
1335 n = mdoc->last;
1349 roff_node_delete(mdoc, n->last);
1351 post_delim(mdoc);
1353 post_fname(mdoc);
1362 for (n = mdoc->last->child; n != NULL; n = n->next) {
1374 post_delim_nb(mdoc);
1382 n = mdoc->last;
1385 n->child->type == ROFFT_TEXT && mdoc->meta.msec != NULL)
1386 mandoc_xr_add(mdoc->meta.msec, n->child->string, -1, -1);
1389 roff_node_relink(mdoc, n->last);
1391 if (mdoc->meta.name == NULL)
1392 deroff(&mdoc->meta.name, n);
1394 if (mdoc->meta.name == NULL ||
1395 (mdoc->lastsec == SEC_NAME && n->child == NULL))
1400 post_delim_nb(mdoc);
1403 post_delim(mdoc);
1410 mdoc->meta.name == NULL)
1413 mdoc->next = ROFF_NEXT_CHILD;
1414 roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name);
1415 mdoc->last->flags |= NODE_NOSRC;
1416 mdoc->last = n;
1424 n = mdoc->last;
1435 post_delim(mdoc);
1437 post_hyph(mdoc);
1445 n = mdoc->last;
1451 roff_node_delete(mdoc, n);
1456 post_hyph(mdoc);
1463 mdoc->next = ROFF_NEXT_SIBLING;
1465 roff_node_relink(mdoc,
1467 roff_node_delete(mdoc, n);
1470 post_bd(mdoc);
1471 post_prevpar(mdoc);
1491 n = mdoc->last;
1493 post_delim_nb(mdoc);
1496 mdoc->next = ROFF_NEXT_CHILD;
1499 roff_word_alloc(mdoc, n->line, n->pos, "file");
1500 mdoc->last->flags |= NODE_NOSRC;
1501 roff_word_alloc(mdoc, n->line, n->pos, "...");
1505 roff_word_alloc(mdoc, n->line, n->pos, "~");
1510 mdoc->last->flags |= NODE_NOSRC;
1511 mdoc->last = n;
1520 n = mdoc->last;
1534 mdoc->next = ROFF_NEXT_CHILD;
1536 roff_word_alloc(mdoc, nch->line, nch->pos, att);
1539 roff_word_alloc(mdoc, n->line, n->pos, "AT&T UNIX");
1540 mdoc->last->flags |= NODE_NOSRC;
1541 mdoc->last = n;
1549 post_an_norm(mdoc);
1551 np = mdoc->last;
1558 post_delim_nb(mdoc);
1567 post_tag(mdoc);
1568 tag_put(NULL, TAG_FALLBACK, mdoc->last);
1574 post_obsolete(mdoc);
1575 if (mdoc->last->type == ROFFT_BLOCK)
1576 mdoc->last->norm->Es = mdoc->last_es;
1584 n = mdoc->last;
1590 post_delim_nb(mdoc);
1598 n = mdoc->last;
1607 post_delim_nb(mdoc);
1613 post_obsolete(mdoc);
1614 mdoc->last_es = mdoc->last;
1628 n = mdoc->last;
1635 roff_node_delete(mdoc, n->prev);
1637 post_tag(mdoc);
1647 post_delim_nb(mdoc);
1649 n = mdoc->last;
1670 mdoc->next = ROFF_NEXT_CHILD;
1671 roff_word_alloc(mdoc, n->child->line, n->child->pos, v);
1672 v = mdoc->last->string;
1674 mdoc->last->flags |= NODE_NOSRC;
1675 mdoc->last = n;
1686 mdoc->next = ROFF_NEXT_CHILD;
1687 roff_word_alloc(mdoc, n->line, n->pos, os);
1688 mdoc->last->flags |= NODE_NOSRC;
1689 mdoc->last = n;
1699 post_prevpar(mdoc);
1701 nit = mdoc->last;
1744 roff_node_delete(mdoc, nit);
1774 post_prevpar(mdoc);
1776 n = mdoc->last;
1793 roff_node_relink(mdoc, nc);
1799 roff_node_delete(mdoc, nc);
1812 rewrite_macro2len(struct roff_man *mdoc, char **arg)
1821 else if ((tok = roffhash_find(mdoc->mdocmac, *arg, 0)) == TOKEN_NONE)
1837 post_bl_norm(mdoc);
1839 nh = mdoc->last;
1846 roff_node_delete(mdoc, nch);
1901 nbody = mdoc->last;
1904 post_bl_block(mdoc);
1907 post_bl_head(mdoc);
1927 nchild = mdoc->last;
1929 if (nchild == mdoc->last)
1932 mdoc->last = nbody;
1938 mdoc->last = nbody;
1944 mdoc->last = nbody->parent->parent;
1945 mdoc->next = ROFF_NEXT_CHILD;
1947 mdoc->last = nbody->parent->prev;
1948 mdoc->next = ROFF_NEXT_SIBLING;
1950 roff_node_relink(mdoc, nbody->child);
1969 mdoc->last = nchild->prev;
1970 mdoc->next = ROFF_NEXT_SIBLING;
1971 roff_block_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
1972 roff_head_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
1973 mdoc->next = ROFF_NEXT_SIBLING;
1974 roff_body_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
1976 roff_node_relink(mdoc, nchild);
1981 mdoc->next = ROFF_NEXT_SIBLING;
1983 mdoc->last = nbody;
1986 if (mdoc->meta.os_e != MANDOC_OS_NETBSD)
2021 n = mdoc->last;
2025 roff_node_delete(mdoc, n);
2034 nch = mdoc->last->child;
2037 mdoc->flags ^= MDOC_SMOFF;
2044 mdoc->flags &= ~MDOC_SMOFF;
2048 mdoc->flags |= MDOC_SMOFF;
2053 "%s %s", roff_name[mdoc->last->tok], nch->string);
2054 roff_node_relink(mdoc, nch);
2065 if (mdoc->meta.date == NULL)
2066 mdoc->meta.date = mandoc_normdate(NULL, NULL);
2068 if (mdoc->meta.title == NULL) {
2070 mdoc->meta.title = mandoc_strdup("UNTITLED");
2073 if (mdoc->meta.vol == NULL)
2074 mdoc->meta.vol = mandoc_strdup("LOCAL");
2076 if (mdoc->meta.os == NULL) {
2078 mdoc->meta.os = mandoc_strdup("");
2079 } else if (mdoc->meta.os_e &&
2080 (mdoc->meta.rcsids & (1 << mdoc->meta.os_e)) == 0)
2082 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
2085 if (mdoc->meta.arch != NULL &&
2086 arch_valid(mdoc->meta.arch, mdoc->meta.os_e) == 0) {
2087 n = mdoc->meta.first->child;
2095 "Dt ... %s %s", mdoc->meta.arch,
2096 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
2102 n = mdoc->meta.first->child;
2122 np = mdoc->last;
2214 n = mdoc->last;
2237 n = mdoc->last;
2246 post_delim(mdoc);
2247 post_hyph(mdoc);
2253 post_section(mdoc);
2255 switch (mdoc->last->type) {
2257 post_sh_head(mdoc);
2260 switch (mdoc->lastsec) {
2262 post_sh_name(mdoc);
2265 post_sh_see_also(mdoc);
2268 post_sh_authors(mdoc);
2287 for (n = mdoc->last->child; n != NULL; n = n->next) {
2320 mdoc->last->line, mdoc->last->pos, NULL);
2323 mdoc->last->line, mdoc->last->pos, NULL);
2334 n = mdoc->last->child;
2401 if ( ! child_an(mdoc->last))
2403 mdoc->last->line, mdoc->last->pos, NULL);
2463 sec = mdoc->last->sec;
2467 if (sec != SEC_NAME && mdoc->lastnamed == SEC_NONE)
2469 mdoc->last->line, mdoc->last->pos, "Sh %s",
2471 (nch = mdoc->last->child) == NULL ? "" :
2478 roff_setreg(mdoc->roff, "nS", 1, '=');
2479 mdoc->flags |= MDOC_SYNOPSIS;
2481 roff_setreg(mdoc->roff, "nS", 0, '=');
2482 mdoc->flags &= ~MDOC_SYNOPSIS;
2489 mdoc->lastsec = sec;
2494 if ((nch = mdoc->last->child) == NULL ||
2517 if (sec == mdoc->lastnamed)
2518 mandoc_msg(MANDOCERR_SEC_REP, mdoc->last->line,
2519 mdoc->last->pos, "Sh %s", secnames[sec]);
2521 if (sec < mdoc->lastnamed)
2522 mandoc_msg(MANDOCERR_SEC_ORDER, mdoc->last->line,
2523 mdoc->last->pos, "Sh %s", secnames[sec]);
2527 mdoc->lastnamed = sec;
2531 if (mdoc->meta.msec == NULL)
2537 if (*mdoc->meta.msec == '4')
2543 if (*mdoc->meta.msec == '2')
2545 if (*mdoc->meta.msec == '3')
2551 if (*mdoc->meta.msec == '9')
2556 mdoc->last->line, mdoc->last->pos,
2569 n = mdoc->last;
2582 post_delim_nb(mdoc);
2591 n = mdoc->last;
2594 post_prevpar(mdoc);
2611 post_delim(mdoc);
2612 post_hyph(mdoc);
2625 roff_node_delete(mdoc, nch);
2632 roff_node_delete(mdoc, nch);
2641 n = mdoc->last;
2663 roff_node_delete(mdoc, np);
2672 post_prevpar(mdoc);
2674 np = mdoc->last;
2685 n = mdoc->last;
2688 if (mdoc->meta.date != NULL) {
2690 free(mdoc->meta.date);
2691 } else if (mdoc->flags & MDOC_PBODY)
2693 else if (mdoc->meta.title != NULL)
2696 else if (mdoc->meta.os != NULL)
2700 if (mdoc->quick && n != NULL)
2701 mdoc->meta.date = mandoc_strdup("");
2703 mdoc->meta.date = mandoc_normdate(n->child, n);
2713 n = mdoc->last;
2716 if (mdoc->flags & MDOC_PBODY) {
2721 if (mdoc->meta.title != NULL)
2723 else if (mdoc->meta.os != NULL)
2727 free(mdoc->meta.title);
2728 free(mdoc->meta.msec);
2729 free(mdoc->meta.vol);
2730 free(mdoc->meta.arch);
2732 mdoc->meta.title = NULL;
2733 mdoc->meta.msec = NULL;
2734 mdoc->meta.vol = NULL;
2735 mdoc->meta.arch = NULL;
2742 mdoc->meta.title = mandoc_strdup("UNTITLED");
2744 mdoc->meta.title = mandoc_strdup(nn->string);
2764 "Dt %s", mdoc->meta.title);
2765 mdoc->meta.vol = mandoc_strdup("LOCAL");
2769 mdoc->meta.msec = mandoc_strdup(nn->string);
2777 mdoc->meta.vol = mandoc_strdup(nn->string);
2779 mdoc->meta.vol = mandoc_strdup(cp);
2780 if (mdoc->filesec != '\0' &&
2781 mdoc->filesec != *nn->string &&
2784 "*.%c vs Dt ... %c", mdoc->filesec, *nn->string);
2794 mdoc->meta.arch = mandoc_strdup(nn->string);
2809 post_delim_nb(mdoc);
2811 n = mdoc->last;
2822 mdoc->last = nch;
2824 mdoc->next = ROFF_NEXT_SIBLING;
2825 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2826 mdoc->last->flags |= NODE_NOSRC;
2827 mdoc->next = ROFF_NEXT_SIBLING;
2829 mdoc->next = ROFF_NEXT_CHILD;
2830 roff_word_alloc(mdoc, n->line, n->pos, "BSD");
2831 mdoc->last->flags |= NODE_NOSRC;
2834 mdoc->last = n;
2838 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2839 mdoc->last->flags |= NODE_NOSRC;
2840 mdoc->next = ROFF_NEXT_SIBLING;
2841 roff_word_alloc(mdoc, n->line, n->pos, "-");
2842 mdoc->last->flags |= NODE_NOSRC;
2843 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2844 mdoc->last->flags |= NODE_NOSRC;
2845 mdoc->last = n;
2864 n = mdoc->last;
2867 if (mdoc->meta.os != NULL)
2869 else if (mdoc->flags & MDOC_PBODY)
2872 post_delim(mdoc);
2883 free(mdoc->meta.os);
2884 mdoc->meta.os = NULL;
2885 deroff(&mdoc->meta.os, n);
2886 if (mdoc->meta.os)
2889 if (mdoc->os_s != NULL) {
2890 mdoc->meta.os = mandoc_strdup(mdoc->os_s);
2895 mdoc->meta.os = mandoc_strdup(OSNAME);
2897 if (mdoc->os_r == NULL) {
2900 mdoc->os_r = mandoc_strdup("UNKNOWN");
2902 mandoc_asprintf(&mdoc->os_r, "%s %s",
2905 mdoc->meta.os = mandoc_strdup(mdoc->os_r);
2909 if (mdoc->meta.os_e == MANDOC_OS_OTHER) {
2910 if (strstr(mdoc->meta.os, "OpenBSD") != NULL)
2911 mdoc->meta.os_e = MANDOC_OS_OPENBSD;
2912 else if (strstr(mdoc->meta.os, "NetBSD") != NULL)
2913 mdoc->meta.os_e = MANDOC_OS_NETBSD;
2925 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
2934 if (mdoc->meta.os_e == MANDOC_OS_OPENBSD)
2938 if (mdoc->meta.os_e == MANDOC_OS_NETBSD)