source: vis_dev/vis-2.3/src/vm/vmMain.c@ 40

Last change on this file since 40 was 14, checked in by cecile, 15 years ago

vis2.3

File size: 11.6 KB
RevLine 
[14]1/**CFile***********************************************************************
2
3 FileName [vmMain.c]
4
5 PackageName [vm]
6
7 Synopsis [Main VIS routine. Parses command line at invocation of VIS.]
8
9 Author [Originated from SIS]
10
11 Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California.
12 All rights reserved.
13
14 Permission is hereby granted, without written agreement and without license
15 or royalty fees, to use, copy, modify, and distribute this software and its
16 documentation for any purpose, provided that the above copyright notice and
17 the following two paragraphs appear in all copies of this software.
18
19 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
20 DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
21 OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
22 CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
25 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
26 FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
27 "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE
28 MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.]
29
30******************************************************************************/
31
32#include "vmInt.h"
33
34static char rcsid[] UNUSED = "$Id: vmMain.c,v 1.6 2004/07/16 00:09:59 wangc Exp $";
35
36/*---------------------------------------------------------------------------*/
37/* Variable declarations */
38/*---------------------------------------------------------------------------*/
39FILE *vis_stderr;
40FILE *vis_stdout;
41FILE *vis_historyFile;
42FILE *vis_stdpipe;
43array_t *vm_commandHistoryArray;
44char *vm_programName;
45
46
47/**AutomaticStart*************************************************************/
48
49/*---------------------------------------------------------------------------*/
50/* Static function prototypes */
51/*---------------------------------------------------------------------------*/
52
53static int VisrcSource(Hrc_Manager_t ** hmgr);
54static void UsagePrint(char * program);
55static int TypeCheck(char * s);
56
57/**AutomaticEnd***************************************************************/
58
59
60/*---------------------------------------------------------------------------*/
61/* Definition of exported functions */
62/*---------------------------------------------------------------------------*/
63
64/**Function********************************************************************
65
66 Synopsis [required]
67
68 Description [optional]
69
70 SideEffects [Sets vm_programName to the name of the excutable.]
71
72 SeeAlso [optional]
73
74******************************************************************************/
75int
76main(
77 int argc,
78 char ** argv)
79{
80 int c,
81 status,
82 batch, /* 0 iff we have an interactive run (-c or -f) */
83 initial_source, /* 1 iff we have to read .visrc */
84 initial_read,
85 final_write;
86 int quit_flag;
87 char readcmd[20],
88 writecmd[20];
89 char *dummy,
90 *cmdline,
91 *cmdline1,
92 *infile, /* where to read input */
93 *outfile; /* where to write output */
94 Hrc_Manager_t *globalHmgr;
95
96 vm_programName = argv[0];
97 quit_flag = -1; /* Quick quit */
98
99 VmInit();
100 globalHmgr = Hrc_ManagerAlloc();
101
102 cmdline = util_strsav("");
103 (void) strcpy(readcmd, "read_blif_mv");
104 (void) strcpy(writecmd, "write_blif_mv");
105 infile = "-";
106 outfile = "-";
107 vm_commandHistoryArray = array_alloc(char *, 0);
108 initial_source = 1;
109 initial_read = 1;
110 final_write = 1;
111 batch = 0;
112 util_getopt_reset();
113 while ((c = util_getopt(argc, argv, "c:hf:o:st:T:x")) != EOF) {
114 switch(c) {
115 case 'c':
116 FREE(cmdline);
117 cmdline = util_strsav(util_optarg);
118 batch = 1;
119 break;
120
121 case 'f':
122 FREE(cmdline);
123 cmdline = ALLOC(char, strlen(util_optarg) + 20);
124 (void) sprintf(cmdline, "source %s", util_optarg);
125 batch = 1;
126 break;
127
128 case 'h':
129 UsagePrint(argv[0]);
130 break;
131
132 case 'o':
133 outfile = util_optarg;
134 break;
135
136 case 's':
137 initial_source = 0;
138 break;
139
140 case 't':
141 if (TypeCheck(util_optarg)) {
142 if (strcmp(util_optarg, "none") == 0) {
143 initial_read = 0;
144 }
145 else {
146 (void) sprintf(readcmd, "read_%s", util_optarg);
147 }
148 }
149 else {
150 UsagePrint(argv[0]);
151 }
152 batch = 1;
153 break;
154
155 case 'T':
156 if (TypeCheck(util_optarg)) {
157 if (strcmp(util_optarg, "none") == 0) {
158 final_write = 0;
159 }
160 else {
161 (void) sprintf(writecmd, "write_%s", util_optarg);
162 }
163 }
164 else {
165 UsagePrint(argv[0]);
166 }
167 batch = 1;
168 break;
169
170 case 'x':
171 final_write = 0;
172 initial_read = 0;
173 batch = 1;
174 break;
175
176 default:
177 UsagePrint(argv[0]);
178 }
179 }
180
181 if (! batch) {
182 /* interactive use ... */
183 if (argc - util_optind != 0) {
184 (void) fprintf(vis_stderr, "warning -- trailing arguments ignored\n");
185 }
186
187 (void) fprintf(vis_stdout, "%s\n", Vm_VisReadVersion());
188 if (initial_source) {
189 (void) VisrcSource(&globalHmgr);
190 }
191 while ((quit_flag = Cmd_CommandExecute(&globalHmgr, "source -ip -")) >= 0)
192 ;
193 status = 0;
194
195 } else {
196
197 if (argc - util_optind == 0) {
198 infile = "-";
199 }
200 else if (argc - util_optind == 1) {
201 infile = argv[util_optind];
202 }
203 else {
204 UsagePrint(argv[0]);
205 }
206
207 if (initial_source) {
208 (void) VisrcSource(&globalHmgr);
209 }
210
211 status = 0;
212 if (initial_read) {
213 cmdline1 = ALLOC(char, strlen(infile) + 20);
214 (void) sprintf(cmdline1, "%s %s", readcmd, infile);
215 status = Cmd_CommandExecute(&globalHmgr, cmdline1);
216 FREE(cmdline1);
217 }
218
219 if (status == 0) {
220 /* cmd line contains `source <file>' */
221 status = Cmd_CommandExecute(&globalHmgr, cmdline);
222 if ((status == 0 || status == -1) && final_write) {
223 cmdline1 = ALLOC(char, strlen(outfile) + 20);
224 (void) sprintf(cmdline1, "%s %s", writecmd, outfile);
225 status = Cmd_CommandExecute(&globalHmgr, cmdline1);
226 FREE(cmdline1);
227 }
228 }
229
230 /* FIX: RB, allows a clean quit from a script */
231 quit_flag = status;
232
233
234 }
235
236 FREE(cmdline);
237 for (c = array_n(vm_commandHistoryArray); c-- > 0; ){
238 dummy = array_fetch(char *, vm_commandHistoryArray, c);
239 FREE(dummy);
240 }
241
242 array_free(vm_commandHistoryArray);
243 /* Value of "quit_flag" is determined by the "quit" command */
244 if (quit_flag == -1 || quit_flag == -2) {
245 status = 0;
246 }
247 if (quit_flag == -2) {
248 Hrc_ManagerFree(globalHmgr);
249 VmEnd();
250 }
251 return(status);
252}
253
254
255/*---------------------------------------------------------------------------*/
256/* Definition of internal functions */
257/*---------------------------------------------------------------------------*/
258
259
260/*---------------------------------------------------------------------------*/
261/* Definition of static functions */
262/*---------------------------------------------------------------------------*/
263
264
265/**Function********************************************************************
266
267 Synopsis [Sources the .visrc file.]
268
269 Description [Sources the .visrc file. Always sources the .visrc from
270 library. Then source the .visrc from the home directory. If there is none
271 in the home directory, then execute the one in the current directory if one
272 is present. Returns 1 if scripts were successfully executed, else return 0.]
273
274 SideEffects []
275
276 SeeAlso [optional]
277
278******************************************************************************/
279static int
280VisrcSource(
281 Hrc_Manager_t ** hmgr)
282{
283 char *commandLine;
284 char *libraryName;
285 char *homeFile;
286 struct stat home;
287 struct stat cur;
288 int s1;
289 int s2; /* flags for checking the stat() call */
290 int status0;
291 int status1 = TRUE;
292 int status2 = TRUE;
293
294 /*
295 * First execute the standard .visrc.
296 */
297 libraryName = Vm_VisObtainLibrary();
298 commandLine = ALLOC(char, strlen(libraryName) + 25);
299 (void) sprintf(commandLine, "source -s %s/master.visrc", libraryName);
300 FREE(libraryName);
301 status0 = Cmd_CommandExecute(hmgr, commandLine);
302 FREE(commandLine);
303
304 /*
305 * Look in home directory and current directory for .visrc.
306 */
307 homeFile = util_tilde_expand("~/.visrc");
308 s1 = stat(homeFile, &home);
309 FREE(homeFile);
310 s2 = stat(".visrc", &cur);
311
312 /*
313 * If .visrc is present in both the home and current directories, then read
314 * it from the home directory. Otherwise, read it from wherever it's
315 * located.
316 */
317 if ((s1 == 0) && (s2 == 0) && (home.st_ino == cur.st_ino)){
318 /* ~/.visrc == .visrc : Source the file only once */
319 status1 = Cmd_CommandExecute(hmgr, "source -s ~/.visrc");
320 }
321 else {
322 if (s1 == 0) {
323 status1 = Cmd_CommandExecute(hmgr, "source -s ~/.visrc");
324 }
325 if (s2 == 0) {
326 status2 = Cmd_CommandExecute(hmgr, "source -s .visrc");
327 }
328 }
329
330 return (status0 && status1 && status2);
331}
332
333
334/**Function********************************************************************
335
336 Synopsis [Prints the usage of the VIS shell interface.]
337
338 SideEffects []
339
340 SeeAlso [optional]
341
342******************************************************************************/
343static void
344UsagePrint(
345 char * program)
346{
347 char *libraryName;
348
349 (void) fprintf(vis_stderr,
350 "%s\n", Vm_VisReadVersion());
351 (void) fprintf(vis_stderr,
352 "usage: %s [-c cmd] [-f script] [-h] [-o file] [-s] [-t type] [-T type] [-x] [file]\n",
353 program);
354 (void) fprintf(vis_stderr,
355 " -c cmd\texecute VIS commands `cmd'\n");
356 (void) fprintf(vis_stderr,
357 " -f file\texecute VIS commands from a file\n");
358 (void) fprintf(vis_stderr,
359 " -h\t\tprint the command usage\n");
360 (void) fprintf(vis_stderr,
361 " -o file\tspecify output filename (default is -)\n");
362 (void) fprintf(vis_stderr,
363 " -s\t\tdo not read any initialization file\n");
364 libraryName = Vm_VisObtainLibrary();
365 (void) fprintf(vis_stderr,
366 " \t\t(%s/master.visrc, ~/.visrc)\n", libraryName);
367 FREE(libraryName);
368 (void) fprintf(vis_stderr,
369 " -t type\tspecify input type (blif_mv (default), blif, or none)\n");
370 (void) fprintf(vis_stderr,
371 " -T type\tspecify output type (blif_mv (default), blif, smv, or none)\n");
372 (void) fprintf(vis_stderr,
373 " -x\t\tequivalent to '-t none -T none'\n");
374
375 exit(2);
376}
377
378
379/**Function********************************************************************
380
381 Synopsis [Returns 1 if s is a file type recognized by VIS, else returns 0.]
382
383 Description [Returns 1 if s is a file type recognized by VIS, else returns
384 0. Recognized types are "blif", "blif_mv", and "none".]
385
386 SideEffects []
387
388******************************************************************************/
389static int
390TypeCheck(
391 char * s)
392{
393 if (strcmp(s, "blif") == 0) {
394 return 1;
395 }
396 else if (strcmp(s, "blif_mv") == 0) {
397 return 1;
398 }
399 else if (strcmp(s, "smv") == 0) {
400 return 1;
401 }
402 else if (strcmp(s, "none") == 0) {
403 return 1;
404 }
405 else {
406 (void) fprintf(vis_stderr, "unknown type %s\n", s);
407 return 0;
408 }
409}
Note: See TracBrowser for help on using the repository browser.