/* * @OPENGROUP_COPYRIGHT@ * COPYRIGHT NOTICE * Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc. * Copyright (c) 1996, 1997, 1998, 1999, 2000 The Open Group * ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for * the full copyright text. * * This software is subject to an open license. It may only be * used on, with or for operating systems which are themselves open * source systems. You must contact The Open Group for a license * allowing distribution and sublicensing of this software on, with, * or for operating systems which are not Open Source programs. * * See http://www.opengroup.org/openmotif/license for full * details of the license agreement. Any use, reproduction, or * distribution of the program constitutes recipient's acceptance of * this agreement. * * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS * PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY * WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY * OR FITNESS FOR A PARTICULAR PURPOSE * * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT * NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE * EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ /* * HISTORY */ #ifdef REV_INFO #ifndef lint static char rcsid[] = "$XConsortium: CommandLine.c /main/11 1995/07/14 10:55:39 drk $" #endif #endif #include "testlib.h" #include #include #include #if defined(__STDC__) #include #include #endif #define DEFAULT_FONT "fixed" #define TEST_FONT "fixed" #define PAUSE_LEN 60 #define USER_DATA_LEN 64 Boolean Automation = False; /* Automated Regression?? */ Boolean AutoRecord = False; /* Record Automated Screens */ Boolean AutoBatch = True; /* Batch mode for playback */ Boolean AutoManual = False; /* Manual mode for playback */ Boolean AutoNoCheck = False; /* Don't check visuals */ Boolean AutoTrace = False; /* Run in Trace mode */ Boolean AutoAltVisualFile = False; /* Alternate visual file name */ Boolean alternate_script = False; /* Use testname for scripts */ Boolean alternate_output = False; /* Use testname for output */ Boolean AutoFullOutput = False; /* full output or not */ Boolean AutoDelay = False; /* Delay after each command */ Boolean AutoWindowDumps = False; /* produce xwd window dumps */ Boolean AutoFailPixel = False; /* use a different fail pixel */ char AutoFailColor[25] = { "red" }; /* failure pixel color */ int AutoDelayCycles; /* number of delay cycles */ char script_file_name[MAX_FILE]; /* Alternate script file */ char script_file_name_orig[MAX_FILE]; /* Alternate script file */ char output_file_name[MAX_FILE]; /* Alternate prt file */ char full_output_file_name[MAX_FILE]; /* Alternate prt file (PATH)*/ char AutoAltVisualFileName[MAX_FILE]; /* Alternate visual file */ FILE *input, *output; /* redefine stdin and stdout */ Boolean instructions = True; /* Use instructions?? */ char *UserData; /* Passable character data */ char *instruct_file_name; /* Alternate instruction file */ char *instruct_file_name_orig; /* Alternate instruction file */ int pause_len = PAUSE_LEN; /* Width of MessageBox */ char test_font[MAX_FONT_LEN]; /* Font for MessageBox */ char default_font[MAX_FONT_LEN]; /* Default Font for failures */ /************************************************************************* * * * Name: CommonUsage() * * * * Purpose: This function will print to stdout the current * * flags that are valid for the test suite * * * * Returns: Nothing * * * * Current Flags: * * -l : Disables Message Box explanations of test * * -I : Read in alternate instruction file. The * * Current file read is .Dat * * -h : Prints the usage message * * -w : Controls the width of the Message Box * * -u : User Data. Input that can be given to be * * used by testers programs. * * -f : Default Font. Specify a font you would * * like to use if your request for a font * * does not succeed (font is not available). * * -p : MessageBox font. Specify the font you wish * * the instruction's MessageBox to be. * * * * The Following flags are for Automatic Regression * * * * -a : generate full error reporting on visuals * * -r : Record image file (Automated Regression) * * -m : Interactive comparison of visuals * * -c : Comparisons ignored * * -C : Alternate failure color * * -D : Delay after each command n times * * -W : Produce Window Dumps file for failures * * -S : Alternative name for script file * * -O : Alternative name for output file * * -V : Alternative name for visual file * * -T : Trace Option - print commands executed * * * *************************************************************************/ void CommonUsage(char *test_name) { fprintf(stdout, "Usage: %s:\n", test_name); fprintf(stdout, " [-I ] [-l ]\n"); fprintf(stdout, " [-w ] [-u ]\n"); fprintf(stdout, " [-f ] [-p ]\n"); fprintf(stdout, " [-help] [X Options]\n"); fprintf(stdout, " Automation Flags:\n"); fprintf(stdout, " [-a ]\n"); fprintf(stdout, " [-r ]\n"); fprintf(stdout, " [-m ]\n"); fprintf(stdout, " [-c ]\n"); fprintf(stdout, " [-C ]\n"); fprintf(stdout, " [-W ]\n"); fprintf(stdout, " [-D [number_of_delay_cycles] ]\n"); fprintf(stdout, " [-T ]\n"); fprintf(stdout, " [-S ]\n"); fprintf(stdout, " [-O ]\n"); fprintf(stdout, " [-V ]\n"); } /************************************************************************* * * * Name: CommonGetOptions() * * * * Purpose: This function will extract from the command all * * options used by the test suite and will set all * * appropriate flags for those argumennts. All * * arguments that are not valid for the test suite * * are passed on so that X can properly act on * * them. This routine will also set the instruction * * file name to be used, User Data, help flag, and * * width of the Message Box used for instructions. * * * * Current Flags: * * -l : Disables Message Box explanations of test * * -I : Read in alternate instruction file. The * * Current file read is .Dat * * -h : Prints the usage message * * -w : Controls the width of the Message Box * * -u : User Data. Input that can be given to be * * used by testers programs. * * -f : Default Font. Specify a font you would * * like to use if your request for a font * * does not succeed (font is not available). * * -p : MessageBox font. Specify the font you wish * * the instruction's MessageBox to be. * * * * The Following flags are for Automatic Regression * * * * -a : full error reporting on visuals * * -r : Record image file (Automated Regression) * * -m : Interactive comparison of visuals * * -c : Comparisons ignored * * -C : Alternate failure color * * -D : Delay after each command n times * * -W : Produce Window Dumps file for failures * * -S : Alternative name for script file * * -O : Alternative name for output file * * -V : Alternative name for visual file * * -T : Trace Option - print commands executed * * * * Returns: Nothing * * * *************************************************************************/ /* globals */ extern char *optarg; /* supplied by getopt */ extern int optind, opterr; void CommonGetOptions (int *argc, char **argv) { int c; char *char_val; char test_name[MAX_FILE]; Boolean name_given = False; Boolean test_font_used = False; Boolean default_font_used = False; int fd_stdout, fd_stderr, ret; char *visual_path = NULL; char *getenv(); static int errflag = 0; /* initializations */ instructions = True; pause_len = 0; UserData = NULL; instruct_file_name = NULL; opterr = 0; /* disable automatic warnings */ strcpy (test_name, argv[0]); if (*argc > 1) { while ((c = getopt (*argc, argv, "alhrmcWC:D:TV:S:O:w:u:f:p:I:")) != EOF) { switch (c) { case 'S': if (strlen (optarg) >= (MAX_FILE - 1)) { printf ("Error: file name %s too long\n", optarg); errflag++; break; } alternate_script = True; strcpy (script_file_name, optarg); break; case 'O': if (strlen (optarg) >= (MAX_FILE - 1)) { printf ("Error: file name %s too long\n", optarg); errflag++; break; } alternate_output = True; strcpy (output_file_name, optarg); break; case 'V': if (strlen (optarg) >= (MAX_FILE - 1)) { printf ("Error: file name %s too long\n", optarg); errflag++; break; } AutoAltVisualFile = True; strcpy (AutoAltVisualFileName, optarg); break; case 'C': strcpy (AutoFailColor, optarg); break; case 'D': AutoDelay = True; AutoDelayCycles = atoi(optarg); break; case 'T': AutoTrace = True; break; case 'W': AutoWindowDumps = True; break; case 'r': AutoRecord = True; AutoBatch = False; break; case 'm': AutoManual = True; AutoBatch = False; break; case 'c': AutoNoCheck = True; AutoBatch = False; break; case 'a': AutoFullOutput = True; break; case 'p': if (strlen (optarg) >= MAX_FONT_LEN) { printf ("Error: file name %s too long\n", optarg); errflag++; break; } test_font_used = True; strcpy (test_font, optarg); break; case 'I': if (strlen (optarg) >= (MAX_FILE - 1)) { printf ("Error: file name %s too long\n", optarg); errflag++; break; } name_given = True; instruct_file_name = (char *) malloc((sizeof (char)) * MAX_FILE); strcpy (instruct_file_name, optarg); break; case 'f': if (strlen (optarg) >= MAX_FONT_LEN) { printf ("Error: file name %s too long\n", optarg); errflag++; break; } default_font_used = True; strcpy (default_font, optarg); break; case 'u': if (strlen (optarg) >= USER_DATA_LEN) { printf ("Error: file name %s too long\n", optarg); errflag++; break; } UserData = (char *) malloc((sizeof(char)) * USER_DATA_LEN); strcpy (UserData, optarg); break; case 'l': instructions = False; break; case 'h': CommonUsage(test_name); exit(0); break; case 'w': pause_len = atoi (optarg); if (!pause_len) { printf ("Illegal or zero value provided for width.\n"); printf ("Using default %d.\n, PAUSE_LEN"); pause_len = PAUSE_LEN; } break; } /*switch */ if (optind >= *argc) break; } /* while getopt */ } /* if *argc >= 1 */ if (errflag) { CommonUsage(test_name); exit (1); } if (!name_given) { instruct_file_name = (char *) malloc((sizeof (char)) * MAX_FILE); strcpy (instruct_file_name, test_name); strcat (instruct_file_name, ".Dat"); instruct_file_name_orig = (char *) malloc((sizeof (char)) * MAX_FILE); strcpy (instruct_file_name_orig, test_name); strcat (instruct_file_name_orig, ".dat"); } if (!default_font_used) strcpy(default_font, DEFAULT_FONT); if (!test_font_used) strcpy(test_font, TEST_FONT); if (pause_len == 0) pause_len = PAUSE_LEN; #ifdef DEBUG printf ("Using pause width %d\n", pause_len); #endif if (!alternate_output) { strcpy(output_file_name, test_name); strcat(output_file_name, ".prt"); } /* If AUTOVAPTH environment variable is set, then use that path to write .prt files */ if (AutoRecord) { visual_path = getenv("AUTOVPATH"); if (visual_path != NULL) { strcpy(full_output_file_name, visual_path); if (visual_path[strlen(visual_path) - 1] != '/') strcat(full_output_file_name, "/"); strcat(full_output_file_name, output_file_name); strcpy(output_file_name, full_output_file_name); } } /* Open .prt file for STDOUT and STDERR */ output = freopen(output_file_name, "w", stdout); if (output == NULL) { fprintf(stderr, "Redefine of STDOUT to %s failed - Exiting..\n", output_file_name); exit(1); } if (!alternate_script) { strcpy(script_file_name, test_name); strcat(script_file_name, ".Scr"); strcat(script_file_name_orig, test_name); strcat(script_file_name_orig, ".scr"); } /* Open .Scr file. If .scr exists and .Scr does not, open .scr, use it for input, and inform the user */ input = freopen(script_file_name, "r", stdin); if (input == NULL) { input = freopen(script_file_name_orig, "r", stdin); if (input == NULL) { fprintf(stderr, "Redefine of STDIN to %s failed\n", script_file_name); fprintf(stderr, " - check validity of %s - Exiting...\n", script_file_name); exit(1); } else fprintf(stdout, "Using %s, please create a %s file\n", script_file_name_orig, script_file_name); } fflush(stdout); fflush(stderr); /* redirect both STDOUT and STDERR to same file, use dup2() to perform this */ setbuf(stdout, NULL); setbuf(stderr, NULL); ret = dup2(fileno(stdout), fileno(stderr)); if (ret == -1) { fprintf(stderr, "dup2 of STDOUT and STDERR failed - Exiting..\n"); exit(1); } }