X-Git-Url: https://git.llucax.com/software/mutt-debian.git/blobdiff_plain/14c29200cb58d3c4a0830265f2433849781858d0..76a54b65b4d405cea98a5d5b18d2030b4ed9b556:/doc/makedoc.c diff --git a/doc/makedoc.c b/doc/makedoc.c index 528d372..8075d58 100644 --- a/doc/makedoc.c +++ b/doc/makedoc.c @@ -76,11 +76,14 @@ enum output_formats_t #define D_DT (1 << 7) #define D_DD (1 << 8) #define D_PA (1 << 9) +#define D_IL (1 << 10) +#define D_TT (1 << 11) enum { SP_START_EM, SP_START_BF, + SP_START_TT, SP_END_FT, SP_NEWLINE, SP_NEWPAR, @@ -93,6 +96,8 @@ enum SP_DD, SP_END_DD, SP_END_DL, + SP_START_IL, + SP_END_IL, SP_END_SECT, SP_REFER }; @@ -112,8 +117,8 @@ static void print_confline (const char *, int, const char *, FILE *); static void handle_confline (char *, FILE *); static void makedoc (FILE *, FILE *); static void pretty_default (char *, size_t, const char *, int); -static int sgml_fputc (int, FILE *); -static int sgml_fputs (const char *, FILE *); +static int sgml_fputc (int, FILE *, int); +static int sgml_fputs (const char *, FILE *, int); static int sgml_id_fputs (const char *, FILE *); int main (int argc, char *argv[]) @@ -584,38 +589,42 @@ static void sgml_print_strval (const char *v, FILE *out) if (*v < ' ' || *v & 0x80) { char_to_escape (buff, (unsigned int) *v); - sgml_fputs (buff, out); + sgml_fputs (buff, out, 1); continue; } - sgml_fputc ((unsigned int) *v, out); + sgml_fputc ((unsigned int) *v, out, 1); } } -static int sgml_fputc (int c, FILE *out) +static int sgml_fputc (int c, FILE *out, int full) { switch (c) { + /* the bare minimum for escaping */ case '<': return fputs ("<", out); case '>': return fputs (">", out); - case '$': return fputs ("$", out); - case '_': return fputs ("_", out); - case '%': return fputs ("%", out); case '&': return fputs ("&", out); - case '\\': return fputs ("\", out); - case '"': return fputs (""", out); - case '[': return fputs ("[", out); - case ']': return fputs ("]", out); - case '~': return fputs ("˜", out); + /* map to entities, fall-through to raw if !full */ + case '$': if (full) return fputs ("$", out); + case '_': if (full) return fputs ("_", out); + case '%': if (full) return fputs ("%", out); + case '\\': if (full) return fputs ("\", out); + case '"': if (full) return fputs (""", out); + case '[': if (full) return fputs ("[", out); + case ']': if (full) return fputs ("]", out); + case '~': if (full) return fputs ("˜", out); + case '|': if (full) return fputs ("|", out); + case '^': if (full) return fputs ("ˆ", out); default: return fputc (c, out); } } -static int sgml_fputs (const char *s, FILE *out) +static int sgml_fputs (const char *s, FILE *out, int full) { for (; *s; s++) - if (sgml_fputc ((unsigned int) *s, out) == EOF) + if (sgml_fputc ((unsigned int) *s, out, full) == EOF) return EOF; - + return 0; } @@ -624,12 +633,17 @@ static int sgml_id_fputs (const char *s, FILE* out) { char id; + if (*s == '<') + s++; + for (; *s; s++) { if (*s == '_') id = '-'; else id = *s; + if (*s == '>' && !*(s+1)) + break; if (fputc ((unsigned int) id, out) == EOF) return EOF; @@ -697,14 +711,23 @@ static void print_confline (const char *varname, int type, const char *val, FILE fputs ("\n\n", out); - sgml_fputs (varname, out); + sgml_fputs (varname, out, 1); fprintf (out, "\nType: %s", type2human (type)); + if (type == DT_STR || type == DT_RX || type == DT_ADDR || type == DT_PATH) { - fputs ("\nDefault: "", out); - sgml_print_strval (val, out); - fputs (""\n", out); + if (val && *val) + { + fputs ("\nDefault: ", out); + sgml_print_strval (val, out); + fputs ("", out); + } + else + { + fputs ("\nDefault: (empty)", out); + } + fputs ("\n", out); } else fprintf (out, "\nDefault: %s\n", val); @@ -733,6 +756,9 @@ static void print_confline (const char *varname, int type, const char *val, FILE ** - .dt starts a term in a definition list. ** - .dd starts a definition in a definition list. ** - .de on a line finishes a definition list. + ** - .il on a line starts an itemzied list + ** - .dd starts an item in an itemized list + ** - .ie on a line finishes an itemized list ** - .ts on a line starts a "tscreen" environment (name taken from SGML). ** - .te on a line finishes this environment. ** - .pp on a line starts a paragraph. @@ -766,7 +792,7 @@ static int flush_doc (int docstat, FILE *out) if (docstat & (D_DL)) docstat = print_it (SP_END_DL, NULL, out, docstat); - if (docstat & (D_EM | D_BF)) + if (docstat & (D_EM | D_BF | D_TT)) docstat = print_it (SP_END_FT, NULL, out, docstat); docstat = print_it (SP_END_SECT, NULL, out, docstat); @@ -794,9 +820,10 @@ static int print_it (int special, char *str, FILE *out, int docstat) { static int Continuation = 0; - case SP_END_FT: docstat &= ~(D_EM|D_BF); break; + case SP_END_FT: docstat &= ~(D_EM|D_BF|D_TT); break; case SP_START_BF: docstat |= D_BF; break; case SP_START_EM: docstat |= D_EM; break; + case SP_START_TT: docstat |= D_TT; break; case SP_NEWLINE: { if (onl) @@ -850,6 +877,8 @@ static int print_it (int special, char *str, FILE *out, int docstat) } case SP_DD: { + if (docstat & D_IL) + fputs ("- ", out); Continuation = 0; break; } @@ -859,6 +888,17 @@ static int print_it (int special, char *str, FILE *out, int docstat) docstat &= ~D_DL; break; } + case SP_START_IL: + { + docstat |= D_IL; + break; + } + case SP_END_IL: + { + Continuation = 0; + docstat &= ~D_IL; + break; + } case SP_STR: { if (Continuation) @@ -890,23 +930,30 @@ static int print_it (int special, char *str, FILE *out, int docstat) case SP_END_FT: { fputs ("\\fP", out); - docstat &= ~(D_EM|D_BF); + docstat &= ~(D_EM|D_BF|D_TT); break; } case SP_START_BF: { fputs ("\\fB", out); docstat |= D_BF; - docstat &= ~D_EM; + docstat &= ~(D_EM|D_TT); break; } case SP_START_EM: { fputs ("\\fI", out); docstat |= D_EM; - docstat &= ~D_BF; + docstat &= ~(D_BF|D_TT); break; } + case SP_START_TT: + { + fputs ("\\fC", out); + docstat |= D_TT; + docstat &= ~(D_BF|D_EM); + break; + } case SP_NEWLINE: { if (onl) @@ -959,7 +1006,10 @@ static int print_it (int special, char *str, FILE *out, int docstat) } case SP_DD: { - fputs ("\n", out); + if (docstat & D_IL) + fputs (".TP\n\\(hy ", out); + else + fputs ("\n", out); break; } case SP_END_DL: @@ -968,6 +1018,18 @@ static int print_it (int special, char *str, FILE *out, int docstat) docstat &= ~D_DL; break; } + case SP_START_IL: + { + fputs (".RS\n.PD 0\n", out); + docstat |= D_IL; + break; + } + case SP_END_IL: + { + fputs (".RE\n.PD 1", out); + docstat &= ~D_DL; + break; + } case SP_STR: { while (*str) @@ -1007,23 +1069,31 @@ static int print_it (int special, char *str, FILE *out, int docstat) { if (docstat & D_EM) fputs ("", out); if (docstat & D_BF) fputs ("", out); - docstat &= ~(D_EM|D_BF); + if (docstat & D_TT) fputs ("", out); + docstat &= ~(D_EM|D_BF|D_TT); break; } case SP_START_BF: { fputs ("", out); docstat |= D_BF; - docstat &= ~D_EM; + docstat &= ~(D_EM|D_TT); break; } case SP_START_EM: { fputs ("", out); docstat |= D_EM; - docstat &= ~D_BF; + docstat &= ~(D_BF|D_TT); break; } + case SP_START_TT: + { + fputs ("", out); + docstat |= D_TT; + docstat &= ~(D_BF|D_EM); + break; + } case SP_NEWLINE: { if (onl) @@ -1062,6 +1132,11 @@ static int print_it (int special, char *str, FILE *out, int docstat) } case SP_START_TAB: { + if (docstat & D_PA) + { + fputs ("\n\n", out); + docstat &= ~D_PA; + } fputs ("\n\n", out); docstat |= D_TAB | D_NL; break; @@ -1075,6 +1150,11 @@ static int print_it (int special, char *str, FILE *out, int docstat) } case SP_START_DL: { + if (docstat & D_PA) + { + fputs ("\n\n", out); + docstat &= ~D_PA; + } fputs ("\n\n", out); docstat |= D_DL; break; @@ -1087,13 +1167,17 @@ static int print_it (int special, char *str, FILE *out, int docstat) case SP_DD: { docstat |= D_DD; - fputs ("\n", out); + if (docstat & D_DL) + fputs("\n", out); + fputs ("", out); break; } case SP_END_DD: { docstat &= ~D_DD; - fputs ("\n", out); + fputs ("", out); + if (docstat & D_DL) + fputs("\n", out); break; } case SP_END_DL: @@ -1102,6 +1186,23 @@ static int print_it (int special, char *str, FILE *out, int docstat) docstat &= ~(D_DD|D_DL); break; } + case SP_START_IL: + { + if (docstat & D_PA) + { + fputs ("\n\n", out); + docstat &= ~D_PA; + } + fputs ("\n\n", out); + docstat |= D_IL; + break; + } + case SP_END_IL: + { + fputs ("\n", out); + docstat &= ~(D_DD|D_DL); + break; + } case SP_END_SECT: { fputs ("", out); @@ -1110,9 +1211,28 @@ static int print_it (int special, char *str, FILE *out, int docstat) case SP_STR: { if (docstat & D_TAB) - fputs (str, out); + sgml_fputs (str, out, 0); else - sgml_fputs (str, out); + { + while (*str) + { + for (; *str; str++) + { + if (!strncmp (str, "``", 2)) + { + fputs ("", out); + str++; + } + else if (!strncmp (str, "''", 2)) + { + fputs ("", out); + str++; + } + else + sgml_fputc (*str, out, 1); + } + } + } break; } } @@ -1143,7 +1263,7 @@ void print_ref (FILE *out, int output_dollar, const char *ref) fputs ("\">", out); if (output_dollar) fputs ("$", out); - sgml_fputs (ref, out); + sgml_fputs (ref, out, 1); fputs ("", out); break; @@ -1183,6 +1303,10 @@ static int handle_docline (char *l, FILE *out, int docstat) return print_it (SP_START_DL, NULL, out, docstat); else if (!strncmp (l, ".de", 3)) return print_it (SP_END_DL, NULL, out, docstat); + else if (!strncmp (l, ".il", 3)) + return print_it (SP_START_IL, NULL, out, docstat); + else if (!strncmp (l, ".ie", 3)) + return print_it (SP_END_IL, NULL, out, docstat); else if (!strncmp (l, ". ", 2)) *l = ' '; @@ -1210,6 +1334,12 @@ static int handle_docline (char *l, FILE *out, int docstat) docstat = print_it (SP_START_BF, NULL, out, docstat); s += 2; } + else if (!strncmp (s, "\\fC", 3)) + { + docstat = commit_buff (buff, &d, out, docstat); + docstat = print_it (SP_START_TT, NULL, out, docstat); + s += 2; + } else if (!strncmp (s, "\\fP", 3)) { docstat = commit_buff (buff, &d, out, docstat); @@ -1229,6 +1359,11 @@ static int handle_docline (char *l, FILE *out, int docstat) } else if (!strncmp (s, ".dd", 3)) { + if ((docstat & D_IL) && (docstat & D_DD)) + { + docstat = commit_buff (buff, &d, out, docstat); + docstat = print_it (SP_END_DD, NULL, out, docstat); + } docstat = commit_buff (buff, &d, out, docstat); docstat = print_it (SP_DD, NULL, out, docstat); s += 3; @@ -1252,7 +1387,7 @@ static int handle_docline (char *l, FILE *out, int docstat) else { ref = s; - while (isalnum ((unsigned char) *s) || *s == '-' || *s == '_') + while (isalnum ((unsigned char) *s) || (*s && strchr("-_<>", *s))) ++s; docstat = commit_buff (buff, &d, out, docstat);