diff --git a/ChangeLog b/ChangeLog
index b97f45c54..076f64ccf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-12 Paolo Nenzi
+ * src/frontend/inp.c: corrected option processing. Now "scale" option
+ is special and is processed before netlist parsing. The implementation
+ is not very clean.
+
2007-11-04 Dietmar Warning
* configure.in, src/Makefile.am, src/spicelib/devices/Makefile.am,
src/spicelib/parser/inpgmod.c, src/spicelib/parser/inp2m.c
diff --git a/src/frontend/inp.c b/src/frontend/inp.c
index a864bf042..d052f9803 100644
--- a/src/frontend/inp.c
+++ b/src/frontend/inp.c
@@ -283,7 +283,7 @@ top2:
/*
* Free memory used by a line.
- * If recure is TRUE then recursivly free all lines linked via the li_next field.
+ * If recurse is TRUE then recursively free all lines linked via the li_next field.
* If recurse is FALSE free only this line.
* All lines linked via the li_actual field are always recursivly freed.
* SJB - 22nd May 2001
@@ -666,7 +666,11 @@ inp_dodeck(struct line *deck, char *tt, wordlist *end, bool reuse,
}
cp_getvar("noparse", VT_BOOL, (char *) &noparse);
- if (!noparse) {
+
+/* We check preliminary for the scale option. This special processing
+ is needed because we need the scale info BEFORE building the circuit
+ and seems there is no other way to do this. */
+ if (!noparse) {
for (; options; options = options->li_next) {
for (s = options->li_line; *s && !isspace(*s); s++)
;
@@ -688,25 +692,21 @@ inp_dodeck(struct line *deck, char *tt, wordlist *end, bool reuse,
static int one = 1;
switch (eev->va_type) {
case VT_BOOL:
- if_option(ct->ci_ckt, eev->va_name,
- eev->va_type, &one);
break;
case VT_NUM:
- if_option(ct->ci_ckt, eev->va_name,
- eev->va_type, (char *) &eev->va_num);
break;
case VT_REAL:
- if_option(ct->ci_ckt, eev->va_name,
- eev->va_type, (char *) &eev->va_real);
+ if ( strcmp("scale",eev->va_name)==0 ){
+ cp_vset("scale", VT_REAL, (char*) &eev->va_real );
+ printf("Scale set\n");
+ }
break;
case VT_STRING:
- if_option(ct->ci_ckt, eev->va_name,
- eev->va_type, eev->va_string);
break;
} /* switch . . . */
}
} /* if (!noparse) . . . */
-
+
/*----------------------------------------------------
* Now assuming that we wanna parse this deck, we call
* if_inpdeck which takes the deck and returns a
@@ -714,7 +714,7 @@ inp_dodeck(struct line *deck, char *tt, wordlist *end, bool reuse,
*---------------------------------------------------*/
if (!noparse)
ckt = if_inpdeck(deck, &tab);
- else
+ else
ckt = NULL;
out_init();
@@ -765,7 +765,7 @@ inp_dodeck(struct line *deck, char *tt, wordlist *end, bool reuse,
/* output deck */
out_printf( "\nProcessed Netlist\n" );
out_printf( "=================\n" );
- print_listing = 1;
+ int print_listing = 1;
for (dd = deck; dd; dd = dd->li_next) {
if ( ciprefix(".prot", dd->li_line) ) print_listing = 0;
if ( print_listing == 1 ) out_printf( "%s\n", dd->li_line );
@@ -804,6 +804,48 @@ inp_dodeck(struct line *deck, char *tt, wordlist *end, bool reuse,
else
ct->ci_filename = NULL;
+ if (!noparse) {
+ for (; options; options = options->li_next) {
+ for (s = options->li_line; *s && !isspace(*s); s++)
+ ;
+
+ ii = cp_interactive;
+ cp_interactive = FALSE;
+ wl = cp_lexer(s);
+ cp_interactive = ii;
+ if (!wl || !wl->wl_word || !*wl->wl_word)
+ continue;
+ if (eev)
+ eev->va_next = cp_setparse(wl);
+ else
+ ct->ci_vars = eev = cp_setparse(wl);
+ while (eev->va_next)
+ eev = eev->va_next;
+ }
+ for (eev = ct->ci_vars; eev; eev = eev->va_next) {
+ static int one = 1;
+ switch (eev->va_type) {
+ case VT_BOOL:
+ if_option(ct->ci_ckt, eev->va_name,
+ eev->va_type, &one);
+ break;
+ case VT_NUM:
+ if_option(ct->ci_ckt, eev->va_name,
+ eev->va_type, (char *) &eev->va_num);
+ break;
+ case VT_REAL:
+ if_option(ct->ci_ckt, eev->va_name,
+ eev->va_type, (char *) &eev->va_real);
+ break;
+ case VT_STRING:
+ if_option(ct->ci_ckt, eev->va_name,
+ eev->va_type, eev->va_string);
+ break;
+ } /* switch . . . */
+ }
+ } /* if (!noparse) . . . */
+
+
cp_addkword(CT_CKTNAMES, tt);
return;
}