Annotation of mstools/samples/console/conmode.c, revision 1.1

1.1     ! root        1: #include <windows.h>
        !             2: #include <stdio.h>
        !             3: #include <string.h>
        !             4: #include "console.h"
        !             5: 
        !             6: /*********************************************************************
        !             7: * FUNCTION: rawOut(HANDLE hConsole, PCHAR s)                         *
        !             8: *                                                                    *
        !             9: * PURPOSE: output the contents of the input buffer to the console    *
        !            10: *          handle in 'raw' mode                                      *
        !            11: *                                                                    *
        !            12: * INPUT: the console handle to write to, and the string to output in *
        !            13: *        'raw' mode                                                  *
        !            14: *********************************************************************/
        !            15: 
        !            16: void rawOut(HANDLE hConsole, PCHAR s)
        !            17: {
        !            18:   BOOL bSuccess;
        !            19:   DWORD cCharsWritten;
        !            20:   DWORD dwOutputMode;
        !            21: 
        !            22:   bSuccess = GetConsoleMode(hConsole, &dwOutputMode);
        !            23:   PERR(bSuccess, "GetconsoleMode");
        !            24:   /* output the string in raw mode. */
        !            25:   /* turn off processed output, output the string, and reset output mode */
        !            26:   bSuccess = SetConsoleMode(hConsole, dwOutputMode & ~ENABLE_PROCESSED_OUTPUT);
        !            27:   PERR(bSuccess, "SetConsoleMode");
        !            28:   bSuccess = WriteFile(hConsole, s, strlen(s), &cCharsWritten, NULL);
        !            29:   PERR(bSuccess, "WriteFile");
        !            30:   /* now reset output mode */
        !            31:   bSuccess = SetConsoleMode(hConsole, dwOutputMode);
        !            32:   PERR(bSuccess, "SetConsoleMode");
        !            33:   return;
        !            34: }
        !            35: 
        !            36: /******************************************************************
        !            37: * FUNCTION: demoConMode(HANDLE hConOut)                           *
        !            38: *                                                                 *
        !            39: * PURPOSE: demonstrate GetConsoleMode and SetConsoleMode. Display *
        !            40: *          the current console input and output modes, then       *
        !            41: *          demonstrate each console input and output mode         *
        !            42: *                                                                 *
        !            43: *                                                                 *
        !            44: * INPUT: the console output handle to write to                    *
        !            45: ******************************************************************/
        !            46: 
        !            47: void demoConMode(HANDLE hConOut)
        !            48: {
        !            49:   BOOL bSuccess;
        !            50:   DWORD dwOutputMode, dwInputMode; /* save input & output console modes */
        !            51:   CHAR szTemp[128];
        !            52:   HANDLE hStdIn; /* standard input handle */
        !            53:   /* a string to test 'raw' vs. 'processed' output with */
        !            54:   PCHAR szModeTst = "tab:\t backspace:\b linefeed:\n bell:\a cr:\r";
        !            55:   DWORD dwRead;
        !            56:   CHAR chBuf[256]; /* buffer to read a user string from the console */
        !            57:   PCHAR szLong = "This is a line of text that is greater than 80 characters wide. This is a test of ENABLE_WRAP_AT_EOL_OUTPUT.";
        !            58: 
        !            59:   setConTitle(__FILE__);
        !            60:   hStdIn = GetStdHandle(STD_INPUT_HANDLE);
        !            61:   PERR((int) hStdIn != -1, "GetStdHandle");
        !            62:   /* get the input mode and save it so that we can restore it later */
        !            63:   bSuccess = GetConsoleMode(hStdIn, &dwInputMode);
        !            64:   PERR(bSuccess, "GetconsoleMode");
        !            65:   myPuts(hConOut, "Current console input modes, as reported by GetconsoleMode:");
        !            66:   sprintf(szTemp, "ENABLE_LINE_INPUT: %s", dwInputMode & ENABLE_LINE_INPUT ?
        !            67:       "on" : "off");
        !            68:   myPuts(hConOut, szTemp);
        !            69:   sprintf(szTemp, "ENABLE_ECHO_INPUT: %s", dwInputMode & ENABLE_ECHO_INPUT ?
        !            70:       "on" : "off");
        !            71:   myPuts(hConOut, szTemp);
        !            72:   sprintf(szTemp, "ENABLE_WINDOW_INPUT: %s", dwInputMode &
        !            73:       ENABLE_WINDOW_INPUT ? "on" : "off");
        !            74:   myPuts(hConOut, szTemp);
        !            75:   sprintf(szTemp, "ENABLE_PROCESSED_INPUT: %s", dwInputMode &
        !            76:       ENABLE_PROCESSED_INPUT ? "on" : "off");
        !            77:   myPuts(hConOut, szTemp);
        !            78:   bSuccess = GetConsoleMode(hConOut, &dwOutputMode);
        !            79:   PERR(bSuccess, "GetconsoleMode");
        !            80:   myPuts(hConOut, "\nCurrent console output modes:");
        !            81:   sprintf(szTemp, "ENABLE_PROCESSED_OUTPUT: %s", dwOutputMode &
        !            82:       ENABLE_PROCESSED_OUTPUT ? "on" : "off");
        !            83:   myPuts(hConOut, szTemp);
        !            84:   sprintf(szTemp, "ENABLE_WRAP_AT_EOL_OUTPUT: %s", dwOutputMode &
        !            85:       ENABLE_WRAP_AT_EOL_OUTPUT ? "on" : "off");
        !            86:   myPuts(hConOut, szTemp);
        !            87:   bSuccess = SetConsoleMode(hConOut, dwOutputMode);  /* back to normal */
        !            88:   PERR(bSuccess, "SetConsoleMode");
        !            89:   myPuts(hConOut, "\nHit enter to continue...");
        !            90:   myGetchar();
        !            91:   cls(hConOut);
        !            92:   myPuts(hConOut, "\nLet's test the console output modes with SetConsoleMode.\n"
        !            93:                   "First we'll output a long line of text with\n"
        !            94:                   "ENABLE_WRAP_AT_EOL_OUTPUT enabled, then with it disabled:\n");
        !            95:   myPuts(hConOut, szLong);
        !            96:   myPuts(hConOut, "\nNow we'll disable ENABLE_WRAP_AT_EOL_OUTPUT and display the same\n"
        !            97:                   "string. Note how the wrapped line does NOT get displayed\n"
        !            98:                   "on the next line but on the same line:\n");
        !            99:   /* turn off EOL wrap */
        !           100:   bSuccess = SetConsoleMode(hConOut, dwOutputMode &
        !           101:       ~ENABLE_WRAP_AT_EOL_OUTPUT);
        !           102:   PERR(bSuccess, "SetConsoleMode");
        !           103:   myPuts(hConOut, szLong);
        !           104:   /* turn on EOL wrap */
        !           105:   bSuccess = SetConsoleMode(hConOut, dwOutputMode |
        !           106:       ENABLE_WRAP_AT_EOL_OUTPUT);
        !           107:   PERR(bSuccess, "SetConsoleMode");
        !           108:   myPuts(hConOut, "\n\nNow let's test processed output. We'll output a string\n"
        !           109:                   "with ENABLE_PROCESSED_OUTPUT disabled, then with it enabled.\n"
        !           110:                   "Note how the backspace, tab, bell, carriage return, and\n"
        !           111:                   "linefeed characters are processed differently:\n");
        !           112:   /* turn off processed ("cooked") output - now in "raw" mode */
        !           113:   bSuccess = SetConsoleMode(hConOut, dwOutputMode & ~ENABLE_PROCESSED_OUTPUT);
        !           114:   PERR(bSuccess, "SetConsoleMode");
        !           115:   /* myPuts() appends a \n, so can't use it for this case */
        !           116:   bSuccess = WriteFile(hConOut, szModeTst, strlen(szModeTst), &dwRead, NULL);
        !           117:   PERR(bSuccess, "WriteFile");
        !           118:   /* turn processed ("cooked") mode back on */
        !           119:   bSuccess = SetConsoleMode(hConOut, dwOutputMode | ENABLE_PROCESSED_OUTPUT);
        !           120:   PERR(bSuccess, "SetConsoleMode");
        !           121:   myPuts(hConOut, "\nNow we'll set ENABLE_PROCESSED_OUTPUT and output the same\n"
        !           122:                   "string:\n");
        !           123:   myPuts(hConOut, szModeTst);
        !           124:   myPuts(hConOut, "\nHit enter for the next test...");
        !           125:   myGetchar();
        !           126:   cls(hConOut);
        !           127:   myPuts(hConOut, "Now let's test the input modes. First you'll input\n"
        !           128:                   "an input string with ENABLE_PROCESSED_INPUT enabled.\n"
        !           129:                   "We'll output exactly what was read in this mode.\n"
        !           130:                   "Note how characters such as backspace, tab, ctrl+g,\n"
        !           131:                   "carriage return and line feed are interpreted.\n"
        !           132:                   "Enter a line of text, end by hitting enter:");
        !           133:   /* turn on processed, line, and echo modes. */
        !           134:   /* MUST turn on echo mode when turning on line mode */
        !           135:   bSuccess = SetConsoleMode(hStdIn, dwInputMode | ENABLE_PROCESSED_INPUT |
        !           136:       ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
        !           137:   PERR(bSuccess, "SetConsoleMode");
        !           138:   memset(chBuf, 0, sizeof(chBuf));
        !           139:   bSuccess = ReadFile(hStdIn, chBuf, sizeof(chBuf), &dwRead, NULL);
        !           140:   PERR(bSuccess, "ReadFile");
        !           141:   /* output the contents of chBuf in raw mode */
        !           142:   rawOut(hConOut, chBuf);
        !           143:   myPuts(hConOut, "\nNow let's disable ENABLE_PROCESSED_INPUT. Enter another\n"
        !           144:                   "input string:");
        !           145:   /* turn off processed, line, and echo input. */
        !           146:   /* MUST turn off echo input when turning off line input */
        !           147:   bSuccess = SetConsoleMode(hStdIn, dwInputMode & ~ENABLE_PROCESSED_INPUT |
        !           148:       ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
        !           149:   PERR(bSuccess, "SetConsoleMode");
        !           150:   memset(chBuf, 0, sizeof(chBuf));
        !           151:   bSuccess = ReadFile(hStdIn, chBuf, sizeof(chBuf), &dwRead, NULL);
        !           152:   PERR(bSuccess, "ReadFile");    
        !           153:   rawOut(hConOut, chBuf);
        !           154:   myPuts(hConOut, "\nHit enter to continue...");
        !           155:   myGetchar();
        !           156:   cls(hConOut);
        !           157:   myPuts(hConOut, "\n\nLet's turn off ENABLE_LINE_INPUT - all of our input\n"
        !           158:                   "previously has been line-input. We must also disable\n"
        !           159:                   "ENABLE_ECHO_INPUT when disabling this flag. Let's read\n"
        !           160:                   "a single character from the console and we will return\n"
        !           161:                   "immediately with the charater read. Note that the character\n"
        !           162:                   "does not echo. Hit any key:");
        !           163:   bSuccess = SetConsoleMode(hStdIn, dwInputMode & ~ENABLE_LINE_INPUT &
        !           164:       ~ENABLE_ECHO_INPUT);
        !           165:   PERR(bSuccess, "SetConsoleMode");
        !           166:   memset(chBuf, 0, sizeof(chBuf));
        !           167:     bSuccess = ReadFile(hStdIn, chBuf, sizeof(chBuf), &dwRead, NULL);
        !           168:   PERR(bSuccess, "ReadFile");    
        !           169:   myPuts(hConOut, "\nHere is the character read:");
        !           170:   myPuts(hConOut, chBuf);
        !           171:   myPuts(hConOut, "\n\nHit enter to continue...");
        !           172:   bSuccess = SetConsoleMode(hStdIn, dwInputMode | ENABLE_WINDOW_INPUT);
        !           173:   PERR(bSuccess, "SetConsoleMode");
        !           174:   myGetchar();
        !           175:   return;
        !           176: }

unix.superglobalmegacorp.com

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