parameter without curly braces in subckt definition

This commit is contained in:
dwarning 2009-12-06 18:30:59 +00:00
parent 40de598586
commit 3de58ec504
1 changed files with 28 additions and 25 deletions

View File

@ -2994,7 +2994,7 @@ static void
inp_sort_params( struct line *start_card, struct line *end_card, struct line *card_bf_start, struct line *s_c, struct line *e_c ) inp_sort_params( struct line *start_card, struct line *end_card, struct line *card_bf_start, struct line *s_c, struct line *e_c )
{ {
char *param_name = NULL, *param_str = NULL, *param_ptr = NULL; char *param_name = NULL, *param_str = NULL, *param_ptr = NULL;
int i, j, num_params = 0, ind = 0, max_level = 0, num_terminals = 0; int i, j, num_params = 0, ind = 0, max_level = 0, num_terminals = 0, ioff = 1;
bool in_control = FALSE; bool in_control = FALSE;
bool found_in_list = FALSE; bool found_in_list = FALSE;
@ -3012,7 +3012,7 @@ inp_sort_params( struct line *start_card, struct line *end_card, struct line *ca
char ***depends_on; char ***depends_on;
struct line **ptr_array; struct line **ptr_array;
struct line **ptr_array_ordered; struct line **ptr_array_ordered;
if ( start_card == NULL ) return; if ( start_card == NULL ) return;
/* determine the number of lines with .param */ /* determine the number of lines with .param */
@ -3080,31 +3080,34 @@ inp_sort_params( struct line *start_card, struct line *end_card, struct line *ca
param_name = param_names[i]; param_name = param_names[i];
for ( j = 0; j < num_params; j++ ) for ( j = 0; j < num_params; j++ )
{ {
if ( j == i ) continue; if ( j == i ) continue;
param_str = param_strs[j]; param_str = param_strs[j];
while ( ( param_ptr = strstr( param_str, param_name ) ) ) while ( ( param_ptr = strstr( param_str, param_name ) ) )
{ {
if ( !isalnum( *(param_ptr-1) ) && *(param_ptr-1) != '_' && ioff = (strstr(param_ptr, "}") > 0 ? 1 : 0); /* want prevent wrong memory access below */
!isalnum( *(param_ptr+strlen(param_name)) ) && *(param_ptr+strlen(param_name)) != '_' ) /* looking for curly braces or other string limiter */
{ if ( ( !isalnum( *(param_ptr-ioff) ) && *(param_ptr-ioff) != '_' &&
ind = 0; !isalnum( *(param_ptr+strlen(param_name)) ) && *(param_ptr+strlen(param_name)) != '_' )
found_in_list = FALSE; || strcmp( param_ptr, param_name ) == 0) /* this are cases without curly braces */
while ( depends_on[j][ind] != NULL ) { {
if ( strcmp( param_name, depends_on[j][ind] ) == 0 ) { found_in_list = TRUE; break; } ind = 0;
ind++; found_in_list = FALSE;
} while ( depends_on[j][ind] != NULL ) {
if ( !found_in_list ) { if ( strcmp( param_name, depends_on[j][ind] ) == 0 ) { found_in_list = TRUE; break; }
depends_on[j][ind++] = param_name; ind++;
depends_on[j][ind] = NULL; }
} if ( !found_in_list ) {
break; depends_on[j][ind++] = param_name;
} depends_on[j][ind] = NULL;
param_str = param_ptr + strlen(param_name); }
} break;
} }
param_str = param_ptr + strlen(param_name);
}
}
} }
for ( i = 0; i < num_params; i++ ) for ( i = 0; i < num_params; i++ )