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;
998 post_delim_nb(mdoc);
1000 n = mdoc->last;
1003 mdoc->next = ROFF_NEXT_CHILD;
1006 roff_word_alloc(mdoc, n->line, n->pos, "/*");
1007 mdoc->last->flags = NODE_NOSRC;
1009 roff_word_alloc(mdoc, n->line, n->pos, "-l");
1010 mdoc->last->flags = NODE_DELIMO | NODE_NOSRC;
1011 mdoc->last = nch;
1018 roff_word_alloc(mdoc, n->line, n->pos, "*/");
1019 mdoc->last->flags = NODE_NOSRC;
1020 mdoc->last = n;
1026 roff_word_alloc(mdoc, n->line, n->pos, ccp);
1027 mdoc->last->flags = NODE_NOSRC;
1028 mdoc->last = n;
1035 roff_word_alloc(mdoc, n->line, n->pos, "library");
1036 mdoc->last->flags = NODE_NOSRC;
1037 roff_word_alloc(mdoc, n->line, n->pos, "\\(lq");
1038 mdoc->last->flags = NODE_DELIMO | NODE_NOSRC;
1039 mdoc->last = mdoc->last->next;
1040 roff_word_alloc(mdoc, n->line, n->pos, "\\(rq");
1041 mdoc->last->flags = NODE_DELIMC | NODE_NOSRC;
1042 mdoc->last = n;
1051 post_std(mdoc);
1053 n = mdoc->last;
1054 mdoc->next = ROFF_NEXT_CHILD;
1056 roff_word_alloc(mdoc, n->line, n->pos, "The");
1057 mdoc->last->flags |= NODE_NOSRC;
1058 ic = build_list(mdoc, MDOC_Fn);
1059 roff_word_alloc(mdoc, n->line, n->pos,
1061 mdoc->last->flags |= NODE_NOSRC;
1062 roff_word_alloc(mdoc, n->line, n->pos,
1065 roff_word_alloc(mdoc, n->line, n->pos, "Upon successful "
1067 mdoc->last->flags |= NODE_NOSRC;
1069 roff_word_alloc(mdoc, n->line, n->pos, "otherwise "
1071 mdoc->last->flags |= NODE_NOSRC;
1072 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Va);
1073 mdoc->last->flags |= NODE_NOSRC;
1074 roff_word_alloc(mdoc, n->line, n->pos, "errno");
1075 mdoc->last->flags |= NODE_NOSRC;
1076 mdoc->last = mdoc->last->parent;
1077 mdoc->next = ROFF_NEXT_SIBLING;
1078 roff_word_alloc(mdoc, n->line, n->pos,
1080 mdoc->last->flags |= NODE_EOS | NODE_NOSRC;
1081 mdoc->last = n;
1089 post_delim(mdoc);
1091 n = mdoc->last;
1106 n = mdoc->last;
1113 roff_node_delete(mdoc, n);
1118 mdoc->next = ROFF_NEXT_CHILD;
1119 roff_word_alloc(mdoc, nch->line, nch->pos, p);
1120 mdoc->last->flags |= NODE_NOSRC;
1121 mdoc->last= n;
1135 n = mdoc->last;
1154 roff_node_delete(mdoc, n);
1167 roff_node_delete(mdoc, nch->next);
1172 roff_node_delete(mdoc, n);
1249 n = mdoc->last;
1260 n = mdoc->last;
1279 np = mdoc->last;
1340 n = mdoc->last;
1362 post_fname(mdoc);
1363 post_fa(mdoc);
1371 n = mdoc->last;
1385 roff_node_delete(mdoc, n->last);
1387 post_delim(mdoc);
1389 post_fname(mdoc);
1398 for (n = mdoc->last->child; n != NULL; n = n->next) {
1410 post_delim_nb(mdoc);
1418 n = mdoc->last;
1421 n->child->type == ROFFT_TEXT && mdoc->meta.msec != NULL)
1422 mandoc_xr_add(mdoc->meta.msec, n->child->string, -1, -1);
1425 roff_node_relink(mdoc, n->last);
1427 if (mdoc->meta.name == NULL)
1428 deroff(&mdoc->meta.name, n);
1430 if (mdoc->meta.name == NULL ||
1431 (mdoc->lastsec == SEC_NAME && n->child == NULL))
1436 post_delim_nb(mdoc);
1439 post_delim(mdoc);
1446 mdoc->meta.name == NULL)
1449 mdoc->next = ROFF_NEXT_CHILD;
1450 roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name);
1451 mdoc->last->flags |= NODE_NOSRC;
1452 mdoc->last = n;
1460 n = mdoc->last;
1471 post_delim(mdoc);
1473 post_hyph(mdoc);
1481 n = mdoc->last;
1487 roff_node_delete(mdoc, n);
1492 post_hyph(mdoc);
1499 mdoc->next = ROFF_NEXT_SIBLING;
1501 roff_node_relink(mdoc,
1503 roff_node_delete(mdoc, n);
1506 post_bd(mdoc);
1507 post_prevpar(mdoc);
1527 n = mdoc->last;
1529 post_delim_nb(mdoc);
1532 mdoc->next = ROFF_NEXT_CHILD;
1535 roff_word_alloc(mdoc, n->line, n->pos, "file");
1536 mdoc->last->flags |= NODE_NOSRC;
1537 roff_word_alloc(mdoc, n->line, n->pos, "...");
1541 roff_word_alloc(mdoc, n->line, n->pos, "~");
1546 mdoc->last->flags |= NODE_NOSRC;
1547 mdoc->last = n;
1556 n = mdoc->last;
1570 mdoc->next = ROFF_NEXT_CHILD;
1572 roff_word_alloc(mdoc, nch->line, nch->pos, att);
1575 roff_word_alloc(mdoc, n->line, n->pos, "AT&T UNIX");
1576 mdoc->last->flags |= NODE_NOSRC;
1577 mdoc->last = n;
1585 post_an_norm(mdoc);
1587 np = mdoc->last;
1594 post_delim_nb(mdoc);
1603 post_tag(mdoc);
1604 tag_put(NULL, TAG_FALLBACK, mdoc->last);
1610 post_obsolete(mdoc);
1611 if (mdoc->last->type == ROFFT_BLOCK)
1612 mdoc->last->norm->Es = mdoc->last_es;
1620 n = mdoc->last;
1626 post_delim_nb(mdoc);
1634 n = mdoc->last;
1643 post_delim_nb(mdoc);
1649 post_obsolete(mdoc);
1650 mdoc->last_es = mdoc->last;
1664 n = mdoc->last;
1671 roff_node_delete(mdoc, n->prev);
1673 post_tag(mdoc);
1683 post_delim_nb(mdoc);
1685 n = mdoc->last;
1706 mdoc->next = ROFF_NEXT_CHILD;
1707 roff_word_alloc(mdoc, n->child->line, n->child->pos, v);
1708 v = mdoc->last->string;
1710 mdoc->last->flags |= NODE_NOSRC;
1711 mdoc->last = n;
1722 mdoc->next = ROFF_NEXT_CHILD;
1723 roff_word_alloc(mdoc, n->line, n->pos, os);
1724 mdoc->last->flags |= NODE_NOSRC;
1725 mdoc->last = n;
1735 post_prevpar(mdoc);
1737 nit = mdoc->last;
1780 roff_node_delete(mdoc, nit);
1810 post_prevpar(mdoc);
1812 n = mdoc->last;
1829 roff_node_relink(mdoc, nc);
1835 roff_node_delete(mdoc, nc);
1887 rewrite_macro2len(struct roff_man *mdoc, char **arg)
1898 else if ((tok = roffhash_find(mdoc->mdocmac, *arg, 0)) != TOKEN_NONE)
1917 post_bl_norm(mdoc);
1919 nh = mdoc->last;
1926 roff_node_delete(mdoc, nch);
1981 nbody = mdoc->last;
1984 post_bl_block(mdoc);
1987 post_bl_head(mdoc);
2007 nchild = mdoc->last;
2009 if (nchild == mdoc->last)
2012 mdoc->last = nbody;
2018 mdoc->last = nbody;
2024 mdoc->last = nbody->parent->parent;
2025 mdoc->next = ROFF_NEXT_CHILD;
2027 mdoc->last = nbody->parent->prev;
2028 mdoc->next = ROFF_NEXT_SIBLING;
2030 roff_node_relink(mdoc, nbody->child);
2049 mdoc->last = nchild->prev;
2050 mdoc->next = ROFF_NEXT_SIBLING;
2051 roff_block_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
2052 roff_head_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
2053 mdoc->next = ROFF_NEXT_SIBLING;
2054 roff_body_alloc(mdoc, nchild->line, nchild->pos, MDOC_It);
2056 roff_node_relink(mdoc, nchild);
2061 mdoc->next = ROFF_NEXT_SIBLING;
2063 mdoc->last = nbody;
2066 if (mdoc->meta.os_e != MANDOC_OS_NETBSD)
2101 n = mdoc->last;
2105 roff_node_delete(mdoc, n);
2114 nch = mdoc->last->child;
2117 mdoc->flags ^= MDOC_SMOFF;
2124 mdoc->flags &= ~MDOC_SMOFF;
2128 mdoc->flags |= MDOC_SMOFF;
2133 "%s %s", roff_name[mdoc->last->tok], nch->string);
2134 roff_node_relink(mdoc, nch);
2145 if (mdoc->meta.date == NULL)
2146 mdoc->meta.date = mandoc_normdate(NULL, NULL);
2148 if (mdoc->meta.title == NULL) {
2150 mdoc->meta.title = mandoc_strdup("UNTITLED");
2153 if (mdoc->meta.vol == NULL)
2154 mdoc->meta.vol = mandoc_strdup("LOCAL");
2156 if (mdoc->meta.os == NULL) {
2158 mdoc->meta.os = mandoc_strdup("");
2159 } else if (mdoc->meta.os_e &&
2160 (mdoc->meta.rcsids & (1 << mdoc->meta.os_e)) == 0)
2162 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
2165 if (mdoc->meta.arch != NULL &&
2166 arch_valid(mdoc->meta.arch, mdoc->meta.os_e) == 0) {
2167 n = mdoc->meta.first->child;
2175 "Dt ... %s %s", mdoc->meta.arch,
2176 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
2182 n = mdoc->meta.first->child;
2202 np = mdoc->last;
2294 n = mdoc->last;
2317 n = mdoc->last;
2326 post_delim(mdoc);
2327 post_hyph(mdoc);
2333 post_section(mdoc);
2335 switch (mdoc->last->type) {
2337 post_sh_head(mdoc);
2340 switch (mdoc->lastsec) {
2342 post_sh_name(mdoc);
2345 post_sh_see_also(mdoc);
2348 post_sh_authors(mdoc);
2367 for (n = mdoc->last->child; n != NULL; n = n->next) {
2400 mdoc->last->line, mdoc->last->pos, NULL);
2403 mdoc->last->line, mdoc->last->pos, NULL);
2414 n = mdoc->last->child;
2481 if ( ! child_an(mdoc->last))
2483 mdoc->last->line, mdoc->last->pos, NULL);
2543 sec = mdoc->last->sec;
2547 if (sec != SEC_NAME && mdoc->lastnamed == SEC_NONE)
2549 mdoc->last->line, mdoc->last->pos, "Sh %s",
2551 (nch = mdoc->last->child) == NULL ? "" :
2558 roff_setreg(mdoc->roff, "nS", 1, '=');
2559 mdoc->flags |= MDOC_SYNOPSIS;
2561 roff_setreg(mdoc->roff, "nS", 0, '=');
2562 mdoc->flags &= ~MDOC_SYNOPSIS;
2569 mdoc->lastsec = sec;
2574 if ((nch = mdoc->last->child) == NULL ||
2597 if (sec == mdoc->lastnamed)
2598 mandoc_msg(MANDOCERR_SEC_REP, mdoc->last->line,
2599 mdoc->last->pos, "Sh %s", secnames[sec]);
2601 if (sec < mdoc->lastnamed)
2602 mandoc_msg(MANDOCERR_SEC_ORDER, mdoc->last->line,
2603 mdoc->last->pos, "Sh %s", secnames[sec]);
2607 mdoc->lastnamed = sec;
2611 if (mdoc->meta.msec == NULL)
2617 if (*mdoc->meta.msec == '4')
2623 if (*mdoc->meta.msec == '2')
2625 if (*mdoc->meta.msec == '3')
2631 if (*mdoc->meta.msec == '9')
2636 mdoc->last->line, mdoc->last->pos,
2649 n = mdoc->last;
2662 post_delim_nb(mdoc);
2671 n = mdoc->last;
2674 post_prevpar(mdoc);
2691 post_delim(mdoc);
2692 post_hyph(mdoc);
2705 roff_node_delete(mdoc, nch);
2712 roff_node_delete(mdoc, nch);
2721 n = mdoc->last;
2743 roff_node_delete(mdoc, np);
2752 post_prevpar(mdoc);
2754 np = mdoc->last;
2765 n = mdoc->last;
2768 if (mdoc->meta.date != NULL) {
2770 free(mdoc->meta.date);
2771 } else if (mdoc->flags & MDOC_PBODY)
2773 else if (mdoc->meta.title != NULL)
2776 else if (mdoc->meta.os != NULL)
2780 if (mdoc->quick)
2781 mdoc->meta.date = mandoc_strdup("");
2783 mdoc->meta.date = mandoc_normdate(n->child, n);
2793 n = mdoc->last;
2796 if (mdoc->flags & MDOC_PBODY) {
2801 if (mdoc->meta.title != NULL)
2803 else if (mdoc->meta.os != NULL)
2807 free(mdoc->meta.title);
2808 free(mdoc->meta.msec);
2809 free(mdoc->meta.vol);
2810 free(mdoc->meta.arch);
2812 mdoc->meta.title = NULL;
2813 mdoc->meta.msec = NULL;
2814 mdoc->meta.vol = NULL;
2815 mdoc->meta.arch = NULL;
2822 mdoc->meta.title = mandoc_strdup("UNTITLED");
2824 mdoc->meta.title = mandoc_strdup(nn->string);
2844 "Dt %s", mdoc->meta.title);
2848 mdoc->meta.msec = mandoc_strdup(nn->string);
2857 mdoc->meta.vol = mandoc_strdup(cp);
2858 if (mdoc->filesec != '\0' &&
2859 mdoc->filesec != *nn->string &&
2862 "*.%c vs Dt ... %c", mdoc->filesec, *nn->string);
2872 mdoc->meta.arch = mandoc_strdup(nn->string);
2887 post_delim_nb(mdoc);
2889 n = mdoc->last;
2900 mdoc->last = nch;
2902 mdoc->next = ROFF_NEXT_SIBLING;
2903 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2904 mdoc->last->flags |= NODE_NOSRC;
2905 mdoc->next = ROFF_NEXT_SIBLING;
2907 mdoc->next = ROFF_NEXT_CHILD;
2908 roff_word_alloc(mdoc, n->line, n->pos, "BSD");
2909 mdoc->last->flags |= NODE_NOSRC;
2912 mdoc->last = n;
2916 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2917 mdoc->last->flags |= NODE_NOSRC;
2918 mdoc->next = ROFF_NEXT_SIBLING;
2919 roff_word_alloc(mdoc, n->line, n->pos, "-");
2920 mdoc->last->flags |= NODE_NOSRC;
2921 roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Ns);
2922 mdoc->last->flags |= NODE_NOSRC;
2923 mdoc->last = n;
2942 n = mdoc->last;
2945 if (mdoc->meta.os != NULL)
2947 else if (mdoc->flags & MDOC_PBODY)
2950 post_delim(mdoc);
2961 free(mdoc->meta.os);
2962 mdoc->meta.os = NULL;
2963 deroff(&mdoc->meta.os, n);
2964 if (mdoc->meta.os)
2967 if (mdoc->os_s != NULL) {
2968 mdoc->meta.os = mandoc_strdup(mdoc->os_s);
2973 mdoc->meta.os = mandoc_strdup(OSNAME);
2975 if (mdoc->os_r == NULL) {
2978 mdoc->os_r = mandoc_strdup("UNKNOWN");
2980 mandoc_asprintf(&mdoc->os_r, "%s %s",
2983 mdoc->meta.os = mandoc_strdup(mdoc->os_r);
2987 if (mdoc->meta.os_e == MANDOC_OS_OTHER) {
2988 if (strstr(mdoc->meta.os, "OpenBSD") != NULL)
2989 mdoc->meta.os_e = MANDOC_OS_OPENBSD;
2990 else if (strstr(mdoc->meta.os, "NetBSD") != NULL)
2991 mdoc->meta.os_e = MANDOC_OS_NETBSD;
3003 mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
3012 if (mdoc->meta.os_e == MANDOC_OS_OPENBSD)
3016 if (mdoc->meta.os_e == MANDOC_OS_NETBSD)