diff --git a/ChangeLog b/ChangeLog index 385521eb7..9916f3aec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-03-21 Holger Vogt + * inpcom.c, fteinp.h, inpdefs.h: line renumbering of input deck added + to the end of fcn inp_readall(). cc->li_line_original now contains + the line numbering of the input file + 2009-03-15 Holger Vogt * cktfinddev.c: some (optical) cleanup * numparam.h, xpressn.c, spicenum.c, inpcom.c: dynamic memory diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 4aedf993b..3c54440ca 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -984,87 +984,87 @@ inp_fix_ternary_operator( struct line *start_card ) void inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name) { - struct line *end = NULL, *cc = NULL, *prev = NULL, *working, *newcard, *start_lib, *global_card, *tmp_ptr = NULL, *tmp_ptr2 = NULL; - char *buffer = NULL, *s, *t, *y, *z, c; - /* segfault fix */ + struct line *end = NULL, *cc = NULL, *prev = NULL, *working, *newcard, *start_lib, *global_card, *tmp_ptr = NULL, *tmp_ptr2 = NULL; + char *buffer = NULL, *s, *t, *y, *z, c; + /* segfault fix */ #ifdef XSPICE - char big_buff[5000]; - int line_count = 0; - Ipc_Status_t ipc_status; - char ipc_buffer[1025]; /* Had better be big enough */ - int ipc_len; + char big_buff[5000]; + int line_count = 0; + Ipc_Status_t ipc_status; + char ipc_buffer[1025]; /* Had better be big enough */ + int ipc_len; #endif - char *copys=NULL, big_buff2[5000]; - char *global_copy = NULL, keep_char; - int line_number = 1; /* sjb - renamed to avoid confusion with struct line */ - FILE *newfp; + char *copys=NULL, big_buff2[5000]; + char *global_copy = NULL, keep_char; + int line_number = 1; /* sjb - renamed to avoid confusion with struct line */ + int line_number_orig = 0; + FILE *newfp; #if defined(TRACE) || defined(OUTDECK) - FILE *fdo; + FILE *fdo; #endif - struct line *tmp_ptr1 = NULL; + struct line *tmp_ptr1 = NULL; - int i, j; - bool found_library, found_lib_name, found_end = FALSE, shell_eol_continuation = FALSE; - bool dir_name_flag = FALSE; + int i, j; + bool found_library, found_lib_name, found_end = FALSE, shell_eol_continuation = FALSE; + bool dir_name_flag = FALSE; - struct variable *v; - char *s_ptr, *s_lower; + struct variable *v; + char *s_ptr, *s_lower; - /* Must set this to NULL or non-tilde includes segfault. -- Tim Molteno */ - /* copys = NULL; */ /* This caused a parse error with gcc 2.96. Why??? */ + /* Must set this to NULL or non-tilde includes segfault. -- Tim Molteno */ + /* copys = NULL; */ /* This caused a parse error with gcc 2.96. Why??? */ - if ( call_depth == 0 ) { + if ( call_depth == 0 ) { num_subckt_w_params = 0; num_libraries = 0; num_functions = 0; global = NULL; found_end = FALSE; - } + } /* gtri - modify - 12/12/90 - wbk - read from mailbox if ipc enabled */ #ifdef XSPICE - /* First read in all lines & put them in the struct cc */ - while (1) { - - /* If IPC is not enabled, do equivalent of what SPICE did before */ - if(! g_ipc.enabled) { - if ( call_depth == 0 && line_count == 0 ) { - line_count++; - if ( fgets( big_buff, 5000, fp ) ) { - buffer = tmalloc( strlen(big_buff) + 1 ); - strcpy(buffer, big_buff); - } - } - else { + /* First read in all lines & put them in the struct cc */ + while (1) { + /* If IPC is not enabled, do equivalent of what SPICE did before */ + if(! g_ipc.enabled) { + if ( call_depth == 0 && line_count == 0 ) { + line_count++; + if ( fgets( big_buff, 5000, fp ) ) { + buffer = tmalloc( strlen(big_buff) + 1 ); + strcpy(buffer, big_buff); + } + } + else { buffer = readline(fp); - if(! buffer) { - break; - } - } - } - else { - /* else, get the line from the ipc channel. */ - /* We assume that newlines are not sent by the client */ - /* so we add them here */ - ipc_status = ipc_get_line(ipc_buffer, &ipc_len, IPC_WAIT); - if(ipc_status == IPC_STATUS_END_OF_DECK) { - buffer = NULL; - break; + if(! buffer) { + break; } - else if(ipc_status == IPC_STATUS_OK) { - buffer = (void *) tmalloc(strlen(ipc_buffer) + 3); - strcpy(buffer, ipc_buffer); - strcat(buffer, "\n"); - } - else { /* No good way to report this so just die */ - exit(1); - } - } + } + } + else { + /* else, get the line from the ipc channel. */ + /* We assume that newlines are not sent by the client */ + /* so we add them here */ + ipc_status = ipc_get_line(ipc_buffer, &ipc_len, IPC_WAIT); + if(ipc_status == IPC_STATUS_END_OF_DECK) { + buffer = NULL; + break; + } + else if(ipc_status == IPC_STATUS_OK) { + buffer = (void *) tmalloc(strlen(ipc_buffer) + 3); + strcpy(buffer, ipc_buffer); + strcat(buffer, "\n"); + } + else { /* No good way to report this so just die */ + exit(1); + } + } /* gtri - end - 12/12/90 */ #else - while ((buffer = readline(fp))) { + while ((buffer = readline(fp))) { #endif #ifdef TRACE @@ -1073,251 +1073,255 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name) #endif if ( !buffer ) { - continue; + continue; + } + /* OK -- now we have loaded the next line into 'buffer'. Process it. */ + /* If input line is blank, ignore it & continue looping. */ + if ( (strcmp(buffer,"\n") == 0) || (strcmp(buffer,"\r\n") == 0) ) { + if ( call_depth != 0 || (call_depth == 0 && cc != NULL) ) { + continue; + } } - /* OK -- now we have loaded the next line into 'buffer'. Process it. */ - /* If input line is blank, ignore it & continue looping. */ - if ( (strcmp(buffer,"\n") == 0) || (strcmp(buffer,"\r\n") == 0) ) { - if ( call_depth != 0 || (call_depth == 0 && cc != NULL) ) { - continue; - } - } - if (*buffer == '@') { - tfree(buffer); /* was allocated by readline() */ - break; - } + if (*buffer == '@') { + tfree(buffer); /* was allocated by readline() */ + break; + } - /* now handle .lib statements */ - if (ciprefix(".lib", buffer)) { - for ( s = buffer; *s && !isspace(*s); s++ ); /* skip over .lib */ - while ( isspace(*s) || isquote(*s) ) s++; /* advance past space chars */ - if ( !*s ) { /* if at end of line, error */ - fprintf(cp_err, "Error: .lib filename missing\n"); - tfree(buffer); /* was allocated by readline() */ - continue; - } /* Now s points to first char after .lib */ - for ( t = s; *t && !isspace(*t) && !isquote(*t); t++ ); /* skip to end of word */ - y = t; - while ( isspace(*y) || isquote(*y) ) y++; /* advance past space chars */ - // check if rest of line commented out - if ( *y && *y != '$' ) { /* .lib */ - for ( z = y; *z && !isspace(*z) && !isquote(*z); z++ ); - c = *t; - *t = '\0'; - *z = '\0'; + /* now handle .lib statements */ + if (ciprefix(".lib", buffer)) { + for ( s = buffer; *s && !isspace(*s); s++ ); /* skip over .lib */ + while ( isspace(*s) || isquote(*s) ) s++; /* advance past space chars */ + if ( !*s ) { /* if at end of line, error */ + fprintf(cp_err, "Error: .lib filename missing\n"); + tfree(buffer); /* was allocated by readline() */ + continue; + } /* Now s points to first char after .lib */ + for ( t = s; *t && !isspace(*t) && !isquote(*t); t++ ); /* skip to end of word */ + y = t; + while ( isspace(*y) || isquote(*y) ) y++; /* advance past space chars */ + // check if rest of line commented out + if ( *y && *y != '$' ) { /* .lib */ + for ( z = y; *z && !isspace(*z) && !isquote(*z); z++ ); + c = *t; + *t = '\0'; + *z = '\0'; - if ( *s == '~' ) { - copys = cp_tildexpand(s); /* allocates memory, but can also return NULL */ - if( copys != NULL ) { - s = copys; /* reuse s, but remember, buffer still points to allocated memory */ - } - } - - /* lower case the file name for later string compares */ - s_ptr = strdup(s); - s_lower = strdup(s); - for(s_ptr = s_lower; *s_ptr && (*s_ptr != '\n'); s_ptr++) *s_ptr = tolower(*s_ptr); - - found_library = FALSE; - for ( i = 0; i < num_libraries; i++ ) { - if ( strcmp( library_file[i], s_lower ) == 0 ) { - found_library = TRUE; - break; - } - } - if ( found_library ) { - if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */ - } else { - if ( dir_name != NULL ) sprintf( big_buff2, "%s/%s", dir_name, s ); - else sprintf( big_buff2, "./%s", s ); - dir_name_flag = FALSE; - if ( !( newfp = inp_pathopen( s, "r" ) ) ) { - dir_name_flag = TRUE; - if ( !( newfp = inp_pathopen( big_buff2, "r" ) ) ) { - perror(s); - if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */ - tfree(buffer); /* allocated by readline() above */ - continue; - } - } - if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */ - - library_file[num_libraries++] = strdup(s_lower); - - if ( dir_name_flag == FALSE ) { - char *s_dup = strdup(s); - inp_readall(newfp, &libraries[num_libraries-1], call_depth+1, dirname(s_dup)); - tfree(s_dup); - } - else - inp_readall(newfp, &libraries[num_libraries-1], call_depth+1, dir_name); - - fclose(newfp); - } - *t = c; - tfree(s_lower); - - /* Make the .lib a comment */ - *buffer = '*'; - } - } /* end of .lib handling */ - - /* now handle .include statements */ - if (ciprefix(".include", buffer) || ciprefix(".inc", buffer)) { - for (s = buffer; *s && !isspace(*s); s++) /* advance past non-space chars */ - ; - while (isspace(*s) || isquote(*s)) /* now advance past space chars */ - s++; - if (!*s) { /* if at end of line, error */ - fprintf(cp_err, "Error: .include filename missing\n"); - tfree(buffer); /* was allocated by readline() */ - continue; - } /* Now s points to first char after .include */ - for (t = s; *t && !isspace(*t) && !isquote(*t); t++) /* now advance past non-space chars */ - ; - *t = '\0'; /* place \0 and end of file name in buffer */ - - if (*s == '~') { - copys = cp_tildexpand(s); /* allocates memory, but can also return NULL */ - if(copys != NULL) { - s = copys; /* reuse s, but remember, buffer still points to allocated memory */ - } - } - - /* open file specified by .include statement */ - if ( dir_name != NULL ) sprintf( big_buff2, "%s/%s", dir_name, s ); - else sprintf( big_buff2, "./%s", s ); - dir_name_flag = FALSE; - if (!(newfp = inp_pathopen(s, "r"))) { - dir_name_flag = TRUE; - if ( !( newfp = inp_pathopen( big_buff2, "r" ) ) ) { - perror(s); - if(copys) { - tfree(copys); /* allocated by the cp_tildexpand() above */ - } - tfree(buffer); /* allocated by readline() above */ - continue; - } + if ( *s == '~' ) { + copys = cp_tildexpand(s); /* allocates memory, but can also return NULL */ + if( copys != NULL ) { + s = copys; /* reuse s, but remember, buffer still points to allocated memory */ + } } - - if(copys) { - tfree(copys); /* allocated by the cp_tildexpand() above */ - } + + /* lower case the file name for later string compares */ + s_ptr = strdup(s); + s_lower = strdup(s); + for(s_ptr = s_lower; *s_ptr && (*s_ptr != '\n'); s_ptr++) *s_ptr = tolower(*s_ptr); - if ( dir_name_flag == FALSE ) { - char *s_dup = strdup(s); - inp_readall(newfp, &newcard, call_depth+1, dirname(s_dup)); /* read stuff in include file into netlist */ - tfree(s_dup); - } - else - inp_readall(newfp, &newcard, call_depth+1, dir_name); /* read stuff in include file into netlist */ - - (void) fclose(newfp); - - /* Make the .include a comment */ - *buffer = '*'; - - /* now check if this is the first pass (i.e. end points to null) */ - if (end) { /* end already exists */ - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* make end point to next card */ + found_library = FALSE; + for ( i = 0; i < num_libraries; i++ ) { + if ( strcmp( library_file[i], s_lower ) == 0 ) { + found_library = TRUE; + break; + } + } + if ( found_library ) { + if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */ } else { - end = cc = alloc(struct line); /* create the deck & end. cc will + if ( dir_name != NULL ) sprintf( big_buff2, "%s/%s", dir_name, s ); + else sprintf( big_buff2, "./%s", s ); + dir_name_flag = FALSE; + if ( !( newfp = inp_pathopen( s, "r" ) ) ) { + dir_name_flag = TRUE; + if ( !( newfp = inp_pathopen( big_buff2, "r" ) ) ) { + perror(s); + if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */ + tfree(buffer); /* allocated by readline() above */ + continue; + } + } + if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */ + + library_file[num_libraries++] = strdup(s_lower); + + if ( dir_name_flag == FALSE ) { + char *s_dup = strdup(s); + inp_readall(newfp, &libraries[num_libraries-1], call_depth+1, dirname(s_dup)); + tfree(s_dup); + } + else + inp_readall(newfp, &libraries[num_libraries-1], call_depth+1, dir_name); + + fclose(newfp); + } + *t = c; + tfree(s_lower); + + /* Make the .lib a comment */ + *buffer = '*'; + } + } /* end of .lib handling */ + + /* now handle .include statements */ + if (ciprefix(".include", buffer) || ciprefix(".inc", buffer)) { + for (s = buffer; *s && !isspace(*s); s++) /* advance past non-space chars */ + ; + while (isspace(*s) || isquote(*s)) /* now advance past space chars */ + s++; + if (!*s) { /* if at end of line, error */ + fprintf(cp_err, "Error: .include filename missing\n"); + tfree(buffer); /* was allocated by readline() */ + continue; + } /* Now s points to first char after .include */ + for (t = s; *t && !isspace(*t) && !isquote(*t); t++) /* now advance past non-space chars */ + ; + *t = '\0'; /* place \0 and end of file name in buffer */ + + if (*s == '~') { + copys = cp_tildexpand(s); /* allocates memory, but can also return NULL */ + if(copys != NULL) { + s = copys; /* reuse s, but remember, buffer still points to allocated memory */ + } + } + + /* open file specified by .include statement */ + if ( dir_name != NULL ) sprintf( big_buff2, "%s/%s", dir_name, s ); + else sprintf( big_buff2, "./%s", s ); + dir_name_flag = FALSE; + if (!(newfp = inp_pathopen(s, "r"))) { + dir_name_flag = TRUE; + if ( !( newfp = inp_pathopen( big_buff2, "r" ) ) ) { + perror(s); + if(copys) { + tfree(copys); /* allocated by the cp_tildexpand() above */ + } + tfree(buffer); /* allocated by readline() above */ + continue; + } + } + + if(copys) { + tfree(copys); /* allocated by the cp_tildexpand() above */ + } + + if ( dir_name_flag == FALSE ) { + char *s_dup = strdup(s); + inp_readall(newfp, &newcard, call_depth+1, dirname(s_dup)); /* read stuff in include file into netlist */ + tfree(s_dup); + } + else + inp_readall(newfp, &newcard, call_depth+1, dir_name); /* read stuff in include file into netlist */ + + (void) fclose(newfp); + + /* Make the .include a comment */ + *buffer = '*'; + + /* now check if this is the first pass (i.e. end points to null) */ + if (end) { /* end already exists */ + end->li_next = alloc(struct line); /* create next card */ + end = end->li_next; /* make end point to next card */ + } else { + end = cc = alloc(struct line); /* create the deck & end. cc will point to beginning of deck, end to the end */ - } + } - /* now fill out rest of struct end. */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = copy(buffer); - end->li_linenum = line_number++; - if (newcard) { - end->li_next = newcard; + /* now fill out rest of struct end. */ + end->li_next = NULL; + end->li_error = NULL; + end->li_actual = NULL; + end->li_line = copy(buffer); + end->li_linenum = end->li_linenum_orig = line_number++; + if (newcard) { + end->li_next = newcard; /* Renumber the lines */ - for (end = newcard; end && end->li_next; end = end->li_next) - end->li_linenum = line_number++; - end->li_linenum = line_number++; /* SJB - renumber the last line */ - } + line_number_orig = 1; + for (end = newcard; end && end->li_next; end = end->li_next) { + end->li_linenum = line_number_orig++; + end->li_linenum_orig = line_number++; + } + end->li_linenum = line_number++; /* SJB - renumber the last line */ + end->li_linenum_orig = line_number_orig++; /* SJB - renumber the last line */ + } - /* Fix the buffer up a bit. */ - (void) strncpy(buffer + 1, "end of:", 7); - } /* end of .include handling */ + /* Fix the buffer up a bit. */ + (void) strncpy(buffer + 1, "end of:", 7); + } /* end of .include handling */ - /* loop through 'buffer' until end is reached. Then test for + /* loop through 'buffer' until end is reached. Then test for premature end. If premature end is reached, spew error and zap the line. */ - if ( !ciprefix( "write", buffer ) ) { // exclude 'write' command so filename case preserved - for (s = buffer; *s && (*s != '\n') && (*s != '\0'); s++) *s = tolower(*s); - if (!*s) { - //fprintf(cp_err, "Warning: premature EOF\n"); - } - *s = '\0'; /* Zap the newline. */ + if ( !ciprefix( "write", buffer ) ) { // exclude 'write' command so filename case preserved + for (s = buffer; *s && (*s != '\n') && (*s != '\0'); s++) *s = tolower(*s); + if (!*s) { + //fprintf(cp_err, "Warning: premature EOF\n"); + } + *s = '\0'; /* Zap the newline. */ - if((s-1) >= buffer && *(s-1) == '\r') /* Zop the carriage return under windows */ - *(s-1) = '\0'; - } + if((s-1) >= buffer && *(s-1) == '\r') /* Zop the carriage return under windows */ + *(s-1) = '\0'; + } - if (ciprefix(".end", buffer) && strlen(buffer) == 4 ) { - found_end = TRUE; - *buffer = '*'; - } + if (ciprefix(".end", buffer) && strlen(buffer) == 4 ) { + found_end = TRUE; + *buffer = '*'; + } - if ( ciprefix( ".global", buffer ) ) { - for ( s = buffer; *s && !isspace(*s); s++ ); + if ( ciprefix( ".global", buffer ) ) { + for ( s = buffer; *s && !isspace(*s); s++ ); - if ( global == NULL ) { - global = strdup(buffer); - } else { - global_copy = tmalloc( strlen(global) + strlen(s) + 1 ); - sprintf( global_copy, "%s%s", global, s ); - tfree(global); - global = global_copy; - } - *buffer = '*'; - } + if ( global == NULL ) { + global = strdup(buffer); + } else { + global_copy = tmalloc( strlen(global) + strlen(s) + 1 ); + sprintf( global_copy, "%s%s", global, s ); + tfree(global); + global = global_copy; + } + *buffer = '*'; + } - if ( shell_eol_continuation ) { - char *new_buffer = tmalloc( strlen(buffer) + 2); - sprintf( new_buffer, "+%s", buffer ); + if ( shell_eol_continuation ) { + char *new_buffer = tmalloc( strlen(buffer) + 2); + sprintf( new_buffer, "+%s", buffer ); - tfree(buffer); - buffer = new_buffer; - } + tfree(buffer); + buffer = new_buffer; + } - shell_eol_continuation = chk_for_line_continuation( buffer ); + shell_eol_continuation = chk_for_line_continuation( buffer ); - /* now check if this is the first pass (i.e. end points to null) */ - if (end) { /* end already exists */ - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* point to next card */ - } else { /* End doesn't exist. Create it. */ - end = cc = alloc(struct line); /* note that cc points to beginning + /* now check if this is the first pass (i.e. end points to null) */ + if (end) { /* end already exists */ + end->li_next = alloc(struct line); /* create next card */ + end = end->li_next; /* point to next card */ + } else { /* End doesn't exist. Create it. */ + end = cc = alloc(struct line); /* note that cc points to beginning of deck, end to the end */ - } + } - /* now put buffer into li */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = buffer; - end->li_linenum = line_number++; - } /* end while ((buffer = readline(fp))) */ + /* now put buffer into li */ + end->li_next = NULL; + end->li_error = NULL; + end->li_actual = NULL; + end->li_line = buffer; + end->li_linenum = end->li_linenum_orig = line_number++; + } /* end while ((buffer = readline(fp))) */ - if (!end) { /* No stuff here */ - *data = NULL; - return; - } + if (!end) { /* No stuff here */ + *data = NULL; + return; + } - /* This should be freed because we are done with it. */ - /* tfree(buffer); */ + /* This should be freed because we are done with it. */ + /* tfree(buffer); */ - if ( call_depth == 0 && found_end == TRUE) { + if ( call_depth == 0 && found_end == TRUE) { if ( global == NULL ) { - global = tmalloc( strlen(".global gnd") + 1 ); - sprintf( global, ".global gnd" ); + global = tmalloc( strlen(".global gnd") + 1 ); + sprintf( global, ".global gnd" ); } global_card = alloc(struct line); global_card->li_error = NULL; @@ -1331,170 +1335,174 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name) inp_init_lib_data(); inp_determine_libraries(cc, NULL); - } + } - /* + /* add libraries - */ - found_lib_name = FALSE; - if ( call_depth == 0 ) { + */ + found_lib_name = FALSE; + if ( call_depth == 0 ) { for( i = 0; i < num_libraries; i++ ) { - working = libraries[i]; - while ( working ) { - buffer = working->li_line; + working = libraries[i]; + while ( working ) { + buffer = working->li_line; - if ( found_lib_name && ciprefix(".endl", buffer) ) { - /* Make the .endl a comment */ - *buffer = '*'; - found_lib_name = FALSE; + if ( found_lib_name && ciprefix(".endl", buffer) ) { + /* Make the .endl a comment */ + *buffer = '*'; + found_lib_name = FALSE; + + /* set pointer and continue to avoid deleting below */ + tmp_ptr2 = working->li_next; + working->li_next = tmp_ptr; + working = tmp_ptr2; - /* set pointer and continue to avoid deleting below */ - tmp_ptr2 = working->li_next; - working->li_next = tmp_ptr; - working = tmp_ptr2; + /* end = working; + * working = working->li_next; + * end->li_next = NULL; */ - /* end = working; - * working = working->li_next; - * end->li_next = NULL; */ + continue; + } /* for ... */ - continue; - } + if ( ciprefix(".lib", buffer) ) { + if ( found_lib_name == TRUE ) { + fprintf( stderr, "ERROR: .lib is missing .endl!\n" ); + exit(-1); + } - if ( ciprefix(".lib", buffer) ) { - if ( found_lib_name == TRUE ) { - fprintf( stderr, "ERROR: .lib is missing .endl!\n" ); - exit(-1); - } + for ( s = buffer; *s && !isspace(*s); s++ ); /* skip over .lib */ + while ( isspace(*s) || isquote(*s) ) s++; /* advance past space chars */ + for ( t = s; *t && !isspace(*t) && !isquote(*t); t++ ); /* skip to end of word */ + keep_char = *t; + *t = '\0'; + /* see if library we want to copy */ + found_lib_name = FALSE; + for( j = 0; j < num_lib_names[i]; j++ ) { + if ( strcmp( library_name[i][j], s ) == 0 ) { + found_lib_name = TRUE; + start_lib = working; - for ( s = buffer; *s && !isspace(*s); s++ ); /* skip over .lib */ - while ( isspace(*s) || isquote(*s) ) s++; /* advance past space chars */ - for ( t = s; *t && !isspace(*t) && !isquote(*t); t++ ); /* skip to end of word */ - keep_char = *t; - *t = '\0'; - /* see if library we want to copy */ - found_lib_name = FALSE; - for( j = 0; j < num_lib_names[i]; j++ ) { - if ( strcmp( library_name[i][j], s ) == 0 ) { - found_lib_name = TRUE; - start_lib = working; + /* make the .lib a comment */ + *buffer = '*'; - /* make the .lib a comment */ - *buffer = '*'; + tmp_ptr = library_ll_ptr[i][j]->li_next; + library_ll_ptr[i][j]->li_next = working; - tmp_ptr = library_ll_ptr[i][j]->li_next; - library_ll_ptr[i][j]->li_next = working; + /* renumber lines */ + line_number_orig = 1; + for ( start_lib = working; !ciprefix(".endl", start_lib->li_line); start_lib = start_lib->li_next ) { + start_lib->li_linenum = line_number++; + start_lib->li_linenum_orig = line_number_orig++; + } + start_lib->li_linenum = line_number++; // renumber endl line + start_lib->li_linenum_orig = line_number_orig++; + break; + } + } + *t = keep_char; + } + prev = working; + working = working->li_next; - /* renumber lines */ - for ( start_lib = working; !ciprefix(".endl", start_lib->li_line); start_lib = start_lib->li_next ) - start_lib->li_linenum = line_number++; - start_lib->li_linenum = line_number++; // renumber endl line - break; - } - } - *t = keep_char; - } - prev = working; - working = working->li_next; + if ( found_lib_name == FALSE ) { + tfree(prev->li_line); + tfree(prev); + } + } /* end while */ + } /* end for */ - if ( found_lib_name == FALSE ) { - tfree(prev->li_line); - tfree(prev); - } - } /* end while */ - } if ( found_end == TRUE ) { - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* point to next card */ + end->li_next = alloc(struct line); /* create next card */ + end = end->li_next; /* point to next card */ + + buffer = tmalloc( strlen( ".end" ) + 1 ); + sprintf( buffer, ".end" ); - buffer = tmalloc( strlen( ".end" ) + 1 ); - sprintf( buffer, ".end" ); - - /* now put buffer into li */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = buffer; - end->li_linenum = line_number++; + /* now put buffer into li */ + end->li_next = NULL; + end->li_error = NULL; + end->li_actual = NULL; + end->li_line = buffer; + end->li_linenum = end->li_linenum_orig = line_number++; } - } + } - /* Now clean up li: remove comments & stitch together continuation lines. */ - working = cc->li_next; /* cc points to head of deck. Start with the + /* Now clean up li: remove comments & stitch together continuation lines. */ + working = cc->li_next; /* cc points to head of deck. Start with the next card. */ - /* sjb - strip or convert end-of-line comments. + /* sjb - strip or convert end-of-line comments. This must be cone before stitching continuation lines. If the line only contains an end-of-line comment then it is converted into a normal comment with a '*' at the start. This will then get stripped in the following code. */ - inp_stripcomments_deck(working); + inp_stripcomments_deck(working); - while (working) { - for (s = working->li_line; (c = *s) && c <= ' '; s++) - ; + while (working) { + for (s = working->li_line; (c = *s) && c <= ' '; s++) + ; #ifdef TRACE /* SDB debug statement */ printf("In inp_readall, processing linked list element line = %d, s = %s . . . \n", working->li_linenum,s); #endif - switch (c) { - case '#': - case '$': - case '*': - case '\0': - /* this used to be commented out. Why? */ - /* prev = NULL; */ - working = working->li_next; /* for these chars, go to next card */ - break; + switch (c) { + case '#': + case '$': + case '*': + case '\0': + /* this used to be commented out. Why? */ + /* prev = NULL; */ + working = working->li_next; /* for these chars, go to next card */ + break; - case '+': /* handle continuation */ - if (!prev) { - working->li_error = copy( - "Illegal continuation line: ignored."); - working = working->li_next; - break; - } + case '+': /* handle continuation */ + if (!prev) { + working->li_error = copy( + "Illegal continuation line: ignored."); + working = working->li_next; + break; + } - /* create buffer and write last and current line into it. */ - buffer = tmalloc(strlen(prev->li_line) + strlen(s) + 2); - (void) sprintf(buffer, "%s %s", prev->li_line, s + 1); + /* create buffer and write last and current line into it. */ + buffer = tmalloc(strlen(prev->li_line) + strlen(s) + 2); + (void) sprintf(buffer, "%s %s", prev->li_line, s + 1); - s = prev->li_line; - prev->li_line = buffer; - prev->li_next = working->li_next; - working->li_next = NULL; - if (prev->li_actual) { - for (end = prev->li_actual; - end->li_next; end = end->li_next) - ; - end->li_next = working; - tfree(s); - } else { - newcard = alloc(struct line); - newcard->li_linenum = prev->li_linenum; - newcard->li_line = s; - newcard->li_next = working; - newcard->li_error = NULL; - newcard->li_actual = NULL; - prev->li_actual = newcard; - } - working = prev->li_next; - break; + s = prev->li_line; + prev->li_line = buffer; + prev->li_next = working->li_next; + working->li_next = NULL; + if (prev->li_actual) { + for (end = prev->li_actual; end->li_next; end = end->li_next) + ; + end->li_next = working; + tfree(s); + } else { + newcard = alloc(struct line); + newcard->li_linenum = prev->li_linenum; + newcard->li_line = s; + newcard->li_next = working; + newcard->li_error = NULL; + newcard->li_actual = NULL; + prev->li_actual = newcard; + } + working = prev->li_next; + break; - default: /* regular one-line card */ - prev = working; - working = working->li_next; - break; - } - } + default: /* regular one-line card */ + prev = working; + working = working->li_next; + break; + } + } - working = cc->li_next; + working = cc->li_next; - inp_fix_for_numparam(working); - inp_remove_excess_ws(working); + inp_fix_for_numparam(working); + inp_remove_excess_ws(working); - if ( call_depth == 0 ) { + if ( call_depth == 0 ) { comment_out_unused_subckt_models(working); line_number = inp_split_multi_param_lines(working, line_number); @@ -1510,37 +1518,40 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name) // get end card as last card in list; end card pntr does not appear to always // be correct at this point for(newcard = working; newcard != NULL; newcard = newcard->li_next) - end = newcard; + end = newcard; inp_reorder_params(working, cc, end); inp_fix_inst_calls_for_numparam(working); inp_fix_gnd_name(working); inp_chk_for_multi_in_vcvs(working, &line_number); - if (cp_getvar("addcontrol", VT_BOOL, (char *) &v)) - inp_add_control_section(working, &line_number); - } - *data = cc; - - /* get max. line length and number of lines in input deck*/ - dynmaxline = 0; - dynLlen = 0; - for(tmp_ptr1 = cc; tmp_ptr1 != NULL; tmp_ptr1 = tmp_ptr1->li_next) { - dynmaxline++; - if (dynLlen < strlen(tmp_ptr1->li_line)) - dynLlen = strlen(tmp_ptr1->li_line); - } + if (cp_getvar("addcontrol", VT_BOOL, (char *) &v)) + inp_add_control_section(working, &line_number); + } + *data = cc; + + /* get max. line length and number of lines in input deck, + * and renumber the lines */ + dynmaxline = 0; + dynLlen = 0; + for(tmp_ptr1 = cc; tmp_ptr1 != NULL; tmp_ptr1 = tmp_ptr1->li_next) { + dynmaxline++; + /* renumber the lines of the processed input deck */ + tmp_ptr1->li_linenum = dynmaxline; + if (dynLlen < strlen(tmp_ptr1->li_line)) + dynLlen = strlen(tmp_ptr1->li_line); + } #if defined(TRACE) || defined(OUTDECK) - /*debug: print into file*/ - fdo = fopen("debug-out.txt", "w"); - for(tmp_ptr1 = cc; tmp_ptr1 != NULL; tmp_ptr1 = tmp_ptr1->li_next) - fprintf(fdo, "%s\n", tmp_ptr1->li_line); - ; - (void) fclose(fdo); - fprintf(stdout, "lLen %d, maxline %d\n", dynLlen, dynmaxline); + /*debug: print into file*/ + fdo = fopen("debug-out.txt", "w"); + for(tmp_ptr1 = cc; tmp_ptr1 != NULL; tmp_ptr1 = tmp_ptr1->li_next) + fprintf(fdo, "%d %d %s\n", tmp_ptr1->li_linenum_orig, tmp_ptr1->li_linenum, tmp_ptr1->li_line); + + (void) fclose(fdo); + fprintf(stdout, "lLen %d, maxline %d\n", dynLlen, dynmaxline); #endif - return; + return; } /*-------------------------------------------------------------------------* diff --git a/src/include/fteinp.h b/src/include/fteinp.h index 22eabc40c..2cf90d693 100644 --- a/src/include/fteinp.h +++ b/src/include/fteinp.h @@ -16,6 +16,7 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group /* This struct defines a linked list of lines from a SPICE file. */ struct line { int li_linenum; + int li_linenum_orig; char *li_line; char *li_error; struct line *li_next; diff --git a/src/include/inpdefs.h b/src/include/inpdefs.h index ccaf2c6c2..72282d1b7 100644 --- a/src/include/inpdefs.h +++ b/src/include/inpdefs.h @@ -58,6 +58,7 @@ typedef struct sINPtables{ typedef struct card{ int linenum; + int linenum_orig; char *line; char *error; struct card *nextcard;