Jspice3
cdprpty.c
Go to the documentation of this file.
1 /***************************************************************************
2 SCED - Schematic Capture Editor
3 JSPICE3 adaptation of Spice3e2 - Copyright (c) Stephen R. Whiteley 1992
4 Copyright 1990 Regents of the University of California. All rights reserved.
5 Authors: 1981 Giles C. Billingsley (parts of KIC layout editor)
6  1992 Stephen R. Whiteley
7 ****************************************************************************/
8 
9 /* Enhanced property handling for SCED */
10 
11 
12 #include "spice.h"
13 #include "sced.h"
14 
15 #ifdef __STDC__
16 static void prpty_free(struct prpty*);
17 #else
18 static void prpty_free();
19 #endif
20 
21 #define umalloc(u) (union u*)tmalloc(sizeof(union u))
22 
23 void
25 
26 struct s *SymbolDesc;
27 struct o *Pointer;
28 struct prpty **Property;
29 {
30  /*
31  * Return info field of object.
32  * If Pointer == NULL, object is symbol itself.
33  */
34  if(Pointer == NULL)
35  *Property = SymbolDesc->sPrptyList;
36  else
37  *Property = Pointer->oPrptyList;
38 }
39 
40 
41 int
43 
44 struct s *SymbolDesc;
45 struct o *Pointer;
46 struct prpty *PDesc;
47 {
48  struct prpty *prptyDesc;
49  union prp_data *p_data;
50 
51  prptyDesc = alloc(prpty);
52 
53  if (PDesc->prpty_String)
54  prptyDesc->prpty_String = CopyString(PDesc->prpty_String);
55 
56  else if (PDesc->prpty_Data) {
57  switch (PDesc->prpty_Value) {
58  case P_MODEL:
59  case P_VALUE:
60  case P_INITC:
61  case P_OTHER:
62  prptyDesc->prpty_Data = (union prp_data*)
63  HYcopy((struct hprlist*)PDesc->prpty_Data);
64  break;
65  default:
66  p_data = umalloc(prp_data);
67  *p_data = *PDesc->prpty_Data;
68  if (PDesc->prpty_Value == P_NAME) {
69  p_data->p_name.name = CopyString(p_data->p_name.name);
70  if (p_data->p_name.subname)
71  p_data->p_name.subname =
72  CopyString(p_data->p_name.subname);
73  }
74  prptyDesc->prpty_Data = p_data;
75  }
76  }
77  if (PDesc->prpty_Info)
78  prptyDesc->prpty_Info = CopyString(PDesc->prpty_Info);
79 
80  prptyDesc->prpty_Value = PDesc->prpty_Value;
81 
82  if (Pointer == NULL) {
83  prptyDesc->prpty_Succ = SymbolDesc->sPrptyList;
84  SymbolDesc->sPrptyList = prptyDesc;
85  }
86  else {
87  prptyDesc->prpty_Succ = Pointer->oPrptyList;
88  Pointer->oPrptyList = prptyDesc;
89  }
90  return (True);
91 }
92 
93 
94 int
96 
97 struct s *SymbolDesc;
98 struct o *Pointer;
99 int Value;
100 char *String;
101 {
102  char *cp, name[128], subname[128];
103  struct prpty *prptyDesc;
104  union prp_data *p_data;
105  int i, indx1, indx2;
106  int X, Y, X1, Y1;
107  double coeff;
108 
109  if (String == NULL)
110  goto bad;
111 
112  prptyDesc = alloc(prpty);
113 
114  switch (Value) {
115  case P_NODE:
116  if (Pointer && Pointer->oType == CDWIRE) {
117  if (sscanf(String,"%d",&indx1) != 1)
118  goto bad;
119  indx2 = 0;
120  X = Y = 0;
121  }
122  else if (sscanf(String,"%d %d %d %d",&indx1,&indx2,&X,&Y) != 4)
123  goto bad;
124  p_data = umalloc(prp_data);
125  p_data->p_node.enode = indx1;
126  p_data->p_node.inode = indx2;
127  p_data->p_node.x = X;
128  p_data->p_node.y = Y;
129  prptyDesc->prpty_Data = p_data;
130  break;
131  case P_MUT:
132  if (sscanf(String,"%d %d %d %d %lf",&X,&Y,&X1,&Y1,&coeff) != 5)
133  goto bad;
134  p_data = umalloc(prp_data);
135  p_data->p_mut.x1 = X;
136  p_data->p_mut.y1 = Y;
137  p_data->p_mut.x2 = X1;
138  p_data->p_mut.y2 = Y1;
139  p_data->p_mut.coeff = coeff;
140  prptyDesc->prpty_Data = p_data;
141  break;
142  case P_BRANCH:
143  if (sscanf(String,"%d %d %d %d",&X,&Y,&X1,&Y1) != 4)
144  goto bad;
145  p_data = umalloc(prp_data);
146  p_data->p_branch.x = X;
147  p_data->p_branch.y = Y;
148  p_data->p_branch.r1 = X1;
149  p_data->p_branch.r2 = Y1;
150  prptyDesc->prpty_Data = p_data;
151  break;
152  case P_NAME:
153  i = sscanf(String,"%s %d %s",name,&indx1,subname);
154  if (i < 2)
155  goto bad;
156  p_data = umalloc(prp_data);
157  p_data->p_name.name = CopyString(name);
158  p_data->p_name.num = indx1;
159  if (i == 3)
160  p_data->p_name.subname = CopyString(subname);
161  prptyDesc->prpty_Data = p_data;
162  break;
163  case P_MODEL:
164  case P_VALUE:
165  case P_INITC:
166  case P_OTHER:
167  prptyDesc->prpty_Data = (union prp_data*)HYfromascii(String);
168  break;
169  default:
170  prptyDesc->prpty_String = CopyString(String);
171 
172  /* we can't allow semicolons because of CIF */
173  for (cp = prptyDesc->prpty_String; *cp; cp++)
174  if (*cp == ';') *cp = ' ';
175  }
176  prptyDesc->prpty_Value = Value;
177 
178  if (Pointer == NULL) {
179  prptyDesc->prpty_Succ = SymbolDesc->sPrptyList;
180  SymbolDesc->sPrptyList = prptyDesc;
181  }
182  else {
183  prptyDesc->prpty_Succ = Pointer->oPrptyList;
184  Pointer->oPrptyList = prptyDesc;
185  }
186  return (True);
187 bad:
188  return (False);
189 }
190 
191 
192 int
194 
195 struct s *SymbolDesc;
196 struct o *Pointer;
197 int Value;
198 {
199  struct prpty *prptyDesc;
200  struct prpty *prptyHead;
201  struct prpty *prptyCopy;
202  struct prpty *prptyTemp;
203 
204  if (Pointer == NULL)
205  prptyHead = prptyDesc = SymbolDesc->sPrptyList;
206  else
207  prptyHead = prptyDesc = Pointer->oPrptyList;
208 
209  for (prptyCopy = NULL; prptyDesc != NULL;
210  prptyCopy = prptyDesc,prptyDesc = prptyTemp) {
211  prptyTemp = prptyDesc->prpty_Succ;
212 
213  if (prptyDesc->prpty_Value == Value) {
214  if (prptyCopy == NULL)
215  prptyHead = prptyDesc->prpty_Succ;
216  else
217  prptyCopy->prpty_Succ = prptyDesc->prpty_Succ;
218  prpty_free(prptyDesc);
219  prptyDesc = prptyCopy;
220  }
221  }
222  if (Pointer == NULL)
223  SymbolDesc->sPrptyList = prptyHead;
224  else
225  Pointer->oPrptyList = prptyHead;
226  return (True);
227 }
228 
229 
230 static void
232 
233 struct prpty *PDesc;
234 {
235  if (PDesc->prpty_String)
236  free(PDesc->prpty_String);
237  if (PDesc->prpty_Data) {
238  switch (PDesc->prpty_Value) {
239  case P_MODEL:
240  case P_VALUE:
241  case P_INITC:
242  case P_OTHER:
243  HYfree((struct hprlist*)PDesc->prpty_Data);
244  break;
245  case P_NAME:
246  if (PDesc->prpty_Data->p_name.name)
247  free(PDesc->prpty_Data->p_name.name);
248  if (PDesc->prpty_Data->p_name.subname)
249  free(PDesc->prpty_Data->p_name.subname);
250  default:
251  free(PDesc->prpty_Data);
252  }
253  }
254  if (PDesc->prpty_Info)
255  free(PDesc->prpty_Info);
256  free(PDesc);
257 }
258 
259 
260 void
262 
263 struct prpty *PDesc;
264 {
265  struct prpty *pd;
266 
267  for (; PDesc; PDesc = pd) {
268  pd = PDesc->prpty_Succ;
269  prpty_free(PDesc);
270  }
271 }
272 
273 
274 void
275 CDPrptyListPrint(FileDesc,PDesc)
276 
277 FILE *FileDesc;
278 struct prpty *PDesc;
279 {
280  union prp_data *p_data;
281  char *s;
282 
283  while (PDesc) {
284  if (PDesc->prpty_String)
285  fprintf(FileDesc,"5 %d %s;\n",PDesc->prpty_Value,
286  PDesc->prpty_String);
287 
288  else if (PDesc->prpty_Data) {
289  p_data = PDesc->prpty_Data;
290 
291  switch (PDesc->prpty_Value) {
292  case P_NODE:
293  fprintf(FileDesc,"5 %d %d %d %d %d;\n",
294  PDesc->prpty_Value,
295  p_data->p_node.enode,p_data->p_node.inode,
296  p_data->p_node.x,p_data->p_node.y);
297  break;
298  case P_MUT:
299  fprintf(FileDesc,"5 %d %d %d %d %d %g;\n",
300  PDesc->prpty_Value,
301  p_data->p_mut.x1,p_data->p_mut.y1,
302  p_data->p_mut.x2,p_data->p_mut.y2,
303  p_data->p_mut.coeff);
304  break;
305  case P_BRANCH:
306  fprintf(FileDesc,"5 %d %d %d %d %d;\n",
307  PDesc->prpty_Value,
308  p_data->p_branch.x,p_data->p_branch.y,
309  p_data->p_branch.r1,p_data->p_branch.r2);
310  break;
311  case P_NAME:
312  if (p_data->p_name.subname)
313  fprintf(FileDesc,"5 %d %s %d %s;\n",
314  PDesc->prpty_Value,
315  p_data->p_name.name,p_data->p_name.num,
316  p_data->p_name.subname);
317  else
318  fprintf(FileDesc,"5 %d %s %d;\n",
319  PDesc->prpty_Value,
320  p_data->p_name.name,p_data->p_name.num);
321  break;
322  case P_VALUE:
323  case P_MODEL:
324  case P_INITC:
325  case P_OTHER:
326  s = HYtoascii((struct hprlist*)p_data);
327  if (s) {
328  fprintf(FileDesc,"5 %d %s;\n",PDesc->prpty_Value,s);
329  txfree(s);
330  }
331  break;
332  }
333  }
334  PDesc = PDesc->prpty_Succ;
335  }
336 }
int struct o * Pointer
Definition: cd.c:1311
int prpty_Value
Definition: cdprpty.h:67
char * prpty_Info
Definition: cdprpty.h:64
int CDAddProperty(struct s *SymbolDesc, struct o *Pointer, int Value, char *String)
Definition: cdprpty.c:95
char * HYtoascii()
void HYfree()
Definition: cddefs.h:119
char * CopyString()
char oType
Definition: cddefs.h:148
int enode
Definition: cdprpty.h:24
void CDPrptyListPrint(FILE *FileDesc, struct prpty *PDesc)
Definition: cdprpty.c:275
int x1
Definition: cdprpty.h:31
struct prp_node p_node
Definition: cdprpty.h:52
#define P_MODEL
Definition: cdprpty.h:16
int x
Definition: cdprpty.h:26
#define P_NODE
Definition: cdprpty.h:12
#define P_VALUE
Definition: cdprpty.h:17
#define P_BRANCH
Definition: cdprpty.h:15
struct hprlist * HYfromascii()
#define P_OTHER
Definition: cdprpty.h:19
Definition: sced.h:193
#define alloc(type)
Definition: cdmacs.h:21
int x
Definition: cdprpty.h:39
union prp_data * prpty_Data
Definition: cdprpty.h:65
int CDRemoveProperty(struct s *SymbolDesc, struct o *Pointer, int Value)
Definition: cdprpty.c:193
int r2
Definition: cdprpty.h:42
long X
Definition: actions.c:450
void CDProperty(struct s *SymbolDesc, struct o *Pointer, struct prpty **Property)
Definition: cdprpty.c:24
int struct s * SymbolDesc
Definition: cd.c:1905
void txfree()
#define NULL
Definition: spdefs.h:121
int y1
Definition: cdprpty.h:32
void CDPrptyListFree(struct prpty *PDesc)
Definition: cdprpty.c:261
#define True
Definition: scedstub.c:16
#define P_INITC
Definition: cdprpty.h:18
char * subname
Definition: cdprpty.h:48
int y2
Definition: cdprpty.h:34
int y
Definition: cdprpty.h:27
Definition: cddefs.h:142
#define P_NAME
Definition: cdprpty.h:13
int y
Definition: cdprpty.h:40
char * prpty_String
Definition: cdprpty.h:63
struct prp_branch p_branch
Definition: cdprpty.h:54
#define umalloc(u)
Definition: cdprpty.c:21
#define CDWIRE
Definition: cddefs.h:47
#define P_MUT
Definition: cdprpty.h:14
int CDCopyProperty(struct s *SymbolDesc, struct o *Pointer, struct prpty *PDesc)
Definition: cdprpty.c:42
int num
Definition: cdprpty.h:47
static void prpty_free()
struct prpty * prpty_Succ
Definition: cdprpty.h:66
int r1
Definition: cdprpty.h:41
char * name
Definition: cdprpty.h:46
int inode
Definition: cdprpty.h:25
double coeff
Definition: cdprpty.h:35
#define False
Definition: scedstub.c:15
struct prp_name p_name
Definition: cdprpty.h:55
int x2
Definition: cdprpty.h:33
struct prp_mut p_mut
Definition: cdprpty.h:53
long Y
Definition: actions.c:450
Definition: cdprpty.h:62
struct prpty * oPrptyList
Definition: cddefs.h:146
void free()
struct hprlist * HYcopy()