no lower casing for file input paths

This commit is contained in:
Holger Vogt 2024-04-06 19:13:22 +02:00
parent 2ade3bd581
commit 89d35fb34b
1 changed files with 77 additions and 44 deletions

View File

@ -206,7 +206,7 @@ static int inp_poly_2g6_compat(struct card* deck);
static void inp_poly_err(struct card *deck);
#endif
#ifdef CIDER
#if defined(CIDER) || defined(XSPICE)
static char *keep_case_of_cider_param(char *buffer)
{
int numq = 0, keep_case = 0;
@ -239,7 +239,8 @@ static char *keep_case_of_cider_param(char *buffer)
}
return s;
}
#endif
#ifdef CIDER
static int is_comment_or_blank(char *buffer)
{
/* Assume line buffers have initial whitespace removed */
@ -397,6 +398,31 @@ static int is_cider_model(char *buf)
}
}
#endif
#ifdef XSPICE
static int is_xspice_model(char* buf)
{
/* Expect filesource, table2d, table3d, d_state, d_source, d_process, d_cosim
to be on the same line as the .model.
Otherwise it will be missed if on a continuation line.
This should be rare.
*/
char* s;
if (!ciprefix(".model", buf)) {
return 0;
}
s = make_lower_case_copy(buf);
if (!s) return 0;
if (strstr(s, "filesource") || strstr(s, "table2d") || strstr(s, "table3d") ||
strstr(s, "d_state") || strstr(s, "d_source") || strstr(s, "d_process") || strstr(s, "d_cosim")) {
tfree(s);
return 1;
}
else {
tfree(s);
return 0;
}
}
#endif
/* Insert a new card, just behind the given card.
* The new card takes ownership of the memory pointed to by "line".
@ -1213,26 +1239,26 @@ struct card *inp_readall(FILE *fp, const char *dir_name,
}
struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
bool comfile, bool intfile)
/* fp: in, pointer to file to be read,
call_depth: in, nested call to fcn
dir_name: in, name of directory of file to be read
comfile: in, TRUE if command file (e.g. spinit, .spiceinit)
intfile: in, TRUE if deck is generated from internal circarray
*/
struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
bool comfile, bool intfile)
/* fp: in, pointer to file to be read,
call_depth: in, nested call to fcn
dir_name: in, name of directory of file to be read
comfile: in, TRUE if command file (e.g. spinit, .spiceinit)
intfile: in, TRUE if deck is generated from internal circarray
*/
{
struct inp_read_t rv;
struct card *end = NULL, *cc = NULL;
char *buffer = NULL;
struct card* end = NULL, * cc = NULL;
char* buffer = NULL;
/* segfault fix */
#ifdef XSPICE
char big_buff[5000];
int line_count = 0;
#endif
char *new_title = NULL;
char* new_title = NULL;
int line_number = 1;
/* sjb - renamed to avoid confusion with struct card */
/* sjb - renamed to avoid confusion with struct card */
int line_number_orig = 1;
int cirlinecount = 0; /* length of circarray */
static int is_control = 0; /* We are reading from a .control section */
@ -1259,8 +1285,8 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
/* gtri - modify - 12/12/90 - wbk - read from mailbox if ipc
* enabled */
/* If IPC is not enabled, do equivalent of what SPICE did before
*/
/* 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++;
@ -1280,7 +1306,7 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
char ipc_buffer[1025]; /* Had better be big enough */
int ipc_len;
Ipc_Status_t ipc_status =
ipc_get_line(ipc_buffer, &ipc_len, IPC_WAIT);
ipc_get_line(ipc_buffer, &ipc_len, IPC_WAIT);
if (ipc_status == IPC_STATUS_END_OF_DECK) {
buffer = NULL;
break;
@ -1302,7 +1328,7 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
buffer = readline(fp);
if (!buffer) {
break;
}
}
#endif
}
@ -1318,7 +1344,7 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
/* OK -- now we have loaded the next line into 'buffer'. Process it.
*/
/* If input line is blank, ignore it & continue looping. */
/* 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)) {
line_number_orig++;
@ -1339,7 +1365,7 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
/* now handle .title statement */
if (ciprefix(".title", buffer)) {
char *s;
char* s;
s = skip_non_ws(buffer); /* skip over .title */
s = skip_ws(s); /* advance past space chars */
@ -1362,7 +1388,7 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
* so .lib is interpreted as old style .lib <file name> (no lib
* name given, .lib replaced by .include).
*/
char *s = skip_non_ws(buffer); /* skip over .lib */
char* s = skip_non_ws(buffer); /* skip over .lib */
fprintf(cp_err, " File included as: .inc %s\n", s);
memcpy(buffer, ".inc", 4);
}
@ -1370,10 +1396,10 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
/* now handle .include statements */
if (ciprefix(".include", buffer) || ciprefix(".inc", buffer)) {
char *y = NULL;
char *s;
char* y = NULL;
char* s;
struct card *newcard;
struct card* newcard;
inp_stripcomments_line(buffer, FALSE);
@ -1388,13 +1414,13 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
}
{
char *y_resolved = inp_pathresolve_at(y, dir_name);
char *y_dir_name;
FILE *newfp;
char* y_resolved = inp_pathresolve_at(y, dir_name);
char* y_dir_name;
FILE* newfp;
if (!y_resolved) {
fprintf(cp_err, "Error: Could not find include file %s\n",
y);
y);
if (ft_stricterror)
controlled_exit(EXIT_FAILURE);
rv.line_number = line_number;
@ -1413,14 +1439,14 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
y_dir_name = ngdirname(y_resolved);
newcard = inp_read(
newfp, call_depth + 1, y_dir_name, FALSE, FALSE)
.cc; /* read stuff in include file into
netlist */
newfp, call_depth + 1, y_dir_name, FALSE, FALSE)
.cc; /* read stuff in include file into
netlist */
tfree(y_dir_name);
tfree(y_resolved);
(void) fclose(newfp);
(void)fclose(newfp);
}
/* Make the .include a comment */
@ -1429,7 +1455,7 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
/* append `buffer' to the (cc, end) chain of decks */
{
end = insert_new_line(
end, copy(buffer), line_number, line_number);
end, copy(buffer), line_number, line_number);
if (!cc)
cc = end;
@ -1447,17 +1473,17 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
end->nextcard = newcard;
/* Renumber the lines */
for (end = newcard; end && end->nextcard;
end = end->nextcard) {
end = end->nextcard) {
end->linenum = line_number++;
end->linenum_orig = line_number_inc++;
}
end->linenum = line_number++; /* SJB - renumber last line */
end->linenum_orig = line_number_inc++;
/* SJB - renumber the last line */
/* SJB - renumber the last line */
}
/* Fix the buffer up a bit. */
(void) memcpy(buffer + 1, "end of: ", 8);
(void)memcpy(buffer + 1, "end of: ", 8);
} /* end of .include handling */
/* loop through 'buffer' until end is reached. Make all letters lower
@ -1468,7 +1494,7 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
* double quotes. Single quotes are later on swallowed and disappear,
* double quotes are printed. */
{
char *s;
char* s;
#ifdef CIDER
if (ciprefix(".model", buffer)) {
in_cider_model = is_cider_model(buffer);
@ -1476,16 +1502,16 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
printf("Found .model Cider model is %s\n",
(in_cider_model ? "ON" : "OFF"));
#endif
}
}
if (in_cider_model && turn_off_case_retention(buffer)) {
in_cider_model = 0;
#ifdef TRACE
printf("Cider model is OFF\n");
#endif
}
}
#endif
if (ciprefix("plot", buffer) || ciprefix("gnuplot", buffer) ||
ciprefix("hardcopy", buffer)) {
ciprefix("hardcopy", buffer)) {
/* lower case excluded for tokens following title, xlabel,
* ylabel. tokens may contain spaces, then they have to be
* enclosed in quotes. keywords and tokens have to be
@ -1549,9 +1575,9 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
}
}
else if (ciprefix("print", buffer) ||
ciprefix("eprint", buffer) ||
ciprefix("eprvcd", buffer) ||
ciprefix("asciiplot", buffer)) {
ciprefix("eprint", buffer) ||
ciprefix("eprvcd", buffer) ||
ciprefix("asciiplot", buffer)) {
/* lower case excluded for tokens following output redirection
* '>' */
bool redir = FALSE;
@ -1565,12 +1591,19 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
}
#ifdef CIDER
else if (in_cider_model && !is_comment_or_blank(buffer) &&
(ciprefix(".model", buffer) || buffer[0] == '+')) {
(ciprefix(".model", buffer) || buffer[0] == '+')) {
s = keep_case_of_cider_param(buffer);
}
else if (line_contains_icfile(buffer)) {
s = keep_case_of_cider_param(buffer);
}
#endif
#ifdef XSPICE
/* lower case excluded for text in quotes for .model of code models
filesource, rable2d, table3d, d_state, d_source, d_process, d_cosim */
else if (is_xspice_model(buffer)) {
s = keep_case_of_cider_param(buffer);
}
#endif
/* no lower case letters for lines beginning with: */
else if (!ciprefix("write", buffer) &&