|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.