=================================================================== RCS file: /cvs/pod2mdoc/pod2mdoc.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -p -r1.38 -r1.39 --- pod2mdoc/pod2mdoc.c 2015/02/13 12:40:54 1.38 +++ pod2mdoc/pod2mdoc.c 2015/02/13 15:35:15 1.39 @@ -1,4 +1,4 @@ -/* $Id: pod2mdoc.c,v 1.38 2015/02/13 12:40:54 schwarze Exp $ */ +/* $Id: pod2mdoc.c,v 1.39 2015/02/13 15:35:15 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2014, 2015 Ingo Schwarze @@ -479,6 +479,7 @@ formatcode(struct state *st, const char *buf, size_t * { enum fmt fmt; size_t i, j, dsz; + unsigned char uc; assert(*start + 1 < end); assert('<' == buf[*start + 1]); @@ -612,21 +613,28 @@ formatcode(struct state *st, const char *buf, size_t * else printf("Ar "); break; - } - if (0 == strncmp(buf + *start, "NULL", 4) && - ('=' == buf[*start + 4] || - '>' == buf[*start + 4])) { + } + i = 0; + uc = buf[*start]; + while (isalnum(uc) || '_' == uc || ' ' == uc) + uc = buf[*start + ++i]; + if ('=' != uc && '>' != uc) + i = 0; + if (4 == i && ! strncmp(buf + *start, "NULL", 4)) { printf("Dv "); break; } - i = 0; - while (isalnum((unsigned char)buf[*start + i]) || - '_' == buf[*start + i]) - i++; - if (i && MDOC_Fa == dict_get(buf + *start, i)) + switch (i ? dict_get(buf + *start, i) : MDOC_MAX) { + case MDOC_Fa: printf("Fa "); - else + break; + case MDOC_Vt: + printf("Vt "); + break; + default: printf("Sy "); + break; + } break; case (FMT_CODE): printf("Qo Li "); @@ -1014,6 +1022,32 @@ command(struct state *st, const char *buf, size_t star } /* + * Put the type provided as an argument into the dictionary. + */ +static void +register_type(const char *ptype) +{ + const char *pname, *pend; + + pname = ptype; + while (isalnum((unsigned char)*pname) || '_' == *pname) + pname++; + if ((pname - ptype == 6 && ! strncmp(ptype, "struct", 6)) || + (pname - ptype == 4 && ! strncmp(ptype, "enum", 4))) { + while (' ' == *pname) + pname++; + pend = pname; + while (isalnum((unsigned char)*pend) || '_' == *pend) + pend++; + if (pend > pname) + dict_put(pname, pend - pname, MDOC_Vt); + } else + pend = pname; + if (pend > ptype) + dict_put(ptype, pend - ptype, MDOC_Vt); +} + +/* * Just pump out the line in a verbatim block. * From the perspective of external callers, * always stays in OUST_NL/wantws mode. @@ -1110,6 +1144,7 @@ again: if (buf[i] == '\n') buf[i] = ' '; buf[ifo++] = '\0'; + register_type(buf + ift); printf(".Ft %s", buf + ift); if (buf[ifo] == '*') { fputs(" *", stdout); @@ -1118,7 +1153,7 @@ again: putchar('\n'); buf[ifa++] = '\0'; printf(".Fo %s\n", buf + ifo); - dict_put(buf + ifo, MDOC_Fo); + dict_put(buf + ifo, 0, MDOC_Fo); buf[ifc++] = '\0'; for (;;) { cp = strchr(buf + ifa, ','); @@ -1131,7 +1166,8 @@ again: '_' == cp2[-1]) cp2--; if ('\0' != *cp2) - dict_put(cp2, MDOC_Fa); + dict_put(cp2, 0, MDOC_Fa); + register_type(buf + ifa); printf(".Fa \"%s\"\n", buf + ifa); if (cp == NULL) break;