1 /***************************************************************************
2 JSPICE3 adaptation of Spice3e2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California.  All rights reserved.
4 Authors: 1986 Wayne A. Christopher
5          1992 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 /*
9  * Routines to query and alter devices.
10  */
11 
12 #include "spice.h"
13 #include "ftedefs.h"
14 #include "spfteext.h"
15 
16 #ifdef __STDC__
17 static wordlist *devexpand(char*);
18 static void parseline(wordlist*,wordlist**,wordlist**);
19 #else
20 static wordlist *devexpand();
21 static void parseline();
22 #endif
23 
24 
25 /* Display various device parameters.  The syntax of this command is
26  *   show [devicelist] [, parmlist]
27  * where devicelist can be "all", device names, or glob-matched subnames
28  * using wildcards *,?,[].  The parms are names of parameters that should
29  * be valid for all the named devices, or "all".  Defaults to all, all.
30  */
31 
32 void
com_show(wl)33 com_show(wl)
34 
35 wordlist *wl;
36 {
37     wordlist *devs, *parms, *keyword;
38     wordlist *tw, *pw, *kw, *ww, *w0;
39     struct variable *v, *vv;
40     int len;
41     char *neww;
42 
43     if (!ft_curckt) {
44         fprintf(cp_err, "Error: no circuit loaded\n");
45         return;
46     }
47         parseline(wl,&devs,&parms);
48 
49     if (parms == NULL) {
50         parms = alloc(wordlist);
51         parms->wl_word = copy("all");
52     }
53 
54     if (devs == NULL)
55         devs = cp_cctowl(ft_curckt->ci_devices);
56 
57     wl_sort(devs);
58     out_init();
59 
60     for (tw = devs; tw; tw = tw->wl_next) {
61         out_printf("\n%s:\n", tw->wl_word);
62 
63         for (pw = parms; pw; pw = pw->wl_next) {
64 
65             keyword = NULL;
66             neww = copy(tw->wl_word); /* address put in symtab */
67             vv = if_getparam((char*)ft_curckt->ci_ckt, &neww,
68                 pw->wl_word, 0, &keyword);
69 
70             for (v = vv, kw = keyword; v; v = v->va_next, kw = kw->wl_next) {
71                 len = 14 + strlen(kw->wl_word);
72                 out_printf("  %s =",kw->wl_word);
73                 w0 = cp_varwl(v);
74                 for (ww = w0; ww; ww = ww->wl_next) {
75                     len += strlen(ww->wl_word) + 1;
76                     out_printf(" %s", ww->wl_word);
77                 }
78                 wl_free(w0);
79 
80                 for (; len < 40; len++)
81                     out_send(" ");
82                 out_printf(" %s\n",v->va_name);
83             }
84             wl_free(keyword);
85             va_free(vv);
86         }
87     }
88     out_send("\n");
89 
90     wl_free(devs);
91     wl_free(parms);
92 }
93 
94 
95 /* Alter a device parameter.  The syntax here is
96  *   alter devicelist : parmname value [parmname value] ...
97  * where devicelist is as above, parmname is the name of the desired parm
98  * and value is a string, numeric, or bool value.
99  */
100 
101 void
com_alter(wl)102 com_alter(wl)
103 
104 wordlist *wl;
105 {
106     wordlist *devs, *parms, *tw;
107 
108     if (!ft_curckt) {
109         fprintf(cp_err, "Error: no circuit loaded\n");
110         return;
111     }
112 
113     parseline(wl,&devs,&parms);
114 
115     /*
116         for (tw = devs; tw; tw = tw->wl_next)
117                 if_alter(tw->wl_word,parms);
118     */
119 
120     wl_free(devs);
121     wl_free(parms);
122 }
123 
124 
125 static void
parseline(line,dlist,plist)126 parseline(line,dlist,plist)
127 wordlist *line,**dlist,**plist;
128 {
129     wordlist *tw, *tl, *t0;
130     char *c = NULL;
131 
132     *plist = NULL;
133     *dlist = NULL;
134     if (!line)
135         return;
136     tl = tw = wl_copy(line);
137 
138     while (tw) {
139         if ((c = strchr(tw->wl_word,',')) != NULL) break;
140         tw = tw->wl_next;
141     }
142     if (c) {
143         if (*(c+1) == '\0') {
144             *c = '\0';
145             *plist = tw->wl_next;
146             if (tw->wl_next)
147                 tw->wl_next->wl_prev = NULL;
148             tw->wl_next = NULL;
149             if (*tw->wl_word == '\0') {
150                 if (tw->wl_prev)
151                     tw->wl_prev->wl_next = NULL;
152                 if (tl == tw)
153                     tl = NULL;
154                 tfree(tw);
155             }
156         }
157         else if (c == tw->wl_word) {
158             tw->wl_word = copy(c+1);
159             tfree(c);
160             *plist = tw;
161             if (tw->wl_prev)
162                 tw->wl_prev->wl_next = NULL;
163             tw->wl_prev = NULL;
164         }
165         else {
166             *plist = alloc(wordlist);
167             (*plist)->wl_word = copy(c+1);
168             (*plist)->wl_next = tw->wl_next;
169             if (tw->wl_next)
170                 tw->wl_next->wl_prev = *plist;
171             *c = '\0';
172             tw->wl_next = NULL;
173         }
174     }
175 
176     /* Now expand the devicelist... */
177     t0 = tl;
178     for (tw = NULL; tl; tl = tl->wl_next) {
179         inp_casefix(tl->wl_word);
180         tw = wl_append(tw, devexpand(tl->wl_word));
181     }
182     wl_free(t0);
183     *dlist = tw;
184 }
185 
186 
187 /* Given a device name, possibly with wildcards, return the matches. */
188 
189 static wordlist *
devexpand(name)190 devexpand(name)
191 
192 char *name;
193 {
194     wordlist *wl, *d, *devices, *tw;
195 
196     if (strchr(name, '*') || strchr(name, '[') || strchr(name, '?')) {
197         devices = cp_cctowl(ft_curckt->ci_devices);
198         d = devices;
199         for (wl = NULL; d; d = d->wl_next) {
200             if (cp_globmatch(name, d->wl_word)) {
201                 tw = alloc(struct wordlist);
202                 if (wl) {
203                     wl->wl_prev = tw;
204                     tw->wl_next = wl;
205                     wl = tw;
206                 }
207                 else
208                     wl = tw;
209                 wl->wl_word = copy(d->wl_word);
210             }
211         }
212         wl_free(devices);
213     }
214     else if (eq(name, "all")) {
215         wl = cp_cctowl(ft_curckt->ci_devices);
216     }
217     else {
218         wl = alloc(struct wordlist);
219         wl->wl_word = copy(name);
220     }
221     wl_sort(wl);
222     return (wl);
223 }
224 
225