From: pdmef Date: Mon, 28 Feb 2005 21:35:20 +0000 (+0000) Subject: Rocco Rutte: X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=commitdiff_plain;h=cb87a8ead138677ea48554f63651cc0e890214ce Rocco Rutte: documentation update: makedoc finally sorts is output; way more to come git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@120 e385b8ad-14ed-0310-8656-cc95a2468c6d --- diff --git a/init.h b/init.h index c494970..5e8cd10 100644 --- a/init.h +++ b/init.h @@ -101,6 +101,12 @@ struct option_t # ifndef USE_LIBESMTP # define USE_LIBESMTP # endif +# ifndef USE_NNTP +# define USE_NNTP +# endif +# ifndef USE_GNUTLS +# define USE_GNUTLS +# endif #endif struct option_t MuttVars[] = { @@ -2199,27 +2205,8 @@ struct option_t MuttVars[] = { ** .pp ** Example: set ssl_ca_certificates_file=/etc/ssl/certs/ca-certificates.crt */ -#ifdef USE_GNUTLS - { "ssl_min_dh_prime_bits", DT_NUM, R_NONE, UL &SslDHPrimeBits, 0 }, - /* - ** .pp - ** This variable specifies the minimum acceptable prime size (in bits) - ** for use in any Diffie-Hellman key exchange. A value of 0 will use - ** the default from the GNUTLS library. - */ - { "ssl_ca_certificates_file", DT_PATH, R_NONE, UL &SslCACertFile, 0 }, - /* - ** .pp - ** This variable specifies a file containing trusted CA certificates. - ** Any server certificate that is signed with one of these CA - ** certificates are also automatically accepted. - ** .pp - ** Example: set ssl_ca_certificates_file=/etc/ssl/certs/ca-certificates.crt - */ #endif #endif -#endif - { "pipe_split", DT_BOOL, R_NONE, OPTPIPESPLIT, 0 }, /* ** .pp diff --git a/makedoc.c b/makedoc.c index cbbc427..08fd73e 100644 --- a/makedoc.c +++ b/makedoc.c @@ -59,22 +59,34 @@ extern int optind; #define BUFFSIZE 2048 -static char lastvar[BUFFSIZE]; -static int sort_error = 0; +#define STRLEN(s) (s ? strlen(s) : 0) + +typedef struct { + short seen; + char* name; + char* descr; +} var_t; + +static int outcount = 0; +static var_t* outbuf = NULL; + +static int var_cmp (const void* a, const void* b) { + return (strcmp (((var_t*) a)->name, ((var_t*) b)->name)); +} enum output_formats_t { F_CONF, F_MAN, F_SGML, F_NONE }; -#define D_NL (1 << 0) -#define D_EM (1 << 1) -#define D_BF (1 << 2) -#define D_TAB (1 << 3) -#define D_NP (1 << 4) -#define D_INIT (1 << 5) -#define D_DL (1 << 6) -#define D_DT (1 << 7) +#define D_NL (1 << 0) +#define D_EM (1 << 1) +#define D_BF (1 << 2) +#define D_TAB (1 << 3) +#define D_NP (1 << 4) +#define D_INIT (1 << 5) +#define D_DL (1 << 6) +#define D_DT (1 << 7) enum { @@ -101,15 +113,18 @@ static char *get_token (char *, size_t, char *); static char *skip_ws (char *); static const char *type2human (int); static int buff2type (const char *); -static int flush_doc (int, FILE *); -static int handle_docline (char *, FILE *, int); -static int print_it (int, char *, FILE *, int); -static void print_confline (const char *, int, const char *, FILE *); -static void handle_confline (char *, FILE *); +static int flush_doc (int); +static int handle_docline (char *, int); +static int print_it (int, char *, int); +static void print_confline (const char *, int, const char *); +static void handle_confline (char *); 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); +static int sgml_fputs (const char *); +static void add_var (const char*); +static int add_s (const char*); +static int add_c (int); int main (int argc, char *argv[]) { @@ -131,8 +146,8 @@ int main (int argc, char *argv[]) case 'd': Debug++; break; default: { - fprintf (stderr, "%s: bad command line parameter.\n", Progname); - exit (1); + fprintf (stderr, "%s: bad command line parameter.\n", Progname); + exit (1); } } } @@ -142,7 +157,7 @@ int main (int argc, char *argv[]) if ((f = fopen (argv[optind], "r")) == NULL) { fprintf (stderr, "%s: Can't open %s (%s).\n", - Progname, argv[optind], strerror (errno)); + Progname, argv[optind], strerror (errno)); exit (1); } } @@ -153,13 +168,11 @@ int main (int argc, char *argv[]) { case F_CONF: case F_MAN: - case F_SGML: - lastvar[0] = '\0'; - makedoc (f, stdout); break; + case F_SGML: makedoc (f, stdout); break; default: { fprintf (stderr, "%s: No output format specified.\n", - Progname); + Progname); exit (1); } } @@ -170,12 +183,37 @@ int main (int argc, char *argv[]) exit (1); } -static void remember (const char* s) -{ - int l = strlen (s); - lastvar[0] = '\0'; - strncpy (lastvar, s, strlen (s)); - lastvar[l] = '\0'; +static void add_var (const char* name) { + outbuf = realloc (outbuf, (++outcount) * sizeof(var_t)); + outbuf[outcount-1].seen = 0; + outbuf[outcount-1].name = strdup (name); + outbuf[outcount-1].descr = NULL; +} + +static int add (const char* s) { + size_t lnew = STRLEN(s), lold = STRLEN(outbuf[outcount-1].descr); + + if (lnew == 0) + return (0); + if (!outbuf[outcount-1].seen) { + lold = 0; + outbuf[outcount-1].seen = 1; + } + + if (lold == 0) + outbuf[outcount-1].descr = strdup (s); + else { + outbuf[outcount-1].descr = realloc (outbuf[outcount-1].descr, lold + lnew + 1); + memcpy (&(outbuf[outcount-1].descr[lold-1])+1, s, lnew); + } + outbuf[outcount-1].descr[lold+lnew] = '\0'; + return (1); +} + +static int add_c (int c) { + char buf[2] = "\0\0"; + buf[0] = c; + return (add (buf)); } static void makedoc (FILE *in, FILE *out) @@ -193,7 +231,7 @@ static void makedoc (FILE *in, FILE *out) if ((p = strchr (buffer, '\n')) == NULL) { fprintf (stderr, "%s: Line %d too long. Ask a wizard to enlarge\n" - "%s: my buffer size.\n", Progname, line, Progname); + "%s: my buffer size.\n", Progname, line, Progname); exit (1); } else @@ -205,28 +243,35 @@ static void makedoc (FILE *in, FILE *out) if (Debug) { fprintf (stderr, "%s: line %d. first token: \"%s\".\n", - Progname, line, token); + Progname, line, token); } if (!strcmp (token, "/*++*/")) active = 1; else if (!strcmp (token, "/*--*/")) { - docstat = flush_doc (docstat, out); + docstat = flush_doc (docstat); active = 0; } else if (active && (!strcmp (token, "/**") || !strcmp (token, "**"))) - docstat = handle_docline (p, out, docstat); + docstat = handle_docline (p, docstat); else if (active && !strcmp (token, "{")) { - docstat = flush_doc (docstat, out); - handle_confline (p, out); + docstat = flush_doc (docstat); + handle_confline (p); } } - flush_doc (docstat, out); + flush_doc (docstat); fputs ("\n", out); - if (sort_error == 1) - fputs ("makedoc: warning: there're sorting errors in vars\n", stderr); + qsort (outbuf, outcount, sizeof (var_t), &var_cmp); + for (line = 0; line < outcount; line++) { + if (outbuf[line].descr) { + fprintf (out, "%s\n", outbuf[line].descr); + free (outbuf[line].descr); + } + free (outbuf[line].name); + } + free (outbuf); } /* skip whitespace */ @@ -251,13 +296,13 @@ static char *get_token (char *d, size_t l, char *s) if (Debug) fprintf (stderr, "%s: get_token called for `%s'.\n", - Progname, s); + Progname, s); s = skip_ws (s); if (Debug > 1) fprintf (stderr, "%s: argumet after skip_ws(): `%s'.\n", - Progname, s); + Progname, s); if (!*s) { @@ -271,7 +316,7 @@ static char *get_token (char *d, size_t l, char *s) if (Debug) { fprintf (stderr, "%s: found single character token `%c'.\n", - Progname, *s); + Progname, *s); } d[0] = *s++; d[1] = 0; @@ -298,10 +343,10 @@ static char *get_token (char *d, size_t l, char *s) { switch ((*d = *++t)) { - case 'n': *d = '\n'; break; - case 't': *d = '\t'; break; - case 'r': *d = '\r'; break; - case 'a': *d = '\a'; break; + case 'n': *d = '\n'; break; + case 't': *d = '\t'; break; + case 'r': *d = '\r'; break; + case 'a': *d = '\a'; break; } d++; @@ -326,9 +371,9 @@ static char *get_token (char *d, size_t l, char *s) if (Debug) { fprintf (stderr, "%s: Got %stoken: `%s'.\n", - Progname, is_quoted ? "quoted " : "", dd); + Progname, is_quoted ? "quoted " : "", dd); fprintf (stderr, "%s: Remainder: `%s'.\n", - Progname, t); + Progname, t); } return t; @@ -369,17 +414,17 @@ struct } types[] = { - { "DT_NONE", "-none-" }, - { "DT_BOOL", "boolean" }, - { "DT_NUM", "number" }, - { "DT_STR", "string" }, - { "DT_PATH", "path" }, - { "DT_QUAD", "quadoption" }, - { "DT_SORT", "sort order" }, - { "DT_RX", "regular expression" }, - { "DT_MAGIC", "folder magic" }, - { "DT_SYN", NULL }, - { "DT_ADDR", "e-mail address" }, + { "DT_NONE", "-none-" }, + { "DT_BOOL", "boolean" }, + { "DT_NUM", "number" }, + { "DT_STR", "string" }, + { "DT_PATH", "path" }, + { "DT_QUAD", "quadoption" }, + { "DT_SORT", "sort order" }, + { "DT_RX", "regular expression" }, + { "DT_MAGIC", "folder magic" }, + { "DT_SYN", NULL }, + { "DT_ADDR", "e-mail address" }, { NULL, NULL } }; @@ -390,7 +435,7 @@ static int buff2type (const char *s) for (type = DT_NONE; types[type].machine; type++) if (!strcmp (types[type].machine, s)) - return type; + return type; return DT_NONE; } @@ -399,7 +444,7 @@ static const char *type2human (int type) { return types[type].human; } -static void handle_confline (char *s, FILE *out) +static void handle_confline (char *s) { char varname[BUFFSIZE]; char buff[BUFFSIZE]; @@ -411,14 +456,7 @@ static void handle_confline (char *s, FILE *out) /* xxx - put this into an actual state machine? */ /* variable name */ - if (!(s = get_token (varname, sizeof (varname), s))) - return; - else - { - if (lastvar[0] && strncmp (lastvar, varname, strlen (lastvar)) > 0) - sort_error = 1; - remember (varname); - } + if (!(s = get_token (varname, sizeof (varname), s))) return; /* comma */ if (!(s = get_token (buff, sizeof (buff), s))) return; @@ -473,12 +511,13 @@ static void handle_confline (char *s, FILE *out) if (!strcmp (buff, "}")) break; - strncpy (tmp + strlen (tmp), buff, sizeof (tmp) - strlen (tmp)); + strncpy (tmp + STRLEN(tmp), buff, sizeof (tmp) - STRLEN(tmp)); } while ((s = get_token (buff, sizeof (buff), s))); pretty_default (val, sizeof (val), tmp, type); - print_confline (varname, type, val, out); + add_var (varname); + print_confline (varname, type, val); } static void pretty_default (char *t, size_t l, const char *s, int type) @@ -499,9 +538,9 @@ static void pretty_default (char *t, size_t l, const char *s, int type) case DT_BOOL: { if (atoi (s)) - strncpy (t, "yes", l); + strncpy (t, "yes", l); else - strncpy (t, "no", l); + strncpy (t, "no", l); break; } case DT_SORT: @@ -524,7 +563,7 @@ static void pretty_default (char *t, size_t l, const char *s, int type) case DT_PATH: { if (!strcmp (s, "0")) - break; + break; /* fallthrough */ } default: @@ -539,57 +578,57 @@ static void char_to_escape (char *dest, unsigned int c) { switch (c) { - case '\r': strcpy (dest, "\\r"); break; /* __STRCPY_CHECKED__ */ - case '\n': strcpy (dest, "\\n"); break; /* __STRCPY_CHECKED__ */ - case '\t': strcpy (dest, "\\t"); break; /* __STRCPY_CHECKED__ */ - case '\f': strcpy (dest, "\\f"); break; /* __STRCPY_CHECKED__ */ + case '\r': strcpy (dest, "\\r"); break; /* __STRCPY_CHECKED__ */ + case '\n': strcpy (dest, "\\n"); break; /* __STRCPY_CHECKED__ */ + case '\t': strcpy (dest, "\\t"); break; /* __STRCPY_CHECKED__ */ + case '\f': strcpy (dest, "\\f"); break; /* __STRCPY_CHECKED__ */ default: sprintf (dest, "\\%03o", c); break; } } -static void conf_char_to_escape (unsigned int c , FILE *out) +static void conf_char_to_escape (unsigned int c) { char buff[16]; char_to_escape (buff, c); - fputs (buff, out); + add (buff); } -static void conf_print_strval (const char *v, FILE *out) +static void conf_print_strval (const char *v) { for (; *v; v++) { if (*v < ' ' || *v & 0x80) { - conf_char_to_escape ((unsigned int) *v, out); + conf_char_to_escape ((unsigned int) *v); continue; } if (*v == '"' || *v == '\\') - fputc ('\\', out); - fputc (*v, out); + add_c ('\\'); + add_c (*v); } } -static void man_print_strval (const char *v, FILE *out) +static void man_print_strval (const char *v) { for (; *v; v++) { if (*v < ' ' || *v & 0x80) { - fputc ('\\', out); - conf_char_to_escape ((unsigned int) *v, out); + add_c ('\\'); + conf_char_to_escape ((unsigned int) *v); continue; } if (*v == '"') - fputs ("\\(rq", out); + add ("\\(rq"); else if (*v == '\\') - fputs ("\\\\", out); + add ("\\\\"); else - fputc (*v, out); + add_c (*v); } } -static void sgml_print_strval (const char *v, FILE *out) +static void sgml_print_strval (const char *v) { char buff[16]; for (; *v; v++) @@ -597,42 +636,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); continue; } - sgml_fputc ((unsigned int) *v, out); + sgml_fputc ((unsigned int) *v); } } -static int sgml_fputc (int c, FILE *out) +static int sgml_fputc (int c) { switch (c) { - 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 ("&dquot;", out); - case '[': return fputs ("[", out); - case ']': return fputs ("]", out); - case '~': return fputs ("˜", out); - default: return fputc (c, out); + case '<': return add ("<"); + case '>': return add (">"); + case '$': return add ("$"); + case '_': return add ("_"); + case '%': return add ("%"); + case '&': return add ("&"); + case '\\': return add ("\"); + case '"': return add ("&dquot;"); + case '[': return add ("["); + case ']': return add ("]"); + case '~': return add ("˜"); + default: return add_c (c); } } -static int sgml_fputs (const char *s, FILE *out) +static int sgml_fputs (const char *s) { for (; *s; s++) - if (sgml_fputc ((unsigned int) *s, out) == EOF) + if (sgml_fputc ((unsigned int) *s) == EOF) return EOF; return 0; } -static void print_confline (const char *varname, int type, const char *val, FILE *out) +static void print_confline (const char *varname, int type, const char *val) { if (type == DT_SYN) return; @@ -643,44 +682,61 @@ static void print_confline (const char *varname, int type, const char *val, FILE { if (type == DT_STR || type == DT_RX || type == DT_ADDR || type == DT_PATH) { - fprintf (out, "\n# set %s=\"", varname); - conf_print_strval (val, out); - fputs ("\"", out); + add ("\n# set "); + add (varname); + add ("\""); + conf_print_strval (val); + add ("\""); } else if (type != DT_SYN) - fprintf (out, "\n# set %s=%s", varname, val); + { + add ("\n# set "); + add (varname); + add ("="); + add (val); + } - fprintf (out, "\n#\n# Name: %s", varname); - fprintf (out, "\n# Type: %s", type2human (type)); + add ("\n#\n# Name: "); + add (varname); + add ("\n# Type: "); + add (type2human (type)); if (type == DT_STR || type == DT_RX || type == DT_ADDR || type == DT_PATH) { - fputs ("\n# Default: \"", out); - conf_print_strval (val, out); - fputs ("\"", out); + add ("\n# Default: \""); + conf_print_strval (val); + add ("\""); } else - fprintf (out, "\n# Default: %s", val); + { + add ("\n# Default: "); + add (val); + } - fputs ("\n# ", out); + add ("\n# "); break; } /* manual page */ case F_MAN: { - fprintf (out, "\n.TP\n.B %s\n", varname); - fputs (".nf\n", out); - fprintf (out, "Type: %s\n", type2human (type)); + add ("\n.TP\n.B %s\n"); + add (varname); + add (".nf\n"); + add ("Type: %s\n"); + add (type2human (type)); if (type == DT_STR || type == DT_RX || type == DT_ADDR || type == DT_PATH) { - fputs ("Default: \\(lq", out); - man_print_strval (val, out); - fputs ("\\(rq\n", out); + add ("Default: \\(lq"); + man_print_strval (val); + add ("\\(rq\n"); + } + else { + add ("Default: "); + add (val); + add_c ('\n'); } - else - fprintf (out, "Default: %s\n", val); - fputs (".fi", out); + add (".fi"); break; } @@ -688,18 +744,27 @@ static void print_confline (const char *varname, int type, const char *val, FILE /* SGML based manual */ case F_SGML: { - fputs ("\n", out); sgml_fputs (varname, out); - fprintf (out, "