rewrite inp_list() avoid duplicate code

This commit is contained in:
rlar 2012-08-19 14:04:37 +02:00
parent c9e2a21a9c
commit 789edee376
3 changed files with 71 additions and 83 deletions

View File

@ -52,6 +52,30 @@ void SetAnalyse(char *Analyse, int Percent);
#endif
/*
* create an unique artificial *unusable* FILE ptr
* meant to be used with Xprintf() only to eventually
* redirect output to the `out_vprintf()' family
*/
static FILE *cp_more;
static FILE *cp_more = (FILE*) &cp_more;
static void
Xprintf(FILE *fdst, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
if (fdst == cp_more)
out_vprintf(fmt, ap);
else
vfprintf(fdst, fmt, ap);
va_end(ap);
}
/* Do a listing. Use is listing [expanded] [logical] [physical] [deck] */
void
com_listing(wordlist *wl)
@ -142,8 +166,10 @@ inp_list(FILE *file, struct line *deck, struct line *extras, int type)
#endif
/* gtri - end - 03/07/91 */
if (useout)
if (useout) {
out_init();
file = cp_more;
}
renumber = cp_getvar("renumber", CP_BOOL, NULL);
@ -155,19 +181,9 @@ inp_list(FILE *file, struct line *deck, struct line *extras, int type)
if (ciprefix(".end", here->li_line) && !isalpha(here->li_line[4]))
continue;
if (*here->li_line != '*') {
if (useout) {
out_printf("%6d : %s\n",
here->li_linenum, upper(here->li_line));
} else {
fprintf(file, "%6d : %s\n",
here->li_linenum, upper(here->li_line));
}
if (here->li_error) {
if (useout)
out_printf("%s\n", here->li_error);
else
fprintf(file, "%s\n", here->li_error);
}
Xprintf(file, "%6d : %s\n", here->li_linenum, upper(here->li_line));
if (here->li_error)
Xprintf(file, "%s\n", here->li_error);
}
i++;
}
@ -178,11 +194,7 @@ inp_list(FILE *file, struct line *deck, struct line *extras, int type)
goto top1;
}
if (useout) {
out_printf("%6d : .end\n", i);
} else {
fprintf(file, "%6d : .end\n", i);
}
Xprintf(file, "%6d : .end\n", i);
} else if ((type == LS_PHYSICAL) || (type == LS_DECK)) {
@ -193,51 +205,25 @@ inp_list(FILE *file, struct line *deck, struct line *extras, int type)
here->li_linenum = i;
if (ciprefix(".end", here->li_line) && !isalpha(here->li_line[4]))
continue;
if (type == LS_PHYSICAL) {
if (useout) {
out_printf("%6d : %s\n",
here->li_linenum, upper(here->li_line));
} else {
fprintf(file, "%6d : %s\n",
here->li_linenum, upper(here->li_line));
}
} else {
if (useout)
out_printf("%s\n", upper(here->li_line));
else
fprintf(file, "%s\n", upper(here->li_line));
}
if (here->li_error && (type == LS_PHYSICAL)) {
if (useout)
out_printf("%s\n", here->li_error);
else
fprintf(file, "%s\n", here->li_error);
}
if (type == LS_PHYSICAL)
Xprintf(file, "%6d : %s\n",
here->li_linenum, upper(here->li_line));
else
Xprintf(file, "%s\n", upper(here->li_line));
if (here->li_error && (type == LS_PHYSICAL))
Xprintf(file, "%s\n", here->li_error);
} else {
for (there = here->li_actual; there; there = there->li_next) {
there->li_linenum = i++;
if (ciprefix(".end", here->li_line) && isalpha(here->li_line[4]))
continue;
if (type == LS_PHYSICAL) {
if (useout) {
out_printf("%6d : %s\n",
there->li_linenum, upper(there->li_line));
} else {
fprintf(file, "%6d : %s\n",
there->li_linenum, upper(there->li_line));
}
} else {
if (useout)
out_printf("%s\n", upper(there->li_line));
else
fprintf(file, "%s\n", upper(there->li_line));
}
if (there->li_error && (type == LS_PHYSICAL)) {
if (useout)
out_printf("%s\n", there->li_error);
else
fprintf(file, "%s\n", there->li_error);
}
if (type == LS_PHYSICAL)
Xprintf(file, "%6d : %s\n",
there->li_linenum, upper(there->li_line));
else
Xprintf(file, "%s\n", upper(there->li_line));
if (there->li_error && (type == LS_PHYSICAL))
Xprintf(file, "%s\n", there->li_error);
}
here->li_linenum = i;
}
@ -248,18 +234,10 @@ inp_list(FILE *file, struct line *deck, struct line *extras, int type)
extras = NULL;
goto top2;
}
if (type == LS_PHYSICAL) {
if (useout) {
out_printf("%6d : .end\n", i);
} else {
fprintf(file, "%6d : .end\n", i);
}
} else {
if (useout)
out_printf(".end\n");
else
fprintf(file, ".end\n");
}
if (type == LS_PHYSICAL)
Xprintf(file, "%6d : .end\n", i);
else
Xprintf(file, ".end\n");
} else {
fprintf(cp_err, "inp_list: Internal Error: bad type %d\n", type);
}

View File

@ -250,34 +250,35 @@ out_send(char *string)
/* Printf some stuff using more mode. */
void
out_printf(char *fmt, ...)
out_vprintf(const char *fmt, va_list ap)
{
#if defined(HAVE_ASPRINTF) /* seems the best solution */
char * tbuf;
va_list ap;
va_start (ap, fmt);
vasprintf(&tbuf, fmt, ap);
va_end (ap);
out_send(tbuf);
FREE(tbuf);
#elif defined(HAVE_SNPRINTF) /* the second best */
static char out_pbuf[8*BSIZE_SP];
va_list ap;
va_start (ap, fmt);
vsnprintf(out_pbuf, sizeof(out_pbuf), fmt, ap);
va_end (ap);
out_send(out_pbuf);
#else /* guaranteed a bug for long messages */
static char out_pbuf[8*BSIZE_SP];
va_list ap;
va_start (ap, fmt);
vsprintf(out_pbuf, fmt, ap);
va_end (ap);
out_send(out_pbuf);
#endif
return;
}
void
out_printf(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
out_vprintf(fmt, ap);
va_end(ap);
}
#ifdef HAVE_TERMCAP
static int
outfn(int c)
@ -379,12 +380,18 @@ out_send(char *string)
fprintf(cp_out, "%s", string);
}
void
out_vprintf(const char *fmt, va_list ap)
{
vfprintf(cp_out, fmt, ap);
}
void
out_printf(char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
vfprintf(cp_out, fmt, ap);
out_vprintf(fmt, ap);
va_end (ap);
}

View File

@ -14,6 +14,8 @@ Modified: 2000 AlansFixes
#include "ngspice/wordlist.h"
#include "ngspice/bool.h"
#include <stdarg.h>
struct ccom;
/* com_alias.c */
@ -126,6 +128,7 @@ extern void out_printf(char *fmt, ...) __attribute__ ((format (__printf__, 1, 2)
extern void out_printf(char *fmt, ...);
#endif
extern void out_vprintf(const char *fmt, va_list ap);
extern void out_send(char *string);
/* quote.c */