updated print_spice_subckt() to reflect updates done in print_spice_element(); abs_sym_path recognize ././././, ./., other strange paths., use $env(PWD) for current_dirname on startup instead of getcwd() if possible, to avoid dereferencing symlinks
This commit is contained in:
parent
f8f1626c1b
commit
8ea275013e
|
|
@ -69,7 +69,7 @@ void print_image()
|
||||||
} else {
|
} else {
|
||||||
if(w != xschem_w || h != xschem_h) changed_size = 1;
|
if(w != xschem_w || h != xschem_h) changed_size = 1;
|
||||||
}
|
}
|
||||||
my_strdup(60, &tmpstring, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)");
|
my_strdup(60, &tmpstring, "tk_getSaveFile -title {Select destination file} -initialdir [pwd]");
|
||||||
tcleval(tmpstring);
|
tcleval(tmpstring);
|
||||||
r = tclresult();
|
r = tclresult();
|
||||||
my_free(717, &tmpstring);
|
my_free(717, &tmpstring);
|
||||||
|
|
|
||||||
|
|
@ -431,7 +431,7 @@ void ps_draw(void)
|
||||||
const char *r;
|
const char *r;
|
||||||
|
|
||||||
if(!plotfile[0]) {
|
if(!plotfile[0]) {
|
||||||
my_strdup(59, &tmp, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)");
|
my_strdup(59, &tmp, "tk_getSaveFile -title {Select destination file} -initialdir [pwd]");
|
||||||
tcleval(tmp);
|
tcleval(tmp);
|
||||||
my_free(878, &tmp);
|
my_free(878, &tmp);
|
||||||
r = tclresult();
|
r = tclresult();
|
||||||
|
|
|
||||||
|
|
@ -947,9 +947,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
printf("maxr[%d]=%d\n", i, xctx.maxr[i]);
|
printf("maxr[%d]=%d\n", i, xctx.maxr[i]);
|
||||||
printf("maxl[%d]=%d\n", i, xctx.maxl[i]);
|
printf("maxl[%d]=%d\n", i, xctx.maxl[i]);
|
||||||
}
|
}
|
||||||
for(i=0;i<cadlayers;i++) {
|
printf("current_name=%s\n", xctx.current_name);
|
||||||
printf("enable_layer[%d]=%d\n", i, enable_layer[i]);
|
|
||||||
}
|
|
||||||
printf("currsch=%d\n", xctx.currsch);
|
printf("currsch=%d\n", xctx.currsch);
|
||||||
for(i=0;i<=xctx.currsch;i++)
|
for(i=0;i<=xctx.currsch;i++)
|
||||||
{
|
{
|
||||||
|
|
@ -2001,13 +1999,13 @@ const char *tclgetvar(const char *s)
|
||||||
return Tcl_GetVar(interp,s, TCL_GLOBAL_ONLY);
|
return Tcl_GetVar(interp,s, TCL_GLOBAL_ONLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tcleval(const char str[])
|
const char *tcleval(const char str[])
|
||||||
{
|
{
|
||||||
dbg(2, "tcleval(): %s\n", str);
|
dbg(2, "tcleval(): %s\n", str);
|
||||||
/* if( Tcl_EvalEx(interp, str, -1, TCL_EVAL_GLOBAL) != TCL_OK) {*/
|
|
||||||
if( Tcl_GlobalEval(interp, str) != TCL_OK) {
|
if( Tcl_GlobalEval(interp, str) != TCL_OK) {
|
||||||
fprintf(errfp, "tcleval(): evaluation of script: %s failed\n", str);
|
fprintf(errfp, "tcleval(): evaluation of script: %s failed\n", str);
|
||||||
}
|
}
|
||||||
|
return Tcl_GetStringResult(interp);
|
||||||
}
|
}
|
||||||
const char *tclresult(void)
|
const char *tclresult(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -457,7 +457,7 @@ void svg_draw(void)
|
||||||
|
|
||||||
|
|
||||||
if(!plotfile[0]) {
|
if(!plotfile[0]) {
|
||||||
my_strdup(61, &tmpstring, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)");
|
my_strdup(61, &tmpstring, "tk_getSaveFile -title {Select destination file} -initialdir [pwd]");
|
||||||
tcleval(tmpstring);
|
tcleval(tmpstring);
|
||||||
r = tclresult();
|
r = tclresult();
|
||||||
my_free(963, &tmpstring);
|
my_free(963, &tmpstring);
|
||||||
|
|
|
||||||
37
src/token.c
37
src/token.c
|
|
@ -1374,9 +1374,8 @@ void print_spice_subckt(FILE *fd, int symbol)
|
||||||
int sizetok=0;
|
int sizetok=0;
|
||||||
int token_pos=0, escape=0;
|
int token_pos=0, escape=0;
|
||||||
int no_of_pins=0;
|
int no_of_pins=0;
|
||||||
int quote=0;
|
|
||||||
|
|
||||||
my_strdup(103, &format, get_tok_value(xctx.sym[symbol].prop_ptr,"format",0));
|
my_strdup(103, &format, get_tok_value(xctx.sym[symbol].prop_ptr,"format",2));
|
||||||
if( (format==NULL) ) {
|
if( (format==NULL) ) {
|
||||||
my_free(1012, &format);
|
my_free(1012, &format);
|
||||||
return; /* no format */
|
return; /* no format */
|
||||||
|
|
@ -1388,22 +1387,29 @@ void print_spice_subckt(FILE *fd, int symbol)
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
c=*s++;
|
c=*s++;
|
||||||
if(c=='"' && escape) {
|
if(c=='\\') {
|
||||||
quote=!quote;
|
escape=1;
|
||||||
|
c=*s++;
|
||||||
}
|
}
|
||||||
if(c=='"' && !escape ) c=*s++;
|
else escape=0;
|
||||||
if(c=='\n' && escape ) c=*s++; /* 20171030 eat escaped newlines */
|
if(c=='\n' && escape ) c=*s++; /* 20171030 eat escaped newlines */
|
||||||
/* 20150317 use SPACE2() instead of SPACE() */
|
space=SPACE(c);
|
||||||
space=SPACE2(c);
|
if( state==XBEGIN && (c=='@' || c=='$') && !escape) state=XTOKEN;
|
||||||
if( state==XBEGIN && c=='@' && !escape) state=XTOKEN;
|
else if(state==XTOKEN && token_pos > 1 &&
|
||||||
else if( state==XTOKEN && (space || c == '@' || c == '\\') && token_pos > 1 && !escape && !quote) state=XSEPARATOR;
|
(
|
||||||
|
( (space || c == '$' || c == '@') && !escape ) ||
|
||||||
|
( (!space && c != '$' && c != '@') && escape )
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
state = XSEPARATOR;
|
||||||
|
}
|
||||||
if(token_pos>=sizetok)
|
if(token_pos>=sizetok)
|
||||||
{
|
{
|
||||||
sizetok+=CADCHUNKALLOC;
|
sizetok+=CADCHUNKALLOC;
|
||||||
my_realloc(104, &token,sizetok);
|
my_realloc(104, &token,sizetok);
|
||||||
}
|
}
|
||||||
if(state==XTOKEN) {
|
if(state==XTOKEN) {
|
||||||
if(c!='\\' || escape) token[token_pos++]=c; /* 20171029 remove escaping backslashes */
|
token[token_pos++]=c;
|
||||||
}
|
}
|
||||||
else if(state==XSEPARATOR) /* got a token */
|
else if(state==XSEPARATOR) /* got a token */
|
||||||
{
|
{
|
||||||
|
|
@ -1445,28 +1451,23 @@ void print_spice_subckt(FILE *fd, int symbol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(c != '@' && c!='\0' && (c!='\\' || escape) ) fputc(c,fd);
|
if(c!='$' && c!='@' && c!='\0' ) fputc(c,fd);
|
||||||
if(c == '@') s--;
|
if(c == '@' || c =='$') s--;
|
||||||
state=XBEGIN;
|
state=XBEGIN;
|
||||||
}
|
}
|
||||||
/* 20151028 dont print escaping backslashes */
|
/* 20151028 dont print escaping backslashes */
|
||||||
else if(state==XBEGIN && c!='\0' && (c!='\\' || escape)) {
|
else if(state==XBEGIN && c!='\0') {
|
||||||
/* do nothing */
|
/* do nothing */
|
||||||
}
|
}
|
||||||
if(c=='\0')
|
if(c=='\0')
|
||||||
{
|
{
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
escape = (c=='\\' && !escape);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
my_free(1013, &format);
|
my_free(1013, &format);
|
||||||
my_free(1014, &token);
|
my_free(1014, &token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void print_spice_element(FILE *fd, int inst)
|
void print_spice_element(FILE *fd, int inst)
|
||||||
{
|
{
|
||||||
int i=0, mult, tmp;
|
int i=0, mult, tmp;
|
||||||
|
|
|
||||||
15
src/xinit.c
15
src/xinit.c
|
|
@ -1199,8 +1199,15 @@ int Tcl_AppInit(Tcl_Interp *inter)
|
||||||
my_strncpy(xctx.file_version, XSCHEM_FILE_VERSION, S(xctx.file_version));
|
my_strncpy(xctx.file_version, XSCHEM_FILE_VERSION, S(xctx.file_version));
|
||||||
compile_font();
|
compile_font();
|
||||||
/* restore current dir after loading font */
|
/* restore current dir after loading font */
|
||||||
|
if(tcleval("info exists env(PWD)")[0] == '1') {
|
||||||
|
tcleval("set current_dirname $env(PWD)"); /* $env(PWD) better than pwd_dir as it does not dereference symlinks */
|
||||||
|
} else {
|
||||||
|
Tcl_VarEval(interp, "set current_dirname ", pwd_dir, NULL);
|
||||||
|
}
|
||||||
|
/*
|
||||||
my_snprintf(tmp, S(tmp), "set current_dirname \"%s\"", pwd_dir);
|
my_snprintf(tmp, S(tmp), "set current_dirname \"%s\"", pwd_dir);
|
||||||
tcleval(tmp);
|
tcleval(tmp);
|
||||||
|
*/
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
/* X INITIALIZATION */
|
/* X INITIALIZATION */
|
||||||
|
|
@ -1429,10 +1436,14 @@ int Tcl_AppInit(Tcl_Interp *inter)
|
||||||
if(filename) {
|
if(filename) {
|
||||||
char f[PATH_MAX];
|
char f[PATH_MAX];
|
||||||
if(filename[0] !='/') {
|
if(filename[0] !='/') {
|
||||||
/* can not use pwd_dir since it dereferences symlinks
|
/* prefer not use pwd_dir since it dereferences symlinks
|
||||||
|
|
|
|
||||||
\|/ */
|
\|/ */
|
||||||
my_snprintf(f, S(f), "%s/%s", tclgetvar("env(PWD)"), filename);
|
if(tcleval("info exists env(PWD)")[0] == '1') {
|
||||||
|
my_snprintf(f, S(f), "%s/%s", tclgetvar("env(PWD)"), filename);
|
||||||
|
} else {
|
||||||
|
my_snprintf(f, S(f), "%s/%s", pwd_dir, filename);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
my_snprintf(f, S(f), "%s", filename);
|
my_snprintf(f, S(f), "%s", filename);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -899,7 +899,7 @@ extern void rebuild_selected_array(void);
|
||||||
extern void edit_property(int x);
|
extern void edit_property(int x);
|
||||||
extern int xschem(ClientData clientdata, Tcl_Interp *interp,
|
extern int xschem(ClientData clientdata, Tcl_Interp *interp,
|
||||||
int argc, const char * argv[]);
|
int argc, const char * argv[]);
|
||||||
extern void tcleval(const char str[]);
|
extern const char *tcleval(const char str[]);
|
||||||
extern const char *tclresult(void);
|
extern const char *tclresult(void);
|
||||||
extern const char *tclgetvar(const char *s);
|
extern const char *tclgetvar(const char *s);
|
||||||
extern void tclsetvar(const char *s, const char *value);
|
extern void tclsetvar(const char *s, const char *value);
|
||||||
|
|
|
||||||
|
|
@ -1527,7 +1527,7 @@ proc select_netlist_dir { force {dir {} }} {
|
||||||
if {$::OS == "Windows"} {
|
if {$::OS == "Windows"} {
|
||||||
set initdir $env(windir)
|
set initdir $env(windir)
|
||||||
} else {
|
} else {
|
||||||
set initdir $env(PWD)
|
set initdir [pwd]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# 20140409 do not change netlist_dir if user Cancels action
|
# 20140409 do not change netlist_dir if user Cancels action
|
||||||
|
|
@ -2586,7 +2586,7 @@ proc viewdata {data {ro {}}} {
|
||||||
if {$::OS == "Windows"} {
|
if {$::OS == "Windows"} {
|
||||||
set fff [tk_getSaveFile -initialdir $env(windir) ]
|
set fff [tk_getSaveFile -initialdir $env(windir) ]
|
||||||
} else {
|
} else {
|
||||||
set fff [tk_getSaveFile -initialdir $env(PWD) ]
|
set fff [tk_getSaveFile -initialdir [pwd] ]
|
||||||
}
|
}
|
||||||
if { $fff != "" } {
|
if { $fff != "" } {
|
||||||
set fileid [open $fff "w"]
|
set fileid [open $fff "w"]
|
||||||
|
|
@ -2637,17 +2637,26 @@ proc rel_sym_path {symbol} {
|
||||||
proc abs_sym_path {fname {ext {} } } {
|
proc abs_sym_path {fname {ext {} } } {
|
||||||
global pathlist current_dirname
|
global pathlist current_dirname
|
||||||
|
|
||||||
|
# empty: do nothing
|
||||||
if {$fname eq {} } return {}
|
if {$fname eq {} } return {}
|
||||||
|
|
||||||
if {$::OS == "Windows"} {
|
if {$::OS == "Windows"} {
|
||||||
|
# absolute path: return as is
|
||||||
if { [regexp {^[A-Za-z]\:/$} $fname ] } {
|
if { [regexp {^[A-Za-z]\:/$} $fname ] } {
|
||||||
return $fname;
|
return $fname;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
# absolute path: return as is
|
||||||
if { $fname eq "/"} {
|
if { $fname eq "/"} {
|
||||||
return $fname;
|
return $fname;
|
||||||
}
|
}
|
||||||
# if fname is just "." return $current_dirname
|
|
||||||
if {$fname eq "."} {
|
# remove any leading './'
|
||||||
|
while { [regsub {^\./} $fname {} fname] } {}
|
||||||
|
if { $fname eq {} } { set fname . }
|
||||||
|
|
||||||
|
# if fname is just "." or "./" return $current_dirname
|
||||||
|
if {[regexp {^\./*$} $fname] } {
|
||||||
return $current_dirname
|
return $current_dirname
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2655,20 +2664,26 @@ proc abs_sym_path {fname {ext {} } } {
|
||||||
if { $ext ne {} } {
|
if { $ext ne {} } {
|
||||||
set fname [file rootname $fname]$ext
|
set fname [file rootname $fname]$ext
|
||||||
}
|
}
|
||||||
# transform ./file_or_path to file_or_path, resolve ../file_or_path
|
# prepend current_dirname to ../file_or_path --> $current_dirname/file_or_path
|
||||||
if { [regexp {^\.\./} $fname ] } {
|
if { [regexp {^\.\./} $fname ] } {
|
||||||
if { [regexp {^/} $current_dirname] } {
|
if { [regexp {^/} $current_dirname] } {
|
||||||
set fname "[file dirname $current_dirname][regsub {^\.\.} $fname {}]"
|
set fname "${current_dirname}[regsub {^\.\.} $fname {}]"
|
||||||
}
|
}
|
||||||
|
# transform ./file_or_path to file_or_path
|
||||||
} elseif {[regexp {^\./} $fname ] } {
|
} elseif {[regexp {^\./} $fname ] } {
|
||||||
regsub {^\./} $fname {} fname
|
regsub {^\./} $fname {} fname
|
||||||
}
|
}
|
||||||
|
|
||||||
set name {}
|
set name {}
|
||||||
|
|
||||||
if { ![regexp {^/} $fname] && ![regexp {^[A-Za-z]:} $fname] } {
|
if { ![regexp {^/} $fname] && ![regexp {^[A-Za-z]:} $fname] } {
|
||||||
|
# if fname is present in one of the pathlist paths get the absolute path
|
||||||
foreach path_elem $pathlist {
|
foreach path_elem $pathlist {
|
||||||
|
# in xschem a . in pathlist means the directory of currently loaded schematic/symbol
|
||||||
if { ![string compare $path_elem .] && [info exist current_dirname]} {
|
if { ![string compare $path_elem .] && [info exist current_dirname]} {
|
||||||
set path_elem $current_dirname
|
set path_elem $current_dirname
|
||||||
}
|
}
|
||||||
|
|
||||||
set fullpath "$path_elem/$fname"
|
set fullpath "$path_elem/$fname"
|
||||||
if { [file exists $fullpath] } {
|
if { [file exists $fullpath] } {
|
||||||
set name $fullpath
|
set name $fullpath
|
||||||
|
|
@ -2677,8 +2692,10 @@ proc abs_sym_path {fname {ext {} } } {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if { ![string compare $name {}] } {
|
if { ![string compare $name {}] } {
|
||||||
|
# if absolute path do nothing
|
||||||
if { [regexp {^/} $fname] || [regexp {^[a-zA-Z]:} $fname] || [regexp ^$current_dirname $fname]} {
|
if { [regexp {^/} $fname] || [regexp {^[a-zA-Z]:} $fname] || [regexp ^$current_dirname $fname]} {
|
||||||
set name $fname
|
set name $fname
|
||||||
|
# if fname is a relative path just prepend current_dirname
|
||||||
} else {
|
} else {
|
||||||
set name "$current_dirname/$fname"
|
set name "$current_dirname/$fname"
|
||||||
}
|
}
|
||||||
|
|
@ -3265,8 +3282,8 @@ if {$::OS == "Windows"} {
|
||||||
set filetmp1 $env(windir)/.tmp1
|
set filetmp1 $env(windir)/.tmp1
|
||||||
set filetmp2 $env(windir)/.tmp2
|
set filetmp2 $env(windir)/.tmp2
|
||||||
} else {
|
} else {
|
||||||
set filetmp1 $env(PWD)/.tmp1
|
set filetmp1 [pwd]/.tmp1
|
||||||
set filetmp2 $env(PWD)/.tmp2
|
set filetmp2 [pwd]/.tmp2
|
||||||
}
|
}
|
||||||
# /20111106
|
# /20111106
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue