Annotation of mstools/samples/congui/console.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: // CONSOLE.C
                     13: // ================================================================
                     14: // This module contains the standard console functions for this
                     15: // applicaiton. All of the 'graphical' functions are contained in
                     16: // GUI.C
                     17: 
                     18: #include <stdio.h>
                     19: #include <string.h>
                     20: #include <ctype.h>
                     21: #include <windows.h>
                     22: #include "ConGUI.h"
                     23: 
                     24: void usage (void);
                     25: static void DoArgs(int *pargc, char **pargv[]);
                     26: void ListArgs (int argc, char **argv);
                     27: 
                     28: extern int GetDialogArgs (char ***pargv);
                     29: extern int DoHelp (char *szHelpTopic);
                     30: 
                     31: BOOL bDoHelp = FALSE;
                     32: BOOL bDoDialog = FALSE;
                     33: BOOL bDoUsage = FALSE;
                     34: 
                     35: int main(int argc, char **argv)
                     36: 
                     37: {
                     38:     char szAppName[80];
                     39:     char **dargv;
                     40: 
                     41:     HANDLE hConsoleOutput;
                     42:     CONSOLE_SCREEN_BUFFER_INFO csbi;
                     43:     BOOL bLaunched;
                     44: 
                     45:     // Lets try a trick to determine if we were 'launched' as a seperate
                     46:     // screen, or just running from the command line.
                     47:     // We want to do this so that when we exit, we can prompt the user
                     48:     // before we shut down if we were 'launched'. Otherwise, any data on
                     49:     // the output window will be lost.
                     50:     // We will do this by simply getting the current cursor position. It
                     51:     // 'should' always be (0,0) on a launch, and something else if we were
                     52:     // executed as a command from a console window. The only time I can see
                     53:     // this as not working, is if the user executed a CLS and appended
                     54:     // our program with the '&' character, as in:
                     55:     //   C:\> CLS & ConGUI
                     56:     // This will also result in a (0,0) cursor pos, but in this case, the
                     57:     // user might also be wanting us to 'prompt' before closeing.
                     58:     // We also need to handle the case of:
                     59:     //   C:\> ConGUI > output.dat
                     60: 
                     61:     hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
                     62:     GetConsoleScreenBufferInfo(hConsoleOutput, &csbi);
                     63:     bLaunched = ((csbi.dwCursorPosition.X==0) && (csbi.dwCursorPosition.Y==0));
                     64:     if ((csbi.dwSize.X<=0) || (csbi.dwSize.Y <= 0)) bLaunched = FALSE;
                     65: 
                     66: //    printf ("Window Size: (%i, %i)\n",csbi.dwSize.X, csbi.dwSize.Y);
                     67: //    printf ("Cursor Pos : (%i, %i)\n",csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y);
                     68: 
                     69: 
                     70: 
                     71:     if (argc <= 1) { // Nothing on the command line, give brief usage info
                     72:         usage();
                     73:         if (bLaunched) {
                     74:             printf ("------------------------------------------\n");
                     75:             printf ("Program Finished - Hit <Enter> to continue");
                     76:             getchar();
                     77:         }
                     78:         return(0);
                     79:     }
                     80: 
                     81:     // Get the application name off of the command line.
                     82:     strcpy (szAppName, argv[0]); // this should always be there.
                     83:     argc--;
                     84:     argv++;
                     85: 
                     86:     // Get the rest of the arguments
                     87:     DoArgs (&argc, &argv);
                     88: 
                     89: 
                     90:     // And handle anything they told us to do
                     91:     if (bDoUsage) {         // Simple Usage Info
                     92:         usage();
                     93:     } else if (bDoHelp) {   // Robust Help
                     94:         DoHelp ("Contents");
                     95:     } else if (bDoDialog) { // Dialog
                     96:         dargv = (char **)GlobalAlloc (GPTR, 10*sizeof(char*));
                     97:         argc = GetDialogArgs(&dargv);
                     98:         if (argc > 0) {
                     99:             ListArgs (argc, dargv);
                    100:             DoArgs (&argc, &dargv);
                    101:         } else {
                    102:             printf ("\nUser Selected 'Cancel' in the dialog\n");
                    103:         }
                    104:     }
                    105: 
                    106:     if (bLaunched) {
                    107:         printf ("------------------------------------------\n");
                    108:         printf ("Program Finished - Hit <Enter> to continue");
                    109:         getchar();
                    110:     }
                    111: 
                    112:     return(0);
                    113: }
                    114: 
                    115: 
                    116: void usage(void)
                    117: {
                    118:     printf ("\nConGUI Usage information:\n");
                    119:     printf ("-------------------------\n\n");
                    120:     printf ("    -?       To print usage information\n");
                    121:     printf ("    -help    To bring up WinHelp for this application\n");
                    122:     printf ("    -dialog  To bring up a dialog to prompt for parameters\n");
                    123: 
                    124: }
                    125: 
                    126: void ListArgs (int argc, char **argv)
                    127: {
                    128:     printf ("\nCommand Line:\n    ConGUI ");
                    129:     while (argc--) {
                    130:         printf ("%s ", *argv);
                    131:         argv++;
                    132:     }
                    133:     printf ("\n");
                    134: }
                    135: 
                    136: 
                    137: typedef struct tagToken {
                    138:     int id;
                    139:     char str[25];
                    140: } Token;
                    141: 
                    142: Token params[] = {
                    143:     { T_USAGE,   "?"},
                    144:     { T_HELP,    "Help"},
                    145:     { T_DIALOG,  "Dialog"},
                    146:     { 0, 0}
                    147: 
                    148: };
                    149: 
                    150: 
                    151: // Check the option entered on the command line against the tokens
                    152: // we are expecting. The capital letters of the token represent the
                    153: // minimum amount of the token that needs to be provided. The lower
                    154: // case letters 'can' be provided, and if provided, must match.
                    155: BOOL TokensMatch (char *token, char *mask)
                    156: {
                    157:     int lToken, lMask, index;
                    158:     char *pchToken, *pchMask;
                    159: 
                    160:     lToken = strlen (token);
                    161:     lMask = strlen (mask);
                    162: 
                    163:     if (lToken > lMask) return FALSE;
                    164: 
                    165:     pchToken = &token[0];
                    166:     pchMask = &mask[0];
                    167: 
                    168:     index = 0;
                    169:     while (*pchToken) {
                    170:         if (toupper(*pchToken) != toupper(*pchMask)) return FALSE;
                    171: 
                    172:         pchToken++;
                    173:         pchMask++;
                    174:         index++;
                    175:     }
                    176: 
                    177:     if (index == lMask) return TRUE;
                    178: 
                    179:     if (islower(*pchMask)) return TRUE;
                    180: 
                    181:     return FALSE;
                    182: 
                    183: }
                    184: 
                    185: // Return the id of the specified token. Return -1 if no match.
                    186: int GetTokenID (char *token)
                    187: {
                    188:     int id = 0;
                    189:     int index = 0;
                    190: 
                    191:     while (params[index].id) {
                    192:         if (TokensMatch (token, params[index].str)) {
                    193:             return params[index].id;
                    194:         }
                    195:         ++index;
                    196:     }
                    197: 
                    198:     return -1;
                    199: }
                    200: 
                    201: 
                    202: // Parse the argument list, looking for valid keywords
                    203: static void DoArgs(int *pargc, char **pargv[])
                    204: {
                    205:     int argc, id;
                    206:     char **argv;
                    207:     char *p;
                    208: 
                    209:     argc = *pargc;
                    210:     argv = *pargv;
                    211: 
                    212:     p = argv[0];
                    213: 
                    214:     while (argc) {
                    215: 
                    216:         if (*p == '/' || (*p=='-' && *(p+1)!='\0')) {
                    217:             id = GetTokenID (&(p[1]));
                    218:             switch (id) {
                    219:                 case -1 :
                    220:                     //printf ("Invalid Token: %s\n", &(p[1]));
                    221:                     break;
                    222: 
                    223:                 case T_USAGE:
                    224:                     bDoUsage = TRUE;
                    225:                     break;
                    226: 
                    227:                 case T_HELP:
                    228:                     bDoHelp = TRUE;
                    229:                     break;
                    230: 
                    231:                 case T_DIALOG:
                    232:                     bDoDialog = TRUE;
                    233:                     break;
                    234: 
                    235:                 default:
                    236:                     printf ("Found Token: %s\n", &(p[1]));
                    237:                     break;
                    238:             }
                    239:         } else {
                    240:             printf ("Unexpected keyword : %s\n", p);
                    241: 
                    242:         }
                    243: 
                    244:         argc--;
                    245:         argv++;
                    246:         p = argv[0];
                    247:     }
                    248: 
                    249:     *pargv = argv;
                    250:     *pargc = argc;
                    251: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.