[14] | 1 | /**CFile*********************************************************************** |
---|
| 2 | |
---|
| 3 | FileName [cmdMisc.c] |
---|
| 4 | |
---|
| 5 | PackageName [cmd] |
---|
| 6 | |
---|
| 7 | Synopsis [Variable table; miscellaneous commands related to the general |
---|
| 8 | system.] |
---|
| 9 | |
---|
| 10 | Author [SIS] |
---|
| 11 | |
---|
| 12 | Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California. |
---|
| 13 | All rights reserved. |
---|
| 14 | |
---|
| 15 | Permission is hereby granted, without written agreement and without license |
---|
| 16 | or royalty fees, to use, copy, modify, and distribute this software and its |
---|
| 17 | documentation for any purpose, provided that the above copyright notice and |
---|
| 18 | the following two paragraphs appear in all copies of this software. |
---|
| 19 | |
---|
| 20 | IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR |
---|
| 21 | DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT |
---|
| 22 | OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF |
---|
| 23 | CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
| 24 | |
---|
| 25 | THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, |
---|
| 26 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
---|
| 27 | FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN |
---|
| 28 | "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE |
---|
| 29 | MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.] |
---|
| 30 | |
---|
| 31 | ******************************************************************************/ |
---|
| 32 | |
---|
| 33 | #include "cmdInt.h" |
---|
| 34 | #include <errno.h> |
---|
| 35 | |
---|
| 36 | static char rcsid[] UNUSED = "$Id: cmdMisc.c,v 1.59 2009/04/11 18:25:50 fabio Exp $"; |
---|
| 37 | |
---|
| 38 | /*---------------------------------------------------------------------------*/ |
---|
| 39 | /* Constant declarations */ |
---|
| 40 | /*---------------------------------------------------------------------------*/ |
---|
| 41 | /* The maximum length of an input line */ |
---|
| 42 | #define MAX_STR 32768 |
---|
| 43 | |
---|
| 44 | |
---|
| 45 | /*---------------------------------------------------------------------------*/ |
---|
| 46 | /* Variable declarations */ |
---|
| 47 | /*---------------------------------------------------------------------------*/ |
---|
| 48 | avl_tree *cmdAliasTable; |
---|
| 49 | avl_tree *cmdFlagTable; |
---|
| 50 | |
---|
| 51 | static boolean fileCreated; |
---|
| 52 | |
---|
| 53 | |
---|
| 54 | /**AutomaticStart*************************************************************/ |
---|
| 55 | |
---|
| 56 | /*---------------------------------------------------------------------------*/ |
---|
| 57 | /* Static function prototypes */ |
---|
| 58 | /*---------------------------------------------------------------------------*/ |
---|
| 59 | |
---|
| 60 | static int CommandTime(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 61 | static int CommandEcho(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 62 | static int CommandSetBddParameters(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 63 | static int CommandMemoryProfile(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 64 | static int CommandQuit(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 65 | static int CommandUsage(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 66 | static int CommandWhich(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 67 | static int CommandHistory(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 68 | static int CommandAlias(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 69 | static int CommandUnalias(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 70 | static int CommandSetVariable(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 71 | static int CommandUnsetVariable(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 72 | static int CommandHelp(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 73 | static int CommandSource(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 74 | static void print_alias(char * value); |
---|
| 75 | static char * command_alias_help(char * command); |
---|
| 76 | static void FlushBuffers(int sigtype); |
---|
| 77 | |
---|
| 78 | /**AutomaticEnd***************************************************************/ |
---|
| 79 | |
---|
| 80 | |
---|
| 81 | /*---------------------------------------------------------------------------*/ |
---|
| 82 | /* Definition of exported functions */ |
---|
| 83 | /*---------------------------------------------------------------------------*/ |
---|
| 84 | |
---|
| 85 | |
---|
| 86 | /**Function******************************************************************** |
---|
| 87 | |
---|
| 88 | Synopsis [Looks up value of flag in table of named values.] |
---|
| 89 | |
---|
| 90 | Description [The command parser maintains a table of named values. These |
---|
| 91 | are manipulated using the 'set' and 'unset' commands. The value of the |
---|
| 92 | named flag is returned, or NIL(char) is returned if the flag has not been |
---|
| 93 | set.] |
---|
| 94 | |
---|
| 95 | SideEffects [] |
---|
| 96 | |
---|
| 97 | ******************************************************************************/ |
---|
| 98 | char * |
---|
| 99 | Cmd_FlagReadByName( |
---|
| 100 | char * flag) |
---|
| 101 | { |
---|
| 102 | char *value; |
---|
| 103 | |
---|
| 104 | if (avl_lookup(cmdFlagTable, flag, &value)) { |
---|
| 105 | return value; |
---|
| 106 | } |
---|
| 107 | else { |
---|
| 108 | return NIL(char); |
---|
| 109 | } |
---|
| 110 | } |
---|
| 111 | |
---|
| 112 | |
---|
| 113 | /**Function******************************************************************** |
---|
| 114 | |
---|
| 115 | Synopsis [Updates a set value by calling instead of set command.] |
---|
| 116 | |
---|
| 117 | Description [Updates a set value by calling instead of set command.] |
---|
| 118 | |
---|
| 119 | SideEffects [] |
---|
| 120 | |
---|
| 121 | ******************************************************************************/ |
---|
| 122 | void |
---|
| 123 | Cmd_FlagUpdateValue( |
---|
| 124 | char * key, char * value) |
---|
| 125 | { |
---|
| 126 | char *oldValue, *newValue; |
---|
| 127 | |
---|
| 128 | if (!key) |
---|
| 129 | return; |
---|
| 130 | if (value) |
---|
| 131 | newValue = util_strsav(value); |
---|
| 132 | else |
---|
| 133 | newValue = util_strsav(""); |
---|
| 134 | |
---|
| 135 | if (avl_delete(cmdFlagTable, &key, &oldValue)) |
---|
| 136 | FREE(oldValue); |
---|
| 137 | |
---|
| 138 | (void) avl_insert(cmdFlagTable, key, newValue); |
---|
| 139 | } |
---|
| 140 | |
---|
| 141 | |
---|
| 142 | /**Function******************************************************************** |
---|
| 143 | |
---|
| 144 | Synopsis [Deletes a set value by calling instead of unset command.] |
---|
| 145 | |
---|
| 146 | Description [Deletes a set value by calling instead of unset command.] |
---|
| 147 | |
---|
| 148 | SideEffects [] |
---|
| 149 | |
---|
| 150 | ******************************************************************************/ |
---|
| 151 | void |
---|
| 152 | Cmd_FlagDeleteByName( |
---|
| 153 | char * key) |
---|
| 154 | { |
---|
| 155 | char *value; |
---|
| 156 | |
---|
| 157 | if (!key) |
---|
| 158 | return; |
---|
| 159 | |
---|
| 160 | if (avl_delete(cmdFlagTable, &key, &value)) { |
---|
| 161 | FREE(key); |
---|
| 162 | FREE(value); |
---|
| 163 | } |
---|
| 164 | } |
---|
| 165 | |
---|
| 166 | |
---|
| 167 | /**Function******************************************************************** |
---|
| 168 | |
---|
| 169 | Synopsis [Initializes the command package.] |
---|
| 170 | |
---|
| 171 | SideEffects [Commands are added to the command table.] |
---|
| 172 | |
---|
| 173 | SeeAlso [Cmd_End] |
---|
| 174 | |
---|
| 175 | ******************************************************************************/ |
---|
| 176 | void |
---|
| 177 | Cmd_Init(void) |
---|
| 178 | { |
---|
| 179 | char *path; |
---|
| 180 | char *lib_name; |
---|
| 181 | |
---|
| 182 | |
---|
| 183 | cmdCommandTable = avl_init_table((int(*)(const void *, const void *))strcmp); |
---|
| 184 | cmdFlagTable = avl_init_table((int(*)(const void *, const void *))strcmp); |
---|
| 185 | cmdAliasTable = avl_init_table((int(*)(const void *, const void *))strcmp); |
---|
| 186 | |
---|
| 187 | Cmd_CommandAdd("alias", CommandAlias, 0); |
---|
| 188 | Cmd_CommandAdd("echo", CommandEcho, 0); |
---|
| 189 | Cmd_CommandAdd("help", CommandHelp, 0); |
---|
| 190 | Cmd_CommandAdd("quit", CommandQuit, 0); |
---|
| 191 | Cmd_CommandAdd("source", CommandSource, 0); |
---|
| 192 | /* Cmd_CommandAdd("undo", CommandUndo, 0); */ |
---|
| 193 | Cmd_CommandAdd("set", CommandSetVariable, 0); |
---|
| 194 | Cmd_CommandAdd("unalias", CommandUnalias, 0); |
---|
| 195 | Cmd_CommandAdd("unset", CommandUnsetVariable, 0); |
---|
| 196 | Cmd_CommandAdd("time", CommandTime, 0); |
---|
| 197 | Cmd_CommandAdd("usage", CommandUsage, 0); |
---|
| 198 | Cmd_CommandAdd("history", CommandHistory, 0); |
---|
| 199 | Cmd_CommandAdd("which", CommandWhich, 0); |
---|
| 200 | Cmd_CommandAdd("set_bdd_parameters" , CommandSetBddParameters, 0); |
---|
| 201 | Cmd_CommandAdd("_memory_profile", CommandMemoryProfile, 0); |
---|
| 202 | fileCreated = FALSE; |
---|
| 203 | |
---|
| 204 | /* Program the signal of type USR1 to flush vis_stdout and vis_stderr */ |
---|
| 205 | #ifdef SIGUSR1 |
---|
| 206 | (void) signal(SIGUSR1, FlushBuffers); |
---|
| 207 | #endif |
---|
| 208 | |
---|
| 209 | /* set the default open_path */ |
---|
| 210 | lib_name = Vm_VisObtainLibrary(); |
---|
| 211 | path = ALLOC(char, strlen(lib_name) + 20); |
---|
| 212 | sprintf(path, "set open_path .:%s", lib_name); |
---|
| 213 | Cmd_CommandExecute(NULL, path); |
---|
| 214 | FREE(lib_name); |
---|
| 215 | FREE(path); |
---|
| 216 | } |
---|
| 217 | |
---|
| 218 | |
---|
| 219 | /**Function******************************************************************** |
---|
| 220 | |
---|
| 221 | Synopsis [Ends the command package.] |
---|
| 222 | |
---|
| 223 | Description [Ends the command package. Tables are freed, and the global |
---|
| 224 | error string is freed.] |
---|
| 225 | |
---|
| 226 | SideEffects [] |
---|
| 227 | |
---|
| 228 | SeeAlso [Cmd_Init] |
---|
| 229 | |
---|
| 230 | ******************************************************************************/ |
---|
| 231 | void |
---|
| 232 | Cmd_End(void) |
---|
| 233 | { |
---|
| 234 | avl_free_table(cmdFlagTable, (void (*)(char *))free, (void (*)(char *))free); |
---|
| 235 | avl_free_table(cmdCommandTable, (void (*)(char *)) 0, CmdCommandFree); |
---|
| 236 | avl_free_table(cmdAliasTable, (void (*)(char *)) 0, CmdAliasFree); |
---|
| 237 | if (cmdBackupHmgr != NIL(Hrc_Manager_t)) { |
---|
| 238 | Hrc_ManagerFree(cmdBackupHmgr); |
---|
| 239 | } |
---|
| 240 | error_cleanup(); |
---|
| 241 | |
---|
| 242 | if (fileCreated == TRUE) { |
---|
| 243 | (void) fprintf(vis_stdout, "Purify has created a temporary file. The file"); |
---|
| 244 | (void) fprintf(vis_stdout, " must be deleted.\n"); |
---|
| 245 | } |
---|
| 246 | } |
---|
| 247 | |
---|
| 248 | |
---|
| 249 | /**Function******************************************************************** |
---|
| 250 | |
---|
| 251 | Synopsis [Test that the given string is an integer. Returns 0 if string is |
---|
| 252 | not an integer, 1 if the integer is too big for int, and 2 if integer fits |
---|
| 253 | in int.] |
---|
| 254 | |
---|
| 255 | SideEffects [Sets the pointer value if the string is an integer small enough |
---|
| 256 | for int.] |
---|
| 257 | |
---|
| 258 | ******************************************************************************/ |
---|
| 259 | int |
---|
| 260 | Cmd_StringCheckIsInteger( |
---|
| 261 | char *string, |
---|
| 262 | int *value) |
---|
| 263 | { |
---|
| 264 | char *ptr; |
---|
| 265 | long l; |
---|
| 266 | |
---|
| 267 | errno = 0 ; |
---|
| 268 | l = strtol (string, &ptr, 0) ; |
---|
| 269 | if(*ptr != '\0') |
---|
| 270 | return 0; |
---|
| 271 | if (errno != 0) |
---|
| 272 | return 1; |
---|
| 273 | if ((l > MAXINT) || (l < -1 - MAXINT)) |
---|
| 274 | return 1 ; |
---|
| 275 | *value = (int) l; |
---|
| 276 | return 2 ; |
---|
| 277 | } |
---|
| 278 | |
---|
| 279 | |
---|
| 280 | /*---------------------------------------------------------------------------*/ |
---|
| 281 | /* Definition of internal functions */ |
---|
| 282 | /*---------------------------------------------------------------------------*/ |
---|
| 283 | |
---|
| 284 | |
---|
| 285 | /**Function******************************************************************** |
---|
| 286 | |
---|
| 287 | Synopsis [required] |
---|
| 288 | |
---|
| 289 | Description [optional] |
---|
| 290 | |
---|
| 291 | SideEffects [required] |
---|
| 292 | |
---|
| 293 | SeeAlso [optional] |
---|
| 294 | |
---|
| 295 | ******************************************************************************/ |
---|
| 296 | void |
---|
| 297 | CmdFreeArgv(int argc, char ** argv) |
---|
| 298 | { |
---|
| 299 | int i; |
---|
| 300 | |
---|
| 301 | for(i = 0; i < argc; i++) { |
---|
| 302 | FREE(argv[i]); |
---|
| 303 | } |
---|
| 304 | FREE(argv); |
---|
| 305 | } |
---|
| 306 | |
---|
| 307 | |
---|
| 308 | /**Function******************************************************************** |
---|
| 309 | |
---|
| 310 | Synopsis [required] |
---|
| 311 | |
---|
| 312 | Description [optional] |
---|
| 313 | |
---|
| 314 | SideEffects [required] |
---|
| 315 | |
---|
| 316 | SeeAlso [optional] |
---|
| 317 | |
---|
| 318 | ******************************************************************************/ |
---|
| 319 | void |
---|
| 320 | CmdAliasFree( |
---|
| 321 | char * value) |
---|
| 322 | { |
---|
| 323 | CmdAliasDescr_t *alias = (CmdAliasDescr_t *) value; |
---|
| 324 | |
---|
| 325 | CmdFreeArgv(alias->argc, alias->argv); |
---|
| 326 | FREE(alias->name); /* same as key */ |
---|
| 327 | FREE(alias); |
---|
| 328 | } |
---|
| 329 | |
---|
| 330 | |
---|
| 331 | |
---|
| 332 | /*---------------------------------------------------------------------------*/ |
---|
| 333 | /* Definition of static functions */ |
---|
| 334 | /*---------------------------------------------------------------------------*/ |
---|
| 335 | |
---|
| 336 | /**Function******************************************************************** |
---|
| 337 | |
---|
| 338 | Synopsis [Implements the time command.] |
---|
| 339 | |
---|
| 340 | CommandName [time] |
---|
| 341 | CommandSynopsis [provide a simple elapsed time value] |
---|
| 342 | CommandArguments [\[-h\]\[-u\]] |
---|
| 343 | CommandDescription [Prints the processor time used since the last time |
---|
| 344 | command, and the total processor time used since VIS was started. <p> |
---|
| 345 | By default, the time reported is the CPU time spent executing instructions |
---|
| 346 | of the calling process and the time this process waited for children that |
---|
| 347 | terminated.<p> |
---|
| 348 | Command options:<p> |
---|
| 349 | <dl><dt> -h |
---|
| 350 | <dd> Print the command usage. |
---|
| 351 | </dl> |
---|
| 352 | <dl><dt> -u |
---|
| 353 | <dd> Exclude child process time. |
---|
| 354 | </dl>] |
---|
| 355 | |
---|
| 356 | SideEffects [] |
---|
| 357 | |
---|
| 358 | ******************************************************************************/ |
---|
| 359 | static int |
---|
| 360 | CommandTime( |
---|
| 361 | Hrc_Manager_t ** hmgr, |
---|
| 362 | int argc, |
---|
| 363 | char ** argv) |
---|
| 364 | { |
---|
| 365 | static long last_time_u = 0; |
---|
| 366 | static long last_time_c = 0; |
---|
| 367 | long time; |
---|
| 368 | int c; |
---|
| 369 | boolean excludeChildren = FALSE; |
---|
| 370 | |
---|
| 371 | util_getopt_reset(); |
---|
| 372 | while ((c = util_getopt(argc,argv,"hu")) != EOF){ |
---|
| 373 | switch(c){ |
---|
| 374 | case 'h': |
---|
| 375 | goto usage; |
---|
| 376 | case 'u': |
---|
| 377 | excludeChildren = TRUE; |
---|
| 378 | break; |
---|
| 379 | default: |
---|
| 380 | goto usage; |
---|
| 381 | } |
---|
| 382 | } |
---|
| 383 | |
---|
| 384 | if (argc != util_optind) { |
---|
| 385 | goto usage; |
---|
| 386 | } |
---|
| 387 | |
---|
| 388 | if (excludeChildren) { |
---|
| 389 | time = util_cpu_time(); |
---|
| 390 | (void) fprintf(vis_stdout, |
---|
| 391 | "elapse: %2.1f seconds, total: %2.1f seconds\n", |
---|
| 392 | (time - last_time_u) / 1000.0, time / 1000.0); |
---|
| 393 | last_time_u = time; |
---|
| 394 | } else { |
---|
| 395 | time = util_cpu_ctime(); |
---|
| 396 | (void) fprintf(vis_stdout, |
---|
| 397 | "elapse: %2.1f seconds, total: %2.1f seconds\n", |
---|
| 398 | (time - last_time_c) / 1000.0, time / 1000.0); |
---|
| 399 | last_time_c = time; |
---|
| 400 | } |
---|
| 401 | return 0; |
---|
| 402 | |
---|
| 403 | usage: |
---|
| 404 | (void) fprintf(vis_stderr, "usage: time [-h][-u]\n"); |
---|
| 405 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 406 | (void) fprintf(vis_stderr, " -u \t\texclude child process time\n"); |
---|
| 407 | return 1; |
---|
| 408 | } |
---|
| 409 | |
---|
| 410 | /**Function******************************************************************** |
---|
| 411 | |
---|
| 412 | Synopsis [Implements the echo command.] |
---|
| 413 | |
---|
| 414 | CommandName [echo] |
---|
| 415 | CommandSynopsis [merely echo the arguments] |
---|
| 416 | CommandArguments [\[-h\] <args>] |
---|
| 417 | CommandDescription [Echoes the arguments to standard output.<p> |
---|
| 418 | Command options:<p> |
---|
| 419 | <dl><dt> -h |
---|
| 420 | <dd> Print the command usage. |
---|
| 421 | </dl>] |
---|
| 422 | |
---|
| 423 | SideEffects [] |
---|
| 424 | |
---|
| 425 | ******************************************************************************/ |
---|
| 426 | static int |
---|
| 427 | CommandEcho( |
---|
| 428 | Hrc_Manager_t ** hmgr, |
---|
| 429 | int argc, |
---|
| 430 | char ** argv) |
---|
| 431 | { |
---|
| 432 | int i; |
---|
| 433 | int c; |
---|
| 434 | |
---|
| 435 | util_getopt_reset(); |
---|
| 436 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
| 437 | switch(c) { |
---|
| 438 | case 'h': |
---|
| 439 | goto usage; |
---|
| 440 | default: |
---|
| 441 | goto usage; |
---|
| 442 | } |
---|
| 443 | } |
---|
| 444 | |
---|
| 445 | for(i = 1; i < argc; i++) { |
---|
| 446 | (void) fprintf(vis_stdout, "%s ", argv[i]); |
---|
| 447 | } |
---|
| 448 | (void) fprintf(vis_stdout, "\n"); |
---|
| 449 | return 0; |
---|
| 450 | |
---|
| 451 | usage: |
---|
| 452 | (void) fprintf(vis_stderr, "usage: echo [-h] string \n"); |
---|
| 453 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 454 | return (1); |
---|
| 455 | } |
---|
| 456 | |
---|
| 457 | /**Function******************************************************************** |
---|
| 458 | |
---|
| 459 | Synopsis [Implements the set_bdd_parameters command.] |
---|
| 460 | |
---|
| 461 | SideEffects [] |
---|
| 462 | |
---|
| 463 | CommandName [set_bdd_parameters] |
---|
| 464 | |
---|
| 465 | CommandSynopsis [Creates a table with the value of all the flags currently |
---|
| 466 | active in VIS and calls the function bdd_set_parameters with the manager of |
---|
| 467 | the current place in the hierarchy and the table.] |
---|
| 468 | |
---|
| 469 | CommandArguments [\[-h\]\[-s\]] |
---|
| 470 | |
---|
| 471 | CommandDescription [The command obtains the bdd manager of the current point |
---|
| 472 | in the hierarchy. Given this manager and the set of pairs (variable,value) of |
---|
| 473 | the VIS environment, the function sets specific BDD parameters to the given |
---|
| 474 | values. This command works in conjunction with print_bdd_stats.<p> |
---|
| 475 | |
---|
| 476 | Print_bdd_stats first prints a report of the parameters and statistics of the |
---|
| 477 | current bdd_manager. By using the command "set", the user may modify the |
---|
| 478 | value of any of the parameters of the underlying bdd package. The way to do |
---|
| 479 | it is by setting a value in the variable <tt>BDD.parameter name</tt> where |
---|
| 480 | <tt>parameter name<\tt> is the name of the parameter exactly as printed by |
---|
| 481 | the print_bdd_stats command. In order to "re-program" the underlying bdd |
---|
| 482 | package this command must be invoked.<p> |
---|
| 483 | |
---|
| 484 | Command options:<p> |
---|
| 485 | |
---|
| 486 | <dl> |
---|
| 487 | |
---|
| 488 | <dt> -h |
---|
| 489 | <dd> Print the command usage. |
---|
| 490 | |
---|
| 491 | <dt> -s |
---|
| 492 | <dd> Print the bdd parameter and statistics after the modification. |
---|
| 493 | |
---|
| 494 | </dl> |
---|
| 495 | ] |
---|
| 496 | |
---|
| 497 | ******************************************************************************/ |
---|
| 498 | static int |
---|
| 499 | CommandSetBddParameters( |
---|
| 500 | Hrc_Manager_t ** hmgr, |
---|
| 501 | int argc, |
---|
| 502 | char ** argv) |
---|
| 503 | { |
---|
| 504 | Ntk_Network_t *network; |
---|
| 505 | boolean showAfter; |
---|
| 506 | int c; |
---|
| 507 | |
---|
| 508 | showAfter = FALSE; |
---|
| 509 | network = Ntk_HrcManagerReadCurrentNetwork(*hmgr); |
---|
| 510 | |
---|
| 511 | /* |
---|
| 512 | * Parse the command line. |
---|
| 513 | */ |
---|
| 514 | util_getopt_reset(); |
---|
| 515 | while ((c = util_getopt(argc, argv, "hs")) != EOF) { |
---|
| 516 | switch (c) { |
---|
| 517 | case 'h': |
---|
| 518 | goto usage; |
---|
| 519 | case 's': |
---|
| 520 | showAfter = TRUE; |
---|
| 521 | break; |
---|
| 522 | default: |
---|
| 523 | goto usage; |
---|
| 524 | } |
---|
| 525 | } |
---|
| 526 | |
---|
| 527 | /* flatten_hierarchy and static_order must have been invoked already. */ |
---|
| 528 | if (network == NIL(Ntk_Network_t)) { |
---|
| 529 | return 1; |
---|
| 530 | } |
---|
| 531 | if (!Ntk_NetworkReadMddManager(network)) { |
---|
| 532 | (void) fprintf(vis_stderr, "The MDD variables have not been ordered. "); |
---|
| 533 | (void) fprintf(vis_stderr, "Use static_order.\n"); |
---|
| 534 | return 1; |
---|
| 535 | } |
---|
| 536 | |
---|
| 537 | /* Create the table of variable->value */ |
---|
| 538 | bdd_set_parameters(Ntk_NetworkReadMddManager(network), cmdFlagTable, |
---|
| 539 | vis_stdout); |
---|
| 540 | |
---|
| 541 | if (showAfter) { |
---|
| 542 | bdd_print_stats(Ntk_NetworkReadMddManager(network), vis_stdout); |
---|
| 543 | } |
---|
| 544 | |
---|
| 545 | return 0; /* Everything okay */ |
---|
| 546 | |
---|
| 547 | usage: |
---|
| 548 | (void) fprintf(vis_stderr, "usage: set_bdd_parameters [-h] [-s]\n"); |
---|
| 549 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
| 550 | (void) fprintf(vis_stderr, " -s print also the bdd statistics\n"); |
---|
| 551 | |
---|
| 552 | return 1; |
---|
| 553 | } |
---|
| 554 | |
---|
| 555 | /**Function******************************************************************** |
---|
| 556 | |
---|
| 557 | Synopsis [Implements the _memory_profile command.] |
---|
| 558 | |
---|
| 559 | CommandName [_memory_profile] |
---|
| 560 | |
---|
| 561 | CommandSynopsis [It shows the amount of memory used by every pacakge.] |
---|
| 562 | |
---|
| 563 | CommandArguments [\[-f <filename>\] \[-h\] \[-p\] \[-u <units>\]] |
---|
| 564 | |
---|
| 565 | CommandDescription [This command intregrates the output from purify with a |
---|
| 566 | function map generated by a perlscript plus another perlscript to generate a |
---|
| 567 | memory profile of vis.<p> |
---|
| 568 | |
---|
| 569 | This command relies on the output of purify to a file to call the script |
---|
| 570 | "memoryaccount" and produce a summary of how much memory has been allocated |
---|
| 571 | by each package. Although this command may appear simple it requires the |
---|
| 572 | interaction of two scripts and three files, so special care should be taken |
---|
| 573 | when attempting to modify it.<p> |
---|
| 574 | |
---|
| 575 | Here is the way it works. The code in this command is conditionally compiled |
---|
| 576 | depending on the definition of the symbol <tt>PURIFY</tt>. If the symbol is |
---|
| 577 | not defined, the program prints a message notifying that the command is not |
---|
| 578 | operative in this executable. If <tt>PURIFY</tt> has been defined, there are |
---|
| 579 | certain things that are assumed. The executable has been linked with |
---|
| 580 | purify. The output of purify is being redirected to a file with name |
---|
| 581 | <tt>purify.log</tt>. The perl script <tt>memoryaccount</tt> is in |
---|
| 582 | <tt>$VIS/common/share</tt> and it is executable. There exists a file mapping |
---|
| 583 | function names to packages in the same place whose name is <tt>.fmap</tt>.<p> |
---|
| 584 | |
---|
| 585 | The command then calls <tt>purify_all_inuse()</tt> to force purify to dump to |
---|
| 586 | the file <tt>purify.log</tt> the information about the memory that is |
---|
| 587 | currently visible to the program. This memory is not the total memory |
---|
| 588 | allocated by the program since there may be leaked memory that is no longer |
---|
| 589 | accessible. A temporary file is created and the script <tt>memoryaccount</tt> |
---|
| 590 | is called to analyze the file <tt>purify.log</tt> and write in the temporary |
---|
| 591 | file the memory profile obtained from it. Once the script is done, the |
---|
| 592 | temporary file is dumped to <tt>vis_stdout</tt> and deleted.<p> |
---|
| 593 | |
---|
| 594 | Since most of the computation in this command is done by the pearlscript |
---|
| 595 | <tt>memoryaccount</tt>, for more information please refer to the message |
---|
| 596 | printed when the script is invoked with the option <tt>-h</tt>. |
---|
| 597 | |
---|
| 598 | Command options:<p> |
---|
| 599 | |
---|
| 600 | <dl> |
---|
| 601 | <dt> -f <filename> |
---|
| 602 | <dd> File to read the dump from. The default is purify.log. This option |
---|
| 603 | should be used if and only if the option <tt>-log-file</tt> has been used at |
---|
| 604 | the linking stage when building the executable. |
---|
| 605 | <dt> -h |
---|
| 606 | <dd> Print the command usage. |
---|
| 607 | <dt> -p |
---|
| 608 | <dd> Print also the packages that did not allocated any visible memory |
---|
| 609 | <dt> -u <units> |
---|
| 610 | <dd> Units to print the memory usage in. It may be "b" for |
---|
| 611 | bytes, "k" for kilobytes, "m" for megabytes and "g" for gigabytes. The default |
---|
| 612 | is bytes. |
---|
| 613 | </dl> |
---|
| 614 | ] |
---|
| 615 | |
---|
| 616 | SideEffects [] |
---|
| 617 | |
---|
| 618 | ******************************************************************************/ |
---|
| 619 | static int |
---|
| 620 | CommandMemoryProfile( |
---|
| 621 | Hrc_Manager_t ** hmgr, |
---|
| 622 | int argc, |
---|
| 623 | char ** argv) |
---|
| 624 | { |
---|
| 625 | |
---|
| 626 | int c; |
---|
| 627 | char options[128]; |
---|
| 628 | #ifdef PURIFY |
---|
| 629 | char tmpFileName[128]; |
---|
| 630 | FILE *fp; |
---|
| 631 | char command[256]; |
---|
| 632 | char *visDirectoryName; |
---|
| 633 | int systemStatus; |
---|
| 634 | #endif |
---|
| 635 | |
---|
| 636 | /* |
---|
| 637 | * Parse command line options. |
---|
| 638 | */ |
---|
| 639 | options[0] = 0; |
---|
| 640 | util_getopt_reset(); |
---|
| 641 | while ((c = util_getopt(argc, argv, "f:hpu:")) != EOF) { |
---|
| 642 | switch(c) { |
---|
| 643 | case 'f': |
---|
| 644 | strcat(options, " -f "); |
---|
| 645 | strcat(options, util_optarg); |
---|
| 646 | break; |
---|
| 647 | case 'h': |
---|
| 648 | goto usage; |
---|
| 649 | case 'p': |
---|
| 650 | strcat(options, " -p "); |
---|
| 651 | break; |
---|
| 652 | case 'u': |
---|
| 653 | strcat(options, " -u "); |
---|
| 654 | strcat(options, util_optarg); |
---|
| 655 | break; |
---|
| 656 | default: |
---|
| 657 | goto usage; |
---|
| 658 | } |
---|
| 659 | } |
---|
| 660 | |
---|
| 661 | |
---|
| 662 | #ifdef PURIFY |
---|
| 663 | /* Flag to remember that a file has been created by purify */ |
---|
| 664 | fileCreated = TRUE; |
---|
| 665 | |
---|
| 666 | /* Obtain the name of a temporary file */ |
---|
| 667 | tmpnam(tmpFileName); |
---|
| 668 | |
---|
| 669 | /* Kick purify to dump the data in the file */ |
---|
| 670 | purify_all_inuse(); |
---|
| 671 | |
---|
| 672 | /* Obtain the path to the perl script */ |
---|
| 673 | visDirectoryName = Vm_VisObtainLibrary(); |
---|
| 674 | |
---|
| 675 | /* Prepare the string to be sent to a shell */ |
---|
| 676 | (void)sprintf(command, "%s/memoryaccount %s %s/.fmap ./.fmap >%s", |
---|
| 677 | visDirectoryName, options, visDirectoryName, |
---|
| 678 | tmpFileName); |
---|
| 679 | |
---|
| 680 | /* Effectively execute the perlscript */ |
---|
| 681 | systemStatus = system(command); |
---|
| 682 | if (systemStatus != 0) { |
---|
| 683 | return 1; |
---|
| 684 | } |
---|
| 685 | |
---|
| 686 | fp = Cmd_FileOpen(tmpFileName, "r", NIL(char *), 1); |
---|
| 687 | |
---|
| 688 | /* Check if the open has been successful */ |
---|
| 689 | if (fp == NIL(FILE)) { |
---|
| 690 | (void) fprintf(vis_stderr, "** cmd error: File %s was not found\n", tmpFileName); |
---|
| 691 | return 1; |
---|
| 692 | } |
---|
| 693 | |
---|
| 694 | /* Dump the contents of the result file in vis_stdout */ |
---|
| 695 | while(fgets(command, 128, fp) != NIL(char)) { |
---|
| 696 | (void) fprintf(vis_stdout, "%s", command); |
---|
| 697 | } |
---|
| 698 | fclose(fp); |
---|
| 699 | |
---|
| 700 | /* Remove the temporary file */ |
---|
| 701 | #if HAVE_UNLINK |
---|
| 702 | unlink(tmpFileName); |
---|
| 703 | #endif |
---|
| 704 | #else |
---|
| 705 | (void) fprintf(vis_stderr, "** cmd error: Command not available: Vis has not been "); |
---|
| 706 | (void) fprintf(vis_stderr, "compiled with purify.\n"); |
---|
| 707 | #endif |
---|
| 708 | |
---|
| 709 | return 0; /* normal exit */ |
---|
| 710 | |
---|
| 711 | usage: |
---|
| 712 | (void) fprintf(vis_stderr, "usage: _memory_profile [-f <filename>] [-h] "); |
---|
| 713 | (void) fprintf(vis_stderr, "[-p] [-u <units>] <filenames>\n"); |
---|
| 714 | (void) fprintf(vis_stderr, " -f <file>\tFile to read the purify dump"); |
---|
| 715 | (void) fprintf(vis_stderr, " from. The default is purify.log\n"); |
---|
| 716 | (void) fprintf(vis_stderr, " -h\t\tprint the command usage\n"); |
---|
| 717 | (void) fprintf(vis_stderr, " -p\t\tPrint also the packages that do not "); |
---|
| 718 | (void) fprintf(vis_stderr, " allocate any memory\n"); |
---|
| 719 | (void) fprintf(vis_stderr, " -u <units>\tUnits to print the memory usage"); |
---|
| 720 | (void) fprintf(vis_stderr, " in. It may be b for bytes\n"); |
---|
| 721 | (void) fprintf(vis_stderr, " \t\tk for kilobytes, m for megabytes and "); |
---|
| 722 | (void) fprintf(vis_stderr, "g for gigabutes.\n"); |
---|
| 723 | return 1; /* error exit */ |
---|
| 724 | } |
---|
| 725 | |
---|
| 726 | |
---|
| 727 | /**Function******************************************************************** |
---|
| 728 | |
---|
| 729 | Synopsis [Implements the quit command.] |
---|
| 730 | |
---|
| 731 | Description [A return value of -1 indicates a quick quit, -2 return frees |
---|
| 732 | the memory.] |
---|
| 733 | |
---|
| 734 | CommandName [quit] |
---|
| 735 | CommandSynopsis [exit VIS] |
---|
| 736 | CommandArguments [\[-h\] \[-s\]] |
---|
| 737 | CommandDescription [Stops the program. Does not save the current network |
---|
| 738 | before exiting.<p> |
---|
| 739 | Command options:<p> |
---|
| 740 | <dl><dt> -h |
---|
| 741 | <dd> Print the command usage. |
---|
| 742 | </dl> |
---|
| 743 | <dl><dt> -s |
---|
| 744 | <dd> Free all the memory before quitting. |
---|
| 745 | This is slower, and is used for finding memory leaks. |
---|
| 746 | </dl> |
---|
| 747 | ] |
---|
| 748 | |
---|
| 749 | SideEffects [] |
---|
| 750 | |
---|
| 751 | ******************************************************************************/ |
---|
| 752 | static int |
---|
| 753 | CommandQuit( |
---|
| 754 | Hrc_Manager_t ** hmgr, |
---|
| 755 | int argc, |
---|
| 756 | char ** argv) |
---|
| 757 | { |
---|
| 758 | int c; |
---|
| 759 | |
---|
| 760 | util_getopt_reset(); |
---|
| 761 | while ((c = util_getopt(argc,argv,"hs")) != EOF){ |
---|
| 762 | switch(c){ |
---|
| 763 | case 'h': |
---|
| 764 | goto usage; |
---|
| 765 | case 's': |
---|
| 766 | return -2; |
---|
| 767 | default: |
---|
| 768 | goto usage; |
---|
| 769 | } |
---|
| 770 | } |
---|
| 771 | |
---|
| 772 | if ( argc != util_optind){ |
---|
| 773 | goto usage; |
---|
| 774 | } |
---|
| 775 | return -1; |
---|
| 776 | |
---|
| 777 | usage: |
---|
| 778 | (void)fprintf(vis_stderr, "usage: quit [-h] [-s]\n"); |
---|
| 779 | (void)fprintf(vis_stderr, " -h print the command usage\n"); |
---|
| 780 | (void)fprintf(vis_stderr, " -s frees all the memory before quitting\n"); |
---|
| 781 | return 1; |
---|
| 782 | } |
---|
| 783 | |
---|
| 784 | /**Function******************************************************************** |
---|
| 785 | |
---|
| 786 | Synopsis [Implements the usage command.] |
---|
| 787 | |
---|
| 788 | CommandName [usage] |
---|
| 789 | CommandSynopsis [provide a dump of process statistics] |
---|
| 790 | CommandArguments [\[-h\]] |
---|
| 791 | CommandDescription [Prints a formatted dump of processor-specific usage |
---|
| 792 | statistics. For Berkeley Unix, this includes all of the information in the |
---|
| 793 | getrusage() structure.<p> |
---|
| 794 | Command options:<p> |
---|
| 795 | <dl><dt> -h |
---|
| 796 | <dd> Print the command usage. |
---|
| 797 | </dl> ] |
---|
| 798 | |
---|
| 799 | SideEffects [] |
---|
| 800 | |
---|
| 801 | ******************************************************************************/ |
---|
| 802 | static int |
---|
| 803 | CommandUsage( |
---|
| 804 | Hrc_Manager_t ** hmgr, |
---|
| 805 | int argc, |
---|
| 806 | char ** argv) |
---|
| 807 | { |
---|
| 808 | int c; |
---|
| 809 | |
---|
| 810 | util_getopt_reset(); |
---|
| 811 | while ((c = util_getopt(argc,argv,"h")) != EOF){ |
---|
| 812 | switch(c){ |
---|
| 813 | case 'h': |
---|
| 814 | goto usage; |
---|
| 815 | default: |
---|
| 816 | goto usage; |
---|
| 817 | } |
---|
| 818 | } |
---|
| 819 | |
---|
| 820 | if (argc != util_optind){ |
---|
| 821 | goto usage; |
---|
| 822 | } |
---|
| 823 | util_print_cpu_stats(vis_stdout); |
---|
| 824 | return 0; |
---|
| 825 | |
---|
| 826 | usage: |
---|
| 827 | (void) fprintf(vis_stderr, "usage: usage [-h]\n"); |
---|
| 828 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 829 | return 1; |
---|
| 830 | } |
---|
| 831 | |
---|
| 832 | /**Function******************************************************************** |
---|
| 833 | |
---|
| 834 | Synopsis [Implements the which command.] |
---|
| 835 | |
---|
| 836 | CommandName [which] |
---|
| 837 | CommandSynopsis [look for a file called name] |
---|
| 838 | CommandArguments [\[-h\] <file_name>] |
---|
| 839 | CommandDescription [Looks for a file in a set of directories |
---|
| 840 | which includes the current directory as well as those in the VIS path. |
---|
| 841 | If it finds it, it reports the path. |
---|
| 842 | The path is specified through the "set open_path" command in the .visrc.<p> |
---|
| 843 | Command options:<p> |
---|
| 844 | <dl><dt> -h |
---|
| 845 | <dd> Print the command usage. |
---|
| 846 | </dl> |
---|
| 847 | <dl><dt> <file_name> |
---|
| 848 | <dd> File to be searched |
---|
| 849 | </dl>] |
---|
| 850 | |
---|
| 851 | SideEffects [] |
---|
| 852 | |
---|
| 853 | SeeAlso [set] |
---|
| 854 | |
---|
| 855 | ******************************************************************************/ |
---|
| 856 | static int |
---|
| 857 | CommandWhich( |
---|
| 858 | Hrc_Manager_t ** hmgr, |
---|
| 859 | int argc, |
---|
| 860 | char ** argv) |
---|
| 861 | { |
---|
| 862 | FILE *fp; |
---|
| 863 | char *filename; |
---|
| 864 | int c; |
---|
| 865 | |
---|
| 866 | util_getopt_reset(); |
---|
| 867 | while ((c = util_getopt(argc,argv,"h")) != EOF){ |
---|
| 868 | switch(c){ |
---|
| 869 | case 'h': |
---|
| 870 | goto usage; |
---|
| 871 | default: |
---|
| 872 | goto usage; |
---|
| 873 | } |
---|
| 874 | } |
---|
| 875 | |
---|
| 876 | if (argc-1 != util_optind){ |
---|
| 877 | goto usage; |
---|
| 878 | } |
---|
| 879 | |
---|
| 880 | fp = Cmd_FileOpen(argv[1], "r", &filename, 0); |
---|
| 881 | if (fp != 0) { |
---|
| 882 | (void) fprintf(vis_stdout, "%s\n", filename); |
---|
| 883 | (void) fclose(fp); |
---|
| 884 | } |
---|
| 885 | FREE(filename); |
---|
| 886 | return 0; |
---|
| 887 | |
---|
| 888 | usage: |
---|
| 889 | (void)fprintf(vis_stderr,"usage: which [-h] file_name\n"); |
---|
| 890 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 891 | return 1; |
---|
| 892 | } |
---|
| 893 | |
---|
| 894 | |
---|
| 895 | /**Function******************************************************************** |
---|
| 896 | |
---|
| 897 | Synopsis [Implements the history command.] |
---|
| 898 | |
---|
| 899 | CommandName [history] |
---|
| 900 | |
---|
| 901 | CommandSynopsis [list previous commands and their event numbers] |
---|
| 902 | |
---|
| 903 | CommandArguments [\[-h\] \[<num>\]] |
---|
| 904 | |
---|
| 905 | CommandDescription [Lists previous commands and their event numbers. |
---|
| 906 | This is a UNIX-like history mechanism inside the VIS shell.<p> |
---|
| 907 | Command options:<p> |
---|
| 908 | <dl><dt> -h |
---|
| 909 | <dd> Print the command usage. |
---|
| 910 | </dl> |
---|
| 911 | <dl><dt> <num> |
---|
| 912 | <dd> Lists the last <num> events. Lists the last |
---|
| 913 | 30 events if <num> is not specified. |
---|
| 914 | </dl><p> |
---|
| 915 | |
---|
| 916 | History Substitution:<p> |
---|
| 917 | |
---|
| 918 | The history substitution mechanism is a simpler version of the csh history |
---|
| 919 | substitution mechanism. It enables you to reuse words from previously typed |
---|
| 920 | commands.<p> |
---|
| 921 | |
---|
| 922 | The default history substitution character is the `%' (`!' is default for |
---|
| 923 | shell escapes, and `#' marks the beginning of a comment). This can be changed |
---|
| 924 | using the "set" command. In this description '%' is used as the history_char. |
---|
| 925 | The `%' can appear anywhere in a line. A line containing a history |
---|
| 926 | substitution is echoed to the screen after the substitution takes place. |
---|
| 927 | `%' can be preceded by a `\\' in order to escape the substitution, |
---|
| 928 | for example, to enter a `%' into an alias or to set the prompt.<br><p> |
---|
| 929 | |
---|
| 930 | Each valid line typed at the prompt is saved. If the "history" variable |
---|
| 931 | is set (see help page for "set"), each line is also echoed to the history |
---|
| 932 | file. You can use the "history" command to list the previously typed |
---|
| 933 | commands. <p> |
---|
| 934 | |
---|
| 935 | Substitutions: <p> |
---|
| 936 | |
---|
| 937 | At any point in a line these history substitutions are |
---|
| 938 | available.<p> |
---|
| 939 | <dl><dt>%:0 <dd> Initial word of last command.</dl> |
---|
| 940 | <dl><dt>%:n <dd> n-th argument of last command.</dl> |
---|
| 941 | <dl><dt>%$ <dd> Last argument of last command.</dl> |
---|
| 942 | <dl><dt>%* <dd> All but initial word of last command.</dl> |
---|
| 943 | |
---|
| 944 | <dl><dt>%% <dd> Last command.</dl> |
---|
| 945 | <dl><dt>%stuf <dd> Last command beginning with "stuf".</dl> |
---|
| 946 | <dl><dt>%n <dd> Repeat the n-th command.</dl> |
---|
| 947 | <dl><dt>%-n <dd> Repeat the n-th previous command.</dl> |
---|
| 948 | <dl><dt>^old^new <dd> Replace "old" with "new" in previous command. |
---|
| 949 | Trailing spaces are significant during substitution. |
---|
| 950 | Initial spaces are not significant.</dl> ] |
---|
| 951 | |
---|
| 952 | SideEffects [] |
---|
| 953 | |
---|
| 954 | SeeAlso [set] |
---|
| 955 | |
---|
| 956 | ******************************************************************************/ |
---|
| 957 | static int |
---|
| 958 | CommandHistory( |
---|
| 959 | Hrc_Manager_t ** hmgr, |
---|
| 960 | int argc, |
---|
| 961 | char ** argv) |
---|
| 962 | { |
---|
| 963 | int i, num, lineno; |
---|
| 964 | int size; |
---|
| 965 | int c; |
---|
| 966 | |
---|
| 967 | util_getopt_reset(); |
---|
| 968 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
| 969 | switch(c) { |
---|
| 970 | case 'h': |
---|
| 971 | goto usage; |
---|
| 972 | default: |
---|
| 973 | goto usage; |
---|
| 974 | } |
---|
| 975 | } |
---|
| 976 | |
---|
| 977 | if (argc > 3) { |
---|
| 978 | goto usage; |
---|
| 979 | } |
---|
| 980 | num = 30; |
---|
| 981 | lineno = 1; |
---|
| 982 | for (i = 1; i < argc; i++) { |
---|
| 983 | if (argv[i][0] == '-') { |
---|
| 984 | if (argv[i][1] == 'h') { |
---|
| 985 | lineno = 0; |
---|
| 986 | } |
---|
| 987 | else { |
---|
| 988 | goto usage; |
---|
| 989 | } |
---|
| 990 | } |
---|
| 991 | else { |
---|
| 992 | num = atoi(argv[i]); |
---|
| 993 | if (num <= 0) { |
---|
| 994 | goto usage; |
---|
| 995 | } |
---|
| 996 | } |
---|
| 997 | } |
---|
| 998 | size = array_n(vm_commandHistoryArray); |
---|
| 999 | num = (num < size) ? num : size; |
---|
| 1000 | for (i = size - num; i < size; i++) { |
---|
| 1001 | if (lineno != 0) { |
---|
| 1002 | (void) fprintf(vis_stdout, "%d\t", i + 1); |
---|
| 1003 | } |
---|
| 1004 | (void) fprintf(vis_stdout, "%s\n", array_fetch(char *, vm_commandHistoryArray, i)); |
---|
| 1005 | } |
---|
| 1006 | return(0); |
---|
| 1007 | |
---|
| 1008 | usage: |
---|
| 1009 | (void) fprintf(vis_stderr, "usage: history [-h] [num]\n"); |
---|
| 1010 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 1011 | (void) fprintf(vis_stderr, " num \t\tprint the last num commands\n"); |
---|
| 1012 | return(1); |
---|
| 1013 | } |
---|
| 1014 | |
---|
| 1015 | |
---|
| 1016 | |
---|
| 1017 | |
---|
| 1018 | /**Function******************************************************************** |
---|
| 1019 | |
---|
| 1020 | Synopsis [Implements the alias command.] |
---|
| 1021 | |
---|
| 1022 | CommandName [alias] |
---|
| 1023 | |
---|
| 1024 | CommandSynopsis [provide an alias for a command] |
---|
| 1025 | |
---|
| 1026 | CommandArguments [\[-h\] \[<name> \[<string>\]\]] |
---|
| 1027 | |
---|
| 1028 | CommandDescription [The "alias" command, if given no arguments, will print |
---|
| 1029 | the definition of all current aliases. <p> |
---|
| 1030 | |
---|
| 1031 | Given a single argument, it will print the definition of that alias (if any). |
---|
| 1032 | |
---|
| 1033 | Given two arguments, the keyword "name" becomes an alias for |
---|
| 1034 | the command string "string", replacing any other alias with the |
---|
| 1035 | same name.<p> |
---|
| 1036 | |
---|
| 1037 | Command options: |
---|
| 1038 | <dl><dt> -h |
---|
| 1039 | <dd> Print the command usage. |
---|
| 1040 | </dl> |
---|
| 1041 | <dl><dt> <name> |
---|
| 1042 | <dd> Alias |
---|
| 1043 | </dl> |
---|
| 1044 | <dl><dt> <string> |
---|
| 1045 | <dd> Command string |
---|
| 1046 | </dl> |
---|
| 1047 | |
---|
| 1048 | It is possible to create aliases that take arguments by using the history |
---|
| 1049 | substitution mechanism. To protect the history substitution character `%' |
---|
| 1050 | from immediate expansion, it must be preceded by a `\\' when entering the |
---|
| 1051 | alias. <p> |
---|
| 1052 | |
---|
| 1053 | For example:<p> |
---|
| 1054 | <pre> |
---|
| 1055 | vis> alias read read_\\%:1 \\%:2.\\%:1 |
---|
| 1056 | vis> read blif lion |
---|
| 1057 | </pre> |
---|
| 1058 | will create an alias `read', execute "read_blif lion.blif". <p> |
---|
| 1059 | |
---|
| 1060 | And...<p> |
---|
| 1061 | <pre> |
---|
| 1062 | vis> alias echo2 "echo Hi ; echo \\%* !" |
---|
| 1063 | vis> echo2 happy birthday |
---|
| 1064 | </pre> |
---|
| 1065 | will print:<p> |
---|
| 1066 | <pre> |
---|
| 1067 | Hi |
---|
| 1068 | happy birthday ! |
---|
| 1069 | </pre> |
---|
| 1070 | |
---|
| 1071 | CAVEAT: Currently there is no check to see if there is a circular |
---|
| 1072 | dependency in the alias definition. e.g.<p> |
---|
| 1073 | |
---|
| 1074 | <pre> |
---|
| 1075 | vis> alias foo "print_network_stats; print_network; foo" |
---|
| 1076 | </pre> |
---|
| 1077 | |
---|
| 1078 | creates an alias which refers to itself. Executing the command "foo" will |
---|
| 1079 | result an infinite loop during which the commands "print_network_stats" |
---|
| 1080 | and "print_network" will be executed.<p> |
---|
| 1081 | |
---|
| 1082 | ] |
---|
| 1083 | |
---|
| 1084 | SideEffects [] |
---|
| 1085 | |
---|
| 1086 | SeeAlso [unalias] |
---|
| 1087 | |
---|
| 1088 | ******************************************************************************/ |
---|
| 1089 | static int |
---|
| 1090 | CommandAlias( |
---|
| 1091 | Hrc_Manager_t ** hmgr, |
---|
| 1092 | int argc, |
---|
| 1093 | char ** argv) |
---|
| 1094 | { |
---|
| 1095 | int i; |
---|
| 1096 | char *key, *value; |
---|
| 1097 | CmdAliasDescr_t *alias; |
---|
| 1098 | avl_generator *gen; |
---|
| 1099 | int status; |
---|
| 1100 | int c; |
---|
| 1101 | |
---|
| 1102 | util_getopt_reset(); |
---|
| 1103 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
| 1104 | switch(c) { |
---|
| 1105 | case 'h': |
---|
| 1106 | goto usage; |
---|
| 1107 | default: |
---|
| 1108 | goto usage; |
---|
| 1109 | } |
---|
| 1110 | } |
---|
| 1111 | |
---|
| 1112 | |
---|
| 1113 | if (argc == 1) { |
---|
| 1114 | avl_foreach_item(cmdAliasTable, gen, AVL_FORWARD, &key, &value) { |
---|
| 1115 | print_alias(value); |
---|
| 1116 | } |
---|
| 1117 | return 0; |
---|
| 1118 | |
---|
| 1119 | } |
---|
| 1120 | else if (argc == 2) { |
---|
| 1121 | if (avl_lookup(cmdAliasTable, argv[1], &value)) { |
---|
| 1122 | print_alias(value); |
---|
| 1123 | } |
---|
| 1124 | return 0; |
---|
| 1125 | } |
---|
| 1126 | |
---|
| 1127 | /* delete any existing alias */ |
---|
| 1128 | key = argv[1]; |
---|
| 1129 | if (avl_delete(cmdAliasTable, &key, &value)) { |
---|
| 1130 | CmdAliasFree(value); |
---|
| 1131 | } |
---|
| 1132 | |
---|
| 1133 | alias = ALLOC(CmdAliasDescr_t, 1); |
---|
| 1134 | alias->name = util_strsav(argv[1]); |
---|
| 1135 | alias->argc = argc - 2; |
---|
| 1136 | alias->argv = ALLOC(char *, alias->argc); |
---|
| 1137 | for(i = 2; i < argc; i++) { |
---|
| 1138 | alias->argv[i-2] = util_strsav(argv[i]); |
---|
| 1139 | } |
---|
| 1140 | status = avl_insert(cmdAliasTable, alias->name, (char *) alias); |
---|
| 1141 | assert(!status); /* error here in SIS version, TRS, 8/4/95 */ |
---|
| 1142 | return 0; |
---|
| 1143 | |
---|
| 1144 | usage: |
---|
| 1145 | (void) fprintf(vis_stderr, "usage: alias [-h] [command [string]]\n"); |
---|
| 1146 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 1147 | return (1); |
---|
| 1148 | } |
---|
| 1149 | |
---|
| 1150 | |
---|
| 1151 | /**Function******************************************************************** |
---|
| 1152 | |
---|
| 1153 | Synopsis [Implements the unalias command.] |
---|
| 1154 | |
---|
| 1155 | CommandName [unalias] |
---|
| 1156 | CommandSynopsis [remove the definition of an alias.] |
---|
| 1157 | CommandArguments [\[-h\] <alias_names>] |
---|
| 1158 | CommandDescription [Removes the definition of an alias.<p> |
---|
| 1159 | Command options:<p> |
---|
| 1160 | <dl><dt> -h |
---|
| 1161 | <dd> Print the command usage. |
---|
| 1162 | </dl> |
---|
| 1163 | <dl><dt> <alias_names> |
---|
| 1164 | <dd> Aliases to be removed |
---|
| 1165 | </dl>] |
---|
| 1166 | |
---|
| 1167 | SideEffects [] |
---|
| 1168 | |
---|
| 1169 | SeeAlso [alias] |
---|
| 1170 | |
---|
| 1171 | ******************************************************************************/ |
---|
| 1172 | static int |
---|
| 1173 | CommandUnalias( |
---|
| 1174 | Hrc_Manager_t ** hmgr, |
---|
| 1175 | int argc, |
---|
| 1176 | char ** argv) |
---|
| 1177 | { |
---|
| 1178 | int i; |
---|
| 1179 | char *key, *value; |
---|
| 1180 | int c; |
---|
| 1181 | |
---|
| 1182 | util_getopt_reset(); |
---|
| 1183 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
| 1184 | switch(c) { |
---|
| 1185 | case 'h': |
---|
| 1186 | goto usage; |
---|
| 1187 | default: |
---|
| 1188 | goto usage; |
---|
| 1189 | } |
---|
| 1190 | } |
---|
| 1191 | |
---|
| 1192 | if (argc < 2) { |
---|
| 1193 | goto usage; |
---|
| 1194 | } |
---|
| 1195 | |
---|
| 1196 | for(i = 1; i < argc; i++) { |
---|
| 1197 | key = argv[i]; |
---|
| 1198 | if (avl_delete(cmdAliasTable, &key, &value)) { |
---|
| 1199 | CmdAliasFree(value); |
---|
| 1200 | } |
---|
| 1201 | } |
---|
| 1202 | return 0; |
---|
| 1203 | |
---|
| 1204 | usage: |
---|
| 1205 | (void) fprintf(vis_stderr, "usage: unalias [-h] alias_names\n"); |
---|
| 1206 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 1207 | return 1; |
---|
| 1208 | } |
---|
| 1209 | |
---|
| 1210 | |
---|
| 1211 | /**Function******************************************************************** |
---|
| 1212 | |
---|
| 1213 | Synopsis [Implements the set command.] |
---|
| 1214 | |
---|
| 1215 | CommandName [set] |
---|
| 1216 | |
---|
| 1217 | CommandSynopsis [set an environment variable] |
---|
| 1218 | |
---|
| 1219 | CommandArguments [\[-h\] \[<name>\] \[<value>\]] |
---|
| 1220 | |
---|
| 1221 | CommandDescription [ A variable environment is maintained by the command |
---|
| 1222 | interpreter. |
---|
| 1223 | The "set" command sets a variable to a particular value, and the |
---|
| 1224 | "unset" command removes the definition of a variable. |
---|
| 1225 | If "set" is given no arguments, it prints the current value of all variables.<p> |
---|
| 1226 | |
---|
| 1227 | Command options:<p> |
---|
| 1228 | <dl> <dt> -h |
---|
| 1229 | <dd> Print the command usage. |
---|
| 1230 | </dl> |
---|
| 1231 | <dl> <dt> <name> |
---|
| 1232 | <dd> Variable name |
---|
| 1233 | </dl> |
---|
| 1234 | <dl> <dt> <value> |
---|
| 1235 | <dd> Value to be assigned to the variable. |
---|
| 1236 | </dl> |
---|
| 1237 | |
---|
| 1238 | <p> |
---|
| 1239 | Interpolation of variables is allowed when using the set command. The |
---|
| 1240 | variables are referred to with the prefix of '$'. So for example, the following |
---|
| 1241 | can be done to check the value of a set variable:<br> |
---|
| 1242 | <code> |
---|
| 1243 | vis> set foo bar <br> |
---|
| 1244 | vis> echo $foo <br> |
---|
| 1245 | bar <br> |
---|
| 1246 | </code> |
---|
| 1247 | |
---|
| 1248 | The last line "bar" will the output produced by vis.<p> |
---|
| 1249 | |
---|
| 1250 | Variables can be extended by using the character ':' to concatenate |
---|
| 1251 | values. For example : <br> |
---|
| 1252 | <code> |
---|
| 1253 | vis> set foo bar <br> |
---|
| 1254 | vis> set foo $foo:foobar <br> |
---|
| 1255 | vis> echo $foo <br> |
---|
| 1256 | bar:foobar <br> |
---|
| 1257 | </code> |
---|
| 1258 | The variable <code> foo </code> is extended with the value <code> |
---|
| 1259 | foobar </code>. <p> |
---|
| 1260 | |
---|
| 1261 | Whitespace characters may be present within quotes. However, variable |
---|
| 1262 | interpolation lays the restriction that the characters ':' and '/' may |
---|
| 1263 | not be used within quotes. This is to allow for recursive interpolation. |
---|
| 1264 | So for example, the following is allowed<br> |
---|
| 1265 | <code> |
---|
| 1266 | vis> set "foo bar" this <br> |
---|
| 1267 | vis> echo $"foo bar"<br> |
---|
| 1268 | this <br> |
---|
| 1269 | </code> |
---|
| 1270 | The last line will be the output produced by vis. <br> |
---|
| 1271 | But in the following, the value of the variable <code> foo/bar </code> |
---|
| 1272 | will not be interpreted correctly:<p> |
---|
| 1273 | <code> |
---|
| 1274 | vis> set "foo/bar" this <br> |
---|
| 1275 | vis> echo $"foo/bar" <br> |
---|
| 1276 | foo/bar <br> |
---|
| 1277 | </code> |
---|
| 1278 | If a variable is not set by the "set" command, then the variable is returned |
---|
| 1279 | unchanged. |
---|
| 1280 | <p> |
---|
| 1281 | |
---|
| 1282 | Different commands use environment information for different purposes. |
---|
| 1283 | The command interpreter makes use of the following parameters:<p> |
---|
| 1284 | |
---|
| 1285 | <dl> |
---|
| 1286 | <dt><b>autoexec</b> |
---|
| 1287 | <dd> Defines a command string to be automatically executed after every |
---|
| 1288 | command processed by the command interpreter. |
---|
| 1289 | This is useful for things like timing commands, or tracing the |
---|
| 1290 | progress of optimization. |
---|
| 1291 | </dl> |
---|
| 1292 | |
---|
| 1293 | |
---|
| 1294 | <dl><dt><b>open_path</b> |
---|
| 1295 | <dd> "open_path" (in analogy to the shell-variable PATH) is a list of |
---|
| 1296 | colon-separated strings giving directories to be searched whenever |
---|
| 1297 | a file is opened for read. Typically the current directory (.) is |
---|
| 1298 | first in this list. The standard system library (typically |
---|
| 1299 | $VIS_LIBRARY_PATH) is always implicitly appended to the current path. |
---|
| 1300 | This provides a convenient short-hand mechanism for reaching |
---|
| 1301 | standard library files. |
---|
| 1302 | </dl> |
---|
| 1303 | <dl><dt> <b>vis_stderr </b> |
---|
| 1304 | <dd> Standard error (normally stderr) can be re-directed to a file |
---|
| 1305 | by setting the variable vis_stderr. |
---|
| 1306 | </dl> |
---|
| 1307 | |
---|
| 1308 | <dl><dt> <b>vis_stdout</b> |
---|
| 1309 | <dd> Standard output (normally stdout) can be re-directed to a file |
---|
| 1310 | by setting the variable vis_stdout. |
---|
| 1311 | </dl> |
---|
| 1312 | |
---|
| 1313 | Building MDDs for the network makes use of following setting: |
---|
| 1314 | <dl><dt> <b>partition_method</b> |
---|
| 1315 | <dd> This parameter is used to select the method for creating the |
---|
| 1316 | partition. The vertices of a partition correspond to the |
---|
| 1317 | combinational inputs, combinational outputs, and any intermediate nodes used. Each vertex has a multi-valued |
---|
| 1318 | function (represented by MDDs) expressing the function of the corresponding |
---|
| 1319 | network node in terms of the partition vertices in its transitive fanin. |
---|
| 1320 | Hence, the MDDs of the partition represent a partial collapsing of the |
---|
| 1321 | network. The possible values of partition_method are: |
---|
| 1322 | <dl> |
---|
| 1323 | <dt> <b>inout</b> |
---|
| 1324 | <dd>Expresses the combinational outputs in terms of the |
---|
| 1325 | combinational inputs. This is the default partitioning method. |
---|
| 1326 | |
---|
| 1327 | <dt> <b>total</b> |
---|
| 1328 | <dd> The partition built is isomorphic to the combinational |
---|
| 1329 | part of the network. The function of each node is expressed in terms of its |
---|
| 1330 | immediate fanins. |
---|
| 1331 | |
---|
| 1332 | <dt> <b>frontier</b> |
---|
| 1333 | <dd> The partition built contains the combinational part of the |
---|
| 1334 | network as well as vertices corresponding to some intermediate |
---|
| 1335 | nodes. These vertices are generated to control the MDD sizes of the |
---|
| 1336 | combinational outputs. The number of intermediate variables can be |
---|
| 1337 | controlled by the parameter "partition_threshold". The method |
---|
| 1338 | "inout" and "total" are special cases of this method (corresponding |
---|
| 1339 | to a partition_threshold of infinity and 0 respectively). |
---|
| 1340 | |
---|
| 1341 | </dl> |
---|
| 1342 | </dl> |
---|
| 1343 | <dl><dt> <b>partition_threshold</b> |
---|
| 1344 | <dd> This parameter is used in |
---|
| 1345 | conjuction with the selection of "frontier" as partition method. This |
---|
| 1346 | determines the threshold at which a new MDD variable is created in |
---|
| 1347 | the partition. |
---|
| 1348 | </dl> |
---|
| 1349 | |
---|
| 1350 | Image computation makes use of following settings: |
---|
| 1351 | |
---|
| 1352 | <dl> |
---|
| 1353 | <dt><b>image_method</b> |
---|
| 1354 | <dd> The "image_method" parameter is used to control the image method used |
---|
| 1355 | in various symbolic analysis techniques. Currently, two image methods are |
---|
| 1356 | implemented. Use "set image_method <method>" to choose the appropriate |
---|
| 1357 | method. |
---|
| 1358 | |
---|
| 1359 | <dl> |
---|
| 1360 | <dt><b>monolithic</b> |
---|
| 1361 | <dd> This is the most naive approach possible. However, this method is not |
---|
| 1362 | suitable for circuits with more than 20 latches. |
---|
| 1363 | |
---|
| 1364 | <dt><b>tfm</b> |
---|
| 1365 | <dd> This is the pure transition function method. This method is supposed |
---|
| 1366 | not to be used in general fixpoint computations. Approximate traversal is |
---|
| 1367 | an application of this method. Basically this method is made as a part of |
---|
| 1368 | hybrid method. For more detailed options, see the help of |
---|
| 1369 | print_tfm_options command. |
---|
| 1370 | |
---|
| 1371 | <dt><b>hybrid</b> |
---|
| 1372 | <dd> This is a hybrid method combining transition relation and function |
---|
| 1373 | methods. Transition relation method is based on conjunction of partitioned |
---|
| 1374 | transition relation, whereas transition function method is based on |
---|
| 1375 | splitting on an input or output variable recursively. The hybrid method |
---|
| 1376 | choose either splitting or conjunction at each recursion dynamically using |
---|
| 1377 | the dependence matrix. For details, refer to the paper "To split or to |
---|
| 1378 | Conjoin: The Question in Image Computation" by In-Ho Moon, James Kukula, |
---|
| 1379 | Kavita Ravi, and Fabio Somenzi, DAC'00. Also for more detailed options, |
---|
| 1380 | see the help of print_hybrid_options command. |
---|
| 1381 | |
---|
| 1382 | <dt><b>iwls95</b> |
---|
| 1383 | <dd> This technique is based on the early variable quantification and |
---|
| 1384 | related heuristics of Ranjan, et al. "Efficient BDD Algorithms for FSM |
---|
| 1385 | Synthesis and Verification", IWLS 1995. First, from the given multivalued |
---|
| 1386 | functions, bit level relations are created. These relations are then |
---|
| 1387 | clustered based on the value of threshold value controlled by |
---|
| 1388 | <b>image_cluster_size</b> parameter. Next the relations are ordered for |
---|
| 1389 | early variable quantification. This ordering is controlled by the |
---|
| 1390 | parameters <b>image_W1, image_W2, image_W3,</b> and <b>image_W4</b>. |
---|
| 1391 | |
---|
| 1392 | <dt><b>mlp</b> |
---|
| 1393 | <dd> This technique is based on minimizing the variable lifetime |
---|
| 1394 | in the conjunctions of the partitioned transition relation. The |
---|
| 1395 | method is called MLP (Minimal Lifetime Permutation). For details, |
---|
| 1396 | refer to the paper "Border-Block Triangular Form and Conjunction Schedule |
---|
| 1397 | in Image Computation" by In-Ho Moon, Gary Hachtel, and Fabio Somenzi, |
---|
| 1398 | FMCAD'00. Also for more detailed options, see the help of |
---|
| 1399 | print_mlp_options command. |
---|
| 1400 | </dl> |
---|
| 1401 | |
---|
| 1402 | |
---|
| 1403 | <dt><b>image_farside_method</b> |
---|
| 1404 | <dd> This parameter is used in conjunction with the selection of |
---|
| 1405 | <b>iwls95</b>, <b>mlp</b>, or <b>linear</b> as the |
---|
| 1406 | <b>image_method</b>. When the value is 1, the compositional far |
---|
| 1407 | side image computation approach is enabled; when the value is 0, |
---|
| 1408 | this feature is disabled (default). |
---|
| 1409 | |
---|
| 1410 | <dt><b>image_cluster_size</b> |
---|
| 1411 | <dd> This parameter is used in conjunction with the selection of |
---|
| 1412 | <b>iwls95</b> as the <b>image_method</b>. The value of this parameter is |
---|
| 1413 | used as threshold value for creating clusters. The default value of this |
---|
| 1414 | parameter is 5000 which has been empirically proved to be an optimal value. |
---|
| 1415 | |
---|
| 1416 | <dt><b>image_W1, image_W2, image_W3, image_W4</b> |
---|
| 1417 | <dd> These parameters are used in conjunction with the selection of |
---|
| 1418 | <b>iwls95</b> as the <b>image_method</b>. They control the weights |
---|
| 1419 | associated with various factors in ordering the clusters. The default values |
---|
| 1420 | are 6, 1, 1, and 2 respectively. For a detailed description of these |
---|
| 1421 | parameters, please refer to the paper in IWLS'95 proceedings. |
---|
| 1422 | |
---|
| 1423 | <dt><b>image_verbosity</b> |
---|
| 1424 | <dd> Sets the verbosity mode (0 minimum to 4 maximum), for the image method |
---|
| 1425 | <b>iwls95</b>.<p> |
---|
| 1426 | |
---|
| 1427 | <dt>image_minimize_method <method> |
---|
| 1428 | <dd> Sets a minimization method to minimize the transition relation or an |
---|
| 1429 | image/preimage computaion with a set of dont-care states. <p> |
---|
| 1430 | Methods: |
---|
| 1431 | <code> 0 </code>: restrict (default). <p> |
---|
| 1432 | <code> 1 </code>: constrain <p> |
---|
| 1433 | <code> 2 </code>: compact (currently supported by only CUDD) <p> |
---|
| 1434 | <code> 3 </code>: squeeze (currently supported by only CUDD) <p> |
---|
| 1435 | |
---|
| 1436 | <dt>scc_method <method> |
---|
| 1437 | <dd> Sets the symbolic method to enumerate strongly connected components |
---|
| 1438 | (SCCs). Symbolic SCC enumeration is the core computation in LTL and |
---|
| 1439 | fair-CTL model checking. |
---|
| 1440 | <p> Methods: <code> lockstep </code>: the O(nlogn) time LockStep |
---|
| 1441 | algorithm (default). |
---|
| 1442 | <p> Methods: <code> linearstep </code>: the linear time symbolic |
---|
| 1443 | algorithm (default). |
---|
| 1444 | |
---|
| 1445 | </dl> ] |
---|
| 1446 | |
---|
| 1447 | SideEffects [] |
---|
| 1448 | |
---|
| 1449 | SeeAlso [unset] |
---|
| 1450 | |
---|
| 1451 | ******************************************************************************/ |
---|
| 1452 | static int |
---|
| 1453 | CommandSetVariable( |
---|
| 1454 | Hrc_Manager_t ** hmgr, |
---|
| 1455 | int argc, |
---|
| 1456 | char ** argv) |
---|
| 1457 | { |
---|
| 1458 | char *flag_value, *key, *value; |
---|
| 1459 | avl_generator *gen; |
---|
| 1460 | int c; |
---|
| 1461 | |
---|
| 1462 | util_getopt_reset(); |
---|
| 1463 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
| 1464 | switch(c) { |
---|
| 1465 | case 'h': |
---|
| 1466 | goto usage; |
---|
| 1467 | default: |
---|
| 1468 | goto usage; |
---|
| 1469 | } |
---|
| 1470 | } |
---|
| 1471 | if (argc == 0 || argc > 3) { |
---|
| 1472 | goto usage ; |
---|
| 1473 | } |
---|
| 1474 | else if (argc == 1) { |
---|
| 1475 | avl_foreach_item(cmdFlagTable, gen, AVL_FORWARD, &key, &value) { |
---|
| 1476 | (void) fprintf(vis_stdout, "%s\t%s\n", key, value); |
---|
| 1477 | } |
---|
| 1478 | return 0; |
---|
| 1479 | } |
---|
| 1480 | else { |
---|
| 1481 | key = argv[1]; |
---|
| 1482 | if (avl_delete(cmdFlagTable, &key, &value)) { |
---|
| 1483 | FREE(key); |
---|
| 1484 | FREE(value); |
---|
| 1485 | } |
---|
| 1486 | |
---|
| 1487 | flag_value = argc == 2 ? util_strsav("") : util_strsav(argv[2]); |
---|
| 1488 | |
---|
| 1489 | (void) avl_insert(cmdFlagTable, util_strsav(argv[1]), flag_value); |
---|
| 1490 | |
---|
| 1491 | if (strcmp(argv[1], "vis_stdout") == 0) { |
---|
| 1492 | if (vis_stdout != stdout) { |
---|
| 1493 | (void) fclose(vis_stdout); |
---|
| 1494 | } |
---|
| 1495 | if (strcmp(flag_value, "") == 0) { |
---|
| 1496 | flag_value = "-"; |
---|
| 1497 | } |
---|
| 1498 | vis_stdout = Cmd_FileOpen(flag_value, "w", NIL(char *), 0); |
---|
| 1499 | if (vis_stdout == NULL) { |
---|
| 1500 | vis_stdout = stdout; |
---|
| 1501 | } |
---|
| 1502 | #if HAVE_SETVBUF |
---|
| 1503 | setvbuf(vis_stdout, (char *)NULL, _IOLBF, 0); |
---|
| 1504 | #endif |
---|
| 1505 | } |
---|
| 1506 | if (strcmp(argv[1], "vis_stderr") == 0) { |
---|
| 1507 | if (vis_stderr != stderr) { |
---|
| 1508 | (void) fclose(vis_stderr); |
---|
| 1509 | } |
---|
| 1510 | if (strcmp(flag_value, "") == 0) { |
---|
| 1511 | flag_value = "-"; |
---|
| 1512 | } |
---|
| 1513 | vis_stderr = Cmd_FileOpen(flag_value, "w", NIL(char *), 0); |
---|
| 1514 | if (vis_stderr == NULL) { |
---|
| 1515 | vis_stderr = stderr; |
---|
| 1516 | } |
---|
| 1517 | #if HAVE_SETVBUF |
---|
| 1518 | setvbuf(vis_stderr, (char *)NULL, _IOLBF, 0); |
---|
| 1519 | #endif |
---|
| 1520 | } |
---|
| 1521 | if (strcmp(argv[1], "history") == 0) { |
---|
| 1522 | if (vis_historyFile != NIL(FILE)) { |
---|
| 1523 | (void) fclose(vis_historyFile); |
---|
| 1524 | } |
---|
| 1525 | if (strcmp(flag_value, "") == 0) { |
---|
| 1526 | vis_historyFile = NIL(FILE); |
---|
| 1527 | } |
---|
| 1528 | else { |
---|
| 1529 | vis_historyFile = Cmd_FileOpen(flag_value, "w", NIL(char *), 0); |
---|
| 1530 | if (vis_historyFile == NULL) { |
---|
| 1531 | vis_historyFile = NIL(FILE); |
---|
| 1532 | } |
---|
| 1533 | } |
---|
| 1534 | } |
---|
| 1535 | return 0; |
---|
| 1536 | } |
---|
| 1537 | |
---|
| 1538 | usage: |
---|
| 1539 | (void) printf("usage: set [-h] [name] [value]\n"); |
---|
| 1540 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 1541 | return 1; |
---|
| 1542 | |
---|
| 1543 | } |
---|
| 1544 | |
---|
| 1545 | |
---|
| 1546 | /**Function******************************************************************** |
---|
| 1547 | |
---|
| 1548 | Synopsis [Implements the unset command.] |
---|
| 1549 | |
---|
| 1550 | CommandName [unset] |
---|
| 1551 | |
---|
| 1552 | CommandSynopsis [unset an environment variable] |
---|
| 1553 | |
---|
| 1554 | CommandArguments [\[-h\] <variables>] |
---|
| 1555 | |
---|
| 1556 | CommandDescription [ A variable environment is maintained by the command |
---|
| 1557 | interpreter. |
---|
| 1558 | The "set" command sets a variable to a particular value, and the |
---|
| 1559 | "unset" command removes the definition of a variable. <p> |
---|
| 1560 | Command options:<p> |
---|
| 1561 | </dl> |
---|
| 1562 | <dl><dt> -h |
---|
| 1563 | <dd> Print the command usage. |
---|
| 1564 | </dl> |
---|
| 1565 | <dl><dt> <variables> |
---|
| 1566 | <dd> Variables to be unset |
---|
| 1567 | </dl> |
---|
| 1568 | ] |
---|
| 1569 | |
---|
| 1570 | SideEffects [] |
---|
| 1571 | |
---|
| 1572 | SeeAlso [set] |
---|
| 1573 | |
---|
| 1574 | ******************************************************************************/ |
---|
| 1575 | static int |
---|
| 1576 | CommandUnsetVariable( |
---|
| 1577 | Hrc_Manager_t ** hmgr, |
---|
| 1578 | int argc, |
---|
| 1579 | char ** argv) |
---|
| 1580 | { |
---|
| 1581 | int i; |
---|
| 1582 | char *key, *value; |
---|
| 1583 | int c; |
---|
| 1584 | |
---|
| 1585 | util_getopt_reset(); |
---|
| 1586 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
| 1587 | switch(c) { |
---|
| 1588 | case 'h': |
---|
| 1589 | goto usage; |
---|
| 1590 | default: |
---|
| 1591 | goto usage; |
---|
| 1592 | } |
---|
| 1593 | } |
---|
| 1594 | |
---|
| 1595 | if (argc < 2) { |
---|
| 1596 | goto usage; |
---|
| 1597 | } |
---|
| 1598 | |
---|
| 1599 | for(i = 1; i < argc; i++) { |
---|
| 1600 | key = argv[i]; |
---|
| 1601 | if (avl_delete(cmdFlagTable, &key, &value)) { |
---|
| 1602 | FREE(key); |
---|
| 1603 | FREE(value); |
---|
| 1604 | } |
---|
| 1605 | } |
---|
| 1606 | return 0; |
---|
| 1607 | |
---|
| 1608 | |
---|
| 1609 | usage: |
---|
| 1610 | (void) fprintf(vis_stderr, "usage: unset [-h] variables \n"); |
---|
| 1611 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 1612 | return 1; |
---|
| 1613 | } |
---|
| 1614 | |
---|
| 1615 | /**Function******************************************************************** |
---|
| 1616 | |
---|
| 1617 | Synopsis [Implements the help command.] |
---|
| 1618 | |
---|
| 1619 | CommandName [help] |
---|
| 1620 | |
---|
| 1621 | CommandSynopsis [provide on-line information on commands] |
---|
| 1622 | |
---|
| 1623 | CommandArguments [\[-a\] \[-h\] \[<command>\]] |
---|
| 1624 | |
---|
| 1625 | CommandDescription [Given no arguments, "help" prints a list of all commands |
---|
| 1626 | known to the command interpreter. |
---|
| 1627 | If a command name is given, detailed information for that command will be |
---|
| 1628 | provided.<p> |
---|
| 1629 | |
---|
| 1630 | Command options:<p> |
---|
| 1631 | <dl><dt> -a |
---|
| 1632 | <dd> Provides a list of all internal commands, which by convention begin with an underscore. |
---|
| 1633 | </dl> |
---|
| 1634 | <dl><dt> -h |
---|
| 1635 | <dd> Print the command usage. |
---|
| 1636 | </dl>] |
---|
| 1637 | |
---|
| 1638 | SideEffects [] |
---|
| 1639 | |
---|
| 1640 | ******************************************************************************/ |
---|
| 1641 | static int |
---|
| 1642 | CommandHelp( |
---|
| 1643 | Hrc_Manager_t ** hmgr, |
---|
| 1644 | int argc, |
---|
| 1645 | char ** argv) |
---|
| 1646 | { |
---|
| 1647 | int c, i, all; |
---|
| 1648 | char *key; |
---|
| 1649 | avl_generator *gen; |
---|
| 1650 | char buffer[1024]; |
---|
| 1651 | char *command; |
---|
| 1652 | char *lib_name; |
---|
| 1653 | #if HAVE_GETENV |
---|
| 1654 | char *pager; |
---|
| 1655 | #endif |
---|
| 1656 | |
---|
| 1657 | |
---|
| 1658 | util_getopt_reset(); |
---|
| 1659 | all = 0; |
---|
| 1660 | while ((c = util_getopt(argc, argv, "ah")) != EOF) { |
---|
| 1661 | switch(c) { |
---|
| 1662 | case 'a': |
---|
| 1663 | all = 1; |
---|
| 1664 | break; |
---|
| 1665 | case 'h': |
---|
| 1666 | goto usage; |
---|
| 1667 | default: |
---|
| 1668 | goto usage; |
---|
| 1669 | } |
---|
| 1670 | } |
---|
| 1671 | |
---|
| 1672 | if (argc - util_optind == 0) { |
---|
| 1673 | fprintf(vis_stderr,"List of commands:\n"); |
---|
| 1674 | i = 0; |
---|
| 1675 | avl_foreach_item(cmdCommandTable, gen, AVL_FORWARD, &key, NIL(char *)) { |
---|
| 1676 | if ((key[0] == '_') == all) { |
---|
| 1677 | (void) fprintf(vis_stdout, "%-26s", key); |
---|
| 1678 | if ((++i%3) == 0) { |
---|
| 1679 | (void) fprintf(vis_stdout, "\n"); |
---|
| 1680 | } |
---|
| 1681 | } |
---|
| 1682 | } |
---|
| 1683 | if ((i%3) != 0) { |
---|
| 1684 | (void) fprintf(vis_stdout, "\n"); |
---|
| 1685 | } |
---|
| 1686 | } |
---|
| 1687 | else if (argc - util_optind == 1) { |
---|
| 1688 | command = command_alias_help(argv[util_optind]); |
---|
| 1689 | lib_name = Vm_VisObtainLibrary(); |
---|
| 1690 | #if HAVE_GETENV |
---|
| 1691 | pager = getenv("PAGER"); |
---|
| 1692 | if (pager != NULL) { |
---|
| 1693 | (void) sprintf(buffer, "%s %s/help/%sCmd.txt", pager, lib_name, command); |
---|
| 1694 | } else { |
---|
| 1695 | (void) sprintf(buffer, "more %s/help/%sCmd.txt", lib_name, command); |
---|
| 1696 | } |
---|
| 1697 | #else |
---|
| 1698 | (void) sprintf(buffer, "more %s/help/%sCmd.txt", lib_name, command); |
---|
| 1699 | #endif |
---|
| 1700 | (void) system(buffer); |
---|
| 1701 | FREE(lib_name); |
---|
| 1702 | } |
---|
| 1703 | else { |
---|
| 1704 | goto usage; |
---|
| 1705 | } |
---|
| 1706 | |
---|
| 1707 | return 0; |
---|
| 1708 | |
---|
| 1709 | usage: |
---|
| 1710 | (void) fprintf(vis_stderr, "usage: help [-a] [-h] [command]\n"); |
---|
| 1711 | (void) fprintf(vis_stderr, " -a \t\tprint help for all commands\n"); |
---|
| 1712 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); |
---|
| 1713 | |
---|
| 1714 | return 1; |
---|
| 1715 | } |
---|
| 1716 | |
---|
| 1717 | #if 0 |
---|
| 1718 | Change "/*!*Function" to "/**Function" when reactivate command |
---|
| 1719 | /*!*Function******************************************************************** |
---|
| 1720 | |
---|
| 1721 | Synopsis [Implements the undo command.] |
---|
| 1722 | |
---|
| 1723 | CommandName [undo] |
---|
| 1724 | |
---|
| 1725 | CommandSynopsis [undo the result of the last command which changed the network] |
---|
| 1726 | |
---|
| 1727 | CommandDescription [ A simple 1-level undo is supported. |
---|
| 1728 | It reverts the network to its state before the last command which |
---|
| 1729 | changed the network. Note that interrupting a command (with ^C) |
---|
| 1730 | which changes the network uses up the one level of undo.<p> ] |
---|
| 1731 | |
---|
| 1732 | SideEffects [] |
---|
| 1733 | |
---|
| 1734 | ******************************************************************************/ |
---|
| 1735 | static int |
---|
| 1736 | CommandUndo( |
---|
| 1737 | Hrc_Manager_t ** hmgr, |
---|
| 1738 | int argc, |
---|
| 1739 | char ** argv) |
---|
| 1740 | { |
---|
| 1741 | if (argc != 1) { |
---|
| 1742 | (void) fprintf(vis_stderr, "usage: undo\n"); |
---|
| 1743 | return 1; |
---|
| 1744 | } |
---|
| 1745 | |
---|
| 1746 | (void) fprintf(vis_stderr, "** cmd error: undo: not yet implemented\n"); |
---|
| 1747 | return 1; |
---|
| 1748 | |
---|
| 1749 | #if 0 |
---|
| 1750 | |
---|
| 1751 | /* |
---|
| 1752 | * FIX (Tom): can't enable "undo" until network_dup and hmgr_dup exist. |
---|
| 1753 | */ |
---|
| 1754 | if (cmdBackupHmgr == NIL(Hrc_Manager_t)) { |
---|
| 1755 | (void) fprintf(vis_stderr, "undo: no hmgr currently saved\n"); |
---|
| 1756 | return 1; |
---|
| 1757 | } |
---|
| 1758 | else { |
---|
| 1759 | |
---|
| 1760 | /* Swap the current and backup. */ |
---|
| 1761 | Hrc_Manager_t *temp = *hmgr; |
---|
| 1762 | *hmgr = cmdBackupHmgr; |
---|
| 1763 | cmdBackupHmgr = temp; |
---|
| 1764 | return 0; |
---|
| 1765 | } |
---|
| 1766 | #endif |
---|
| 1767 | } |
---|
| 1768 | #endif |
---|
| 1769 | |
---|
| 1770 | |
---|
| 1771 | |
---|
| 1772 | /**Function******************************************************************** |
---|
| 1773 | |
---|
| 1774 | Synopsis [Implements the source command.] |
---|
| 1775 | |
---|
| 1776 | CommandName [source] |
---|
| 1777 | |
---|
| 1778 | CommandSynopsis [execute commands from a file] |
---|
| 1779 | |
---|
| 1780 | CommandArguments [\[-h\] \[-p\] \[-s\] \[-x\] <file> \[<args>\]] |
---|
| 1781 | |
---|
| 1782 | CommandDescription [Reads and executes commands from a file.<p> |
---|
| 1783 | Command options:<p> |
---|
| 1784 | <dl><dt> -h |
---|
| 1785 | <dd> Print the command usage. |
---|
| 1786 | </dl> |
---|
| 1787 | <dl><dt> -p |
---|
| 1788 | <dd> Print a prompt before reading each command. |
---|
| 1789 | </dl> |
---|
| 1790 | <dl><dt> -s |
---|
| 1791 | <dd> Silently |
---|
| 1792 | ignore an attempt to execute commands from a nonexistent file. |
---|
| 1793 | </dl> |
---|
| 1794 | <dl><dt> -x |
---|
| 1795 | <dd> Echo each command before it is executed. |
---|
| 1796 | </dl> |
---|
| 1797 | <dl><dt> <file> |
---|
| 1798 | <dd> File name |
---|
| 1799 | </dl> |
---|
| 1800 | |
---|
| 1801 | Arguments on the command line after the filename are remembered but not |
---|
| 1802 | evaluated. Commands in the script file can then refer to these arguments |
---|
| 1803 | using the history substitution mechanism.<p> |
---|
| 1804 | |
---|
| 1805 | EXAMPLE:<p> |
---|
| 1806 | |
---|
| 1807 | Contents of test.scr:<p> |
---|
| 1808 | |
---|
| 1809 | <pre> |
---|
| 1810 | read_blif_mv %:2 |
---|
| 1811 | init_verify |
---|
| 1812 | simulate -n 10 |
---|
| 1813 | </pre> |
---|
| 1814 | |
---|
| 1815 | Typing "source test.scr lion.mv" on the command line will execute the |
---|
| 1816 | sequence<p> |
---|
| 1817 | |
---|
| 1818 | <pre> |
---|
| 1819 | read_blif_mv lion.mv |
---|
| 1820 | init_verify |
---|
| 1821 | simulate -n 10 |
---|
| 1822 | </pre> |
---|
| 1823 | |
---|
| 1824 | (In this case <code>%:0</code> gets "source", <code>%:1</code> gets |
---|
| 1825 | "test.scr", and <code>%:2</code> gets "lion.mv".) |
---|
| 1826 | If you type "alias st source test.scr" and then type "st lion.blif bozo", |
---|
| 1827 | you will execute<p> |
---|
| 1828 | |
---|
| 1829 | <pre> |
---|
| 1830 | read_blif_mv bozo |
---|
| 1831 | init_verify |
---|
| 1832 | simulate -n 10 |
---|
| 1833 | </pre> |
---|
| 1834 | |
---|
| 1835 | because "bozo" was the second argument on the last command line typed. In |
---|
| 1836 | other words, command substitution in a script file depends on how the script |
---|
| 1837 | file was invoked. Switches passed to a command are also counted as |
---|
| 1838 | positional parameters. Therefore, if you type "st -x lion.mv bozo", |
---|
| 1839 | you will execute |
---|
| 1840 | |
---|
| 1841 | <pre> |
---|
| 1842 | read_blif_mv lion.mv |
---|
| 1843 | init_verify |
---|
| 1844 | simulate -n 10 |
---|
| 1845 | </pre> |
---|
| 1846 | |
---|
| 1847 | To pass the "-x" switch (or any other switch) to "source" when the |
---|
| 1848 | script uses positional parameters, you can define an alias. For |
---|
| 1849 | instance, "alias srcx source -x".<p> |
---|
| 1850 | |
---|
| 1851 | |
---|
| 1852 | ] |
---|
| 1853 | |
---|
| 1854 | SideEffects [required] |
---|
| 1855 | |
---|
| 1856 | SeeAlso [history] |
---|
| 1857 | |
---|
| 1858 | ******************************************************************************/ |
---|
| 1859 | static int |
---|
| 1860 | CommandSource( |
---|
| 1861 | Hrc_Manager_t ** hmgr, |
---|
| 1862 | int argc, |
---|
| 1863 | char ** argv) |
---|
| 1864 | { |
---|
| 1865 | int c, echo, prompt, silent, interactive, quit_count, lp_count; |
---|
| 1866 | int status = 0; /* initialize so that lint doesn't complain */ |
---|
| 1867 | int lp_file_index, did_subst; |
---|
| 1868 | char *prompt_string, *real_filename, line[MAX_STR], *command; |
---|
| 1869 | FILE *fp; |
---|
| 1870 | |
---|
| 1871 | interactive = silent = prompt = echo = 0; |
---|
| 1872 | |
---|
| 1873 | util_getopt_reset(); |
---|
| 1874 | while ((c = util_getopt(argc, argv, "hipsx")) != EOF) { |
---|
| 1875 | switch(c) { |
---|
| 1876 | case 'h': |
---|
| 1877 | goto usage ; |
---|
| 1878 | case 'i': /* a hack to distinguish EOF from stdin */ |
---|
| 1879 | interactive = 1; |
---|
| 1880 | break; |
---|
| 1881 | case 'p': |
---|
| 1882 | prompt = 1; |
---|
| 1883 | break; |
---|
| 1884 | case 's': |
---|
| 1885 | silent = 1; |
---|
| 1886 | break; |
---|
| 1887 | case 'x': |
---|
| 1888 | echo = 1; |
---|
| 1889 | break; |
---|
| 1890 | default: |
---|
| 1891 | goto usage; |
---|
| 1892 | } |
---|
| 1893 | } |
---|
| 1894 | |
---|
| 1895 | /* added to avoid core-dumping when no script file is specified */ |
---|
| 1896 | if (argc == util_optind){ |
---|
| 1897 | goto usage; |
---|
| 1898 | } |
---|
| 1899 | |
---|
| 1900 | lp_file_index = util_optind; |
---|
| 1901 | lp_count = 0; |
---|
| 1902 | |
---|
| 1903 | /* |
---|
| 1904 | * FIX (Tom, 5/7/95): I'm not sure what the purpose of this outer do loop |
---|
| 1905 | * is. In particular, lp_file_index is never modified in the loop, so it |
---|
| 1906 | * looks it would just read the same file over again. Also, SIS had |
---|
| 1907 | * lp_count initialized to -1, and hence, any file sourced by SIS (if -l or |
---|
| 1908 | * -t options on "source" were used in SIS) would actually be executed |
---|
| 1909 | * twice. |
---|
| 1910 | */ |
---|
| 1911 | do { |
---|
| 1912 | lp_count ++; /* increment the loop counter */ |
---|
| 1913 | |
---|
| 1914 | fp = Cmd_FileOpen(argv[lp_file_index], "r", &real_filename, silent); |
---|
| 1915 | if (fp == NULL) { |
---|
| 1916 | FREE(real_filename); |
---|
| 1917 | return ! silent; /* error return if not silent */ |
---|
| 1918 | } |
---|
| 1919 | |
---|
| 1920 | quit_count = 0; |
---|
| 1921 | do { |
---|
| 1922 | if (prompt) { |
---|
| 1923 | prompt_string = Cmd_FlagReadByName("prompt"); |
---|
| 1924 | if (prompt_string == NIL(char)) { |
---|
| 1925 | prompt_string = "vis> "; |
---|
| 1926 | } |
---|
| 1927 | |
---|
| 1928 | } |
---|
| 1929 | else { |
---|
| 1930 | prompt_string = NIL(char); |
---|
| 1931 | } |
---|
| 1932 | |
---|
| 1933 | /* clear errors -- e.g., EOF reached from stdin */ |
---|
| 1934 | clearerr(fp); |
---|
| 1935 | |
---|
| 1936 | /* read another command line */ |
---|
| 1937 | if (CmdFgetsFilec(line, MAX_STR, fp, prompt_string) == NULL) { |
---|
| 1938 | if (interactive) { |
---|
| 1939 | if (quit_count++ < 5) { |
---|
| 1940 | (void) fprintf(vis_stderr, "\nUse \"quit\" to leave VIS.\n"); |
---|
| 1941 | continue; |
---|
| 1942 | } |
---|
| 1943 | status = -1; /* fake a 'quit' */ |
---|
| 1944 | } |
---|
| 1945 | else { |
---|
| 1946 | status = 0; /* successful end of 'source' ; loop? */ |
---|
| 1947 | } |
---|
| 1948 | break; |
---|
| 1949 | } |
---|
| 1950 | quit_count = 0; |
---|
| 1951 | |
---|
| 1952 | if (echo) { |
---|
| 1953 | (void) fprintf(vis_stdout, "%s", line); |
---|
| 1954 | } |
---|
| 1955 | command = CmdHistorySubstitution(line, &did_subst); |
---|
| 1956 | if (command == NIL(char)) { |
---|
| 1957 | status = 1; |
---|
| 1958 | break; |
---|
| 1959 | } |
---|
| 1960 | if (did_subst) { |
---|
| 1961 | if (interactive) { |
---|
| 1962 | (void) fprintf(stdout, "%s\n", command); |
---|
| 1963 | } |
---|
| 1964 | } |
---|
| 1965 | if (command != line) { |
---|
| 1966 | (void) strcpy(line, command); |
---|
| 1967 | } |
---|
| 1968 | if (interactive && *line != '\0') { |
---|
| 1969 | array_insert_last(char *, vm_commandHistoryArray, util_strsav(line)); |
---|
| 1970 | if (vis_historyFile != NIL(FILE)) { |
---|
| 1971 | (void) fprintf(vis_historyFile, "%s\n", line); |
---|
| 1972 | (void) fflush(vis_historyFile); |
---|
| 1973 | } |
---|
| 1974 | } |
---|
| 1975 | |
---|
| 1976 | status = Cmd_CommandExecute(hmgr, line); |
---|
| 1977 | } while (status == 0); |
---|
| 1978 | |
---|
| 1979 | if (fp != stdin) { |
---|
| 1980 | if (status > 0) { |
---|
| 1981 | (void) fprintf(vis_stderr, "** cmd error: aborting 'source %s'\n", real_filename); |
---|
| 1982 | } |
---|
| 1983 | (void) fclose(fp); |
---|
| 1984 | } |
---|
| 1985 | FREE(real_filename); |
---|
| 1986 | |
---|
| 1987 | } while ((status == 0) && (lp_count <= 0)); |
---|
| 1988 | |
---|
| 1989 | return status; |
---|
| 1990 | |
---|
| 1991 | usage: |
---|
| 1992 | (void) fprintf(vis_stderr, "source [-h] [-p] [-s] [-x] file_name\n"); |
---|
| 1993 | (void) fprintf(vis_stderr, "\t-h print the command usage\n"); |
---|
| 1994 | (void) fprintf(vis_stderr, "\t-p supply prompt before reading each line\n"); |
---|
| 1995 | (void) fprintf(vis_stderr, "\t-s silently ignore nonexistent file\n"); |
---|
| 1996 | (void) fprintf(vis_stderr, "\t-x echo each line as it is executed\n"); |
---|
| 1997 | return 1; |
---|
| 1998 | } |
---|
| 1999 | |
---|
| 2000 | /**Function******************************************************************** |
---|
| 2001 | |
---|
| 2002 | Synopsis [required] |
---|
| 2003 | |
---|
| 2004 | Description [optional] |
---|
| 2005 | |
---|
| 2006 | SideEffects [required] |
---|
| 2007 | |
---|
| 2008 | SeeAlso [optional] |
---|
| 2009 | |
---|
| 2010 | ******************************************************************************/ |
---|
| 2011 | static void |
---|
| 2012 | print_alias( |
---|
| 2013 | char * value) |
---|
| 2014 | { |
---|
| 2015 | int i; |
---|
| 2016 | CmdAliasDescr_t *alias; |
---|
| 2017 | |
---|
| 2018 | alias = (CmdAliasDescr_t *) value; |
---|
| 2019 | (void) fprintf(vis_stdout, "%s\t", alias->name); |
---|
| 2020 | for(i = 0; i < alias->argc; i++) { |
---|
| 2021 | (void) fprintf(vis_stdout, " %s", alias->argv[i]); |
---|
| 2022 | } |
---|
| 2023 | (void) fprintf(vis_stdout, "\n"); |
---|
| 2024 | } |
---|
| 2025 | |
---|
| 2026 | |
---|
| 2027 | /**Function******************************************************************** |
---|
| 2028 | |
---|
| 2029 | Synopsis [required] |
---|
| 2030 | |
---|
| 2031 | Description [optional] |
---|
| 2032 | |
---|
| 2033 | SideEffects [required] |
---|
| 2034 | |
---|
| 2035 | SeeAlso [optional] |
---|
| 2036 | |
---|
| 2037 | ******************************************************************************/ |
---|
| 2038 | static char * |
---|
| 2039 | command_alias_help( |
---|
| 2040 | char * command) |
---|
| 2041 | { |
---|
| 2042 | char *value; |
---|
| 2043 | CmdAliasDescr_t *alias; |
---|
| 2044 | |
---|
| 2045 | if (!avl_lookup(cmdAliasTable, command, &value)) { |
---|
| 2046 | return command; |
---|
| 2047 | } |
---|
| 2048 | alias = (CmdAliasDescr_t *) value; |
---|
| 2049 | return alias->argv[0]; |
---|
| 2050 | } |
---|
| 2051 | |
---|
| 2052 | /**Function******************************************************************** |
---|
| 2053 | |
---|
| 2054 | Synopsis [Function to flush vis_stdout and vis_stderr.] |
---|
| 2055 | |
---|
| 2056 | Description [This function is the signal handler for the SIGUSR1 |
---|
| 2057 | signal. Whenever that signal is received, this function is executed and the |
---|
| 2058 | output channels of VIS are flushed.] |
---|
| 2059 | |
---|
| 2060 | SideEffects [] |
---|
| 2061 | |
---|
| 2062 | SeeAlso [Cmd_Init] |
---|
| 2063 | |
---|
| 2064 | ******************************************************************************/ |
---|
| 2065 | static void |
---|
| 2066 | FlushBuffers( |
---|
| 2067 | int sigtype) |
---|
| 2068 | { |
---|
| 2069 | fflush(vis_stdout); |
---|
| 2070 | fflush(vis_stderr); |
---|
| 2071 | |
---|
| 2072 | /* Reprogram again the handler */ |
---|
| 2073 | #ifdef SIGUSR1 |
---|
| 2074 | (void) signal(SIGUSR1, FlushBuffers); |
---|
| 2075 | #endif |
---|
| 2076 | } /* End of FlushBuffers */ |
---|