home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / EXAMPLES / DEMOMODE.C < prev    next >
C/C++ Source or Header  |  1991-03-09  |  9KB  |  254 lines

  1. /*
  2.     demomode.c
  3.  
  4.     ted 9/89
  5.  
  6.     C-scape 3.2    Example Program
  7.     Copyright (c) 1990 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.     
  10.     This program is a utility for managing the display modes accessible from
  11.     the C-scape library. It detects the current mode, detects whether a given
  12.     mode is supported by your display hardware, and sets the hardware to any
  13.     supported mode that you specify.
  14.  
  15.     For instructions on how to use this program, see the message it prints out
  16.     when you use the '-h' option:  "demomode -h".
  17.  
  18.     This program relies only on the PC-specific portion of the Oakland
  19.     Windowing Library (OWL).  All the C-scape functions used by this program
  20.     are declared in the header file "pcmode.h".
  21.  
  22.     Revision History:
  23.     -----------------
  24.     10/17/90 ted    fixed help options and text mode operation.
  25.     12/01/90 ted    ansified function declarations of main() & showmode().
  26.     12/01/90 ted    added tag name for enum.
  27. */
  28.  
  29. static char cpyr[] = "Copyright (c) 1989, by Oakland Group, Inc.";
  30.  
  31. /* Version number: */
  32. static char major = 1;
  33. static char minor = 0;
  34.  
  35. #include <stdio.h>
  36. #include <string.h>
  37. #include <ctype.h>
  38.  
  39. #include "oak.h"
  40. #include "odisp.h"
  41. #include "pcmode.h"
  42.  
  43. typedef enum _msgkind {
  44.     SHOWMODE,
  45.     GETMODE,
  46.     SUPPORTED,
  47.     NOTSUPPORTED,
  48.     SUPPARGBAD,
  49.     NOARG,
  50.     HELP
  51. } msgkind;
  52.  
  53. #define XMODE_NONE        -1
  54. #define XMODE_GRAPHICS    -2
  55. #define XMODE_TEXT        -3
  56.  
  57. /* Turbo C++ complains if main is prototyped */
  58. #ifndef TCP
  59. int main(int argc, char *argv[]);
  60. #endif
  61.  
  62. int showmode(msgkind whichmsg);
  63.  
  64. /* -------------------------------------------------------------------------- */
  65.  
  66. int main(int argc, char *argv[])
  67. {
  68.     int iarg, imode, i;
  69.  
  70.     iarg = 1;
  71.  
  72.     if (argc <= iarg) {
  73.         return(showmode(NOARG));    /* Print the current mode, return 0 */
  74.     }
  75.     for (i = strlen(argv[iarg]); i > 0; i--) {
  76.         argv[iarg][i-1] = tolower(argv[iarg][i-1]);
  77.     }
  78.     if (!strcmp(argv[iarg], "h")    || !strcmp(argv[iarg], "-h") ||
  79.         !strcmp(argv[iarg], "help") || !strcmp(argv[iarg], "-help") ||
  80.         !strcmp(argv[iarg],  "?")   || !strcmp(argv[iarg],  "-?")) {
  81.         return(showmode(HELP));            /* Print out the help stuff */
  82.     }
  83.     if (!strcmp(argv[iarg], "support") ||
  84.         !strcmp(argv[iarg], "supp") ||
  85.         !strcmp(argv[iarg], "s")) {
  86.          iarg++;
  87.         if (argc <= iarg) {
  88.             return(showmode(SHOWMODE));    /* Print the current mode, return 0 */
  89.         }
  90.         for (i = strlen(argv[iarg]); i > 0; i--) argv[iarg][i-1] = tolower(argv[iarg][i-1]);
  91.     }
  92.     else if (!strcmp(argv[iarg], "current") ||
  93.              !strcmp(argv[iarg], "curr")) {
  94.         return(showmode(GETMODE));    /* Print the current mode, return mode # */
  95.     }
  96.  
  97.     imode = XMODE_NONE;
  98.     if      (!strcmp(argv[iarg], "0"))        { imode = 0; }
  99.     else if (!strcmp(argv[iarg], "1"))        { imode = 1; }
  100.     else if (!strcmp(argv[iarg], "2"))        { imode = 2; }
  101.     else if (!strcmp(argv[iarg], "3"))        { imode = 3; }
  102.     else if (!strcmp(argv[iarg], "4"))        { imode = 4; }
  103.     else if (!strcmp(argv[iarg], "5"))        { imode = 5; }
  104.     else if (!strcmp(argv[iarg], "6"))        { imode = 6; }
  105.     else if (!strcmp(argv[iarg], "7"))        { imode = 7; }
  106.     else if (!strcmp(argv[iarg], "d"))        { imode = 13; }
  107.     else if (!strcmp(argv[iarg], "e"))        { imode = 14; }
  108.     else if (!strcmp(argv[iarg], "f"))        { imode = 15; }
  109.     else if (!strcmp(argv[iarg], "10"))        { imode = 16; }
  110.     else if (!strcmp(argv[iarg], "11"))        { imode = 17; }
  111.     else if (!strcmp(argv[iarg], "12"))        { imode = 18; }
  112.     else if (!strcmp(argv[iarg], "13"))        { imode = 19; }
  113.     else if (!strcmp(argv[iarg], "13"))        { imode = 19; }
  114.     else if (!strcmp(argv[iarg], "g"))        { imode =  XMODE_GRAPHICS; }
  115.     else if (!strcmp(argv[iarg], "graphics")){ imode = XMODE_GRAPHICS; }
  116.     else if (!strcmp(argv[iarg], "t"))        { imode =  XMODE_TEXT; }
  117.     else if (!strcmp(argv[iarg], "text"))    { imode =  XMODE_TEXT; }
  118.     else if (!strcmp(argv[iarg], "h"))        { imode = PCMODE_HERC0; }
  119.     else if (!strcmp(argv[iarg], "h0"))        { imode = PCMODE_HERC0; }
  120.     else if (!strcmp(argv[iarg], "herc"))    { imode = PCMODE_HERC0; }
  121.     else if (!strcmp(argv[iarg], "herc0"))    { imode = PCMODE_HERC0; }
  122.     else if (!strcmp(argv[iarg], "h1"))        { imode = PCMODE_HERC1; }
  123.     else if (!strcmp(argv[iarg], "herc1"))    { imode = PCMODE_HERC1; }
  124.     else if (!strcmp(argv[iarg], "c"))        { imode = PCMODE_CPQ40; }
  125.     else if (!strcmp(argv[iarg], "compaq"))    { imode = PCMODE_CPQ40; }
  126.     else if (!strcmp(argv[iarg], "43"))        { imode = PCMODE_EGA43; }
  127.     else if (!strcmp(argv[iarg], "ega43"))    { imode = PCMODE_EGA43; }
  128.     else if (!strcmp(argv[iarg], "43line"))    { imode = PCMODE_EGA43; }
  129.     else if (!strcmp(argv[iarg], "50"))        { imode = PCMODE_VGA50; }
  130.     else if (!strcmp(argv[iarg], "vga50"))    { imode = PCMODE_VGA50; }
  131.     else if (!strcmp(argv[iarg], "50line"))    { imode = PCMODE_VGA50; }
  132.  
  133.     switch (imode) {
  134.     case XMODE_NONE:
  135.         return(showmode(HELP));            /* Print out the help stuff */
  136.     default:
  137.         if (pc_ModeSupport(imode)) {
  138.             if (iarg == 1) pc_SetMode(imode);
  139.         }
  140.         else return(showmode(NOTSUPPORTED)); /* Print the mode-not-supported msg */
  141.         break;
  142.     case XMODE_GRAPHICS:    /* Graphics */
  143.         if (iarg == 1) {
  144.             if (!pc_SetModeGraphics()) return(showmode(NOTSUPPORTED)); /* Print the mode-not-supported msg */
  145.         }
  146.         else return(showmode(SUPPARGBAD));    /* Print the bad-support-arg msg */
  147.         break;
  148.     case XMODE_TEXT:    /* Text */
  149.         if (iarg == 1) {
  150.             imode = pc_GetMode();
  151.             if (imode > 0x03 && imode != 0x07) {
  152.                 if (pc_ModeSupport(3)) {
  153.                     pc_SetMode(3);
  154.                 }
  155.                 else if (pc_ModeSupport(7)) {
  156.                     pc_SetMode(7);
  157.                 }
  158.             }
  159.         }
  160.         break;
  161.     }
  162.     if (iarg == 1) return(showmode(SHOWMODE));    /* New mode set; print it out */
  163.     else           return(showmode(SUPPORTED));    /* Print mode supported message */
  164. }
  165. /* -------------------------------------------------------------------------- */
  166.  
  167. int showmode(msgkind whichmsg)
  168. {
  169.     int currmode;
  170.  
  171.     printf("The Oakland PC video mode selector/detector utility, Version %d.%d\n", major, minor);
  172.     printf("%s\n", cpyr);
  173.  
  174.     switch (whichmsg) {
  175.     case SUPPORTED:
  176.         printf("The mode you specified is supported by your hardware.\n");
  177.         break;
  178.     case NOTSUPPORTED:
  179.         printf("The video mode you selected is not supported by your hardware.\n");
  180.         break;
  181.     case SUPPARGBAD:
  182.         printf("You must give a specific mode to find out if it's supported.\n");
  183.         break;
  184.     case NOARG:
  185.         printf("Use the '-h' option for a list of all options: \"demomode -h\".\n");
  186.         break;
  187.     case HELP:
  188.         printf("Usage: demomode [current | [support] <mode spec>]\n");
  189.         printf(" demomode <mode spec>         : Set the mode to the one specified\n");
  190.         printf(" demomode support <mode spec> : Say whether the specified mode is supported\n");
  191.         printf(" demomode current             : Display the current mode, set errorlevel to it\n");
  192.         printf("Mode specs recognized:\n");
  193.         printf(" 0,1,2,3    :  IBM CGA compatible text modes.\n");
  194.         printf(" 4,5,6      :  IBM CGA compatible graphics modes.\n");
  195.         printf(" 7          :  IBM compatible monochrome text mode.\n");
  196.         printf(" D,E,F,10   :  IBM EGA compatible graphics modes.\n");
  197.         printf(" 11,12,13   :  IBM VGA compatible graphics modes.\n");
  198.         printf(" herc,herc0 :  Hercules compatible graphics mode, page 0.\n");
  199.         printf(" herc1      :  Hercules compatible graphics mode, page 1.\n");
  200.         printf(" ega43,43   :  EGA compatible 43 line text mode.\n");
  201.         printf(" vga50,50   :  EGA compatible 50 line text mode.\n");
  202.         printf(" compaq,c   :  ATT/Compaq compatible 640x400 graphics mode.\n\n");
  203.         printf("On return, the DOS errorlevel is set to 0, except if the 'support'\n");
  204.         printf(" parameter was given and the specified mode was not supported,\n");
  205.         printf(" or if the 'current' parameter was given, in which case\n");
  206.         printf(" the errorlevel is set to the number of the current graphics mode.\n");
  207.         break;
  208.     }
  209.  
  210.     printf("The current mode is ");
  211.  
  212.     currmode = pc_GetMode();
  213.     switch(currmode) {
  214.     case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
  215.         printf("mode %d.", currmode);
  216.         break;
  217.     case 0xD: case 0xE: case 0xF: case 0x10: case 0x11: case 0x12: case 0x13:
  218.         printf("mode hex %x.", currmode);
  219.         break;
  220.     case PCMODE_EGA43:
  221.         printf("EGA 43 line text mode.");
  222.     case PCMODE_VGA50:
  223.         printf("VGA 50 line text mode.");
  224.         break;
  225.     case PCMODE_CPQ40:
  226.         printf("Compaq/ATT 640x400 graphics mode.");
  227.         break;
  228.     case PCMODE_HERC0:
  229.         printf("Hercules Graphics mode, page 0.");
  230.         break;
  231.     case PCMODE_HERC1:
  232.         printf("Hercules Graphics mode, page 1.");
  233.         break;
  234.     default:
  235.         printf("unrecognized.");
  236.         break;
  237.     }
  238.     switch (whichmsg) {
  239.     case GETMODE:
  240.         printf("\nSetting DOS errorlevel to mode # : %d", currmode);
  241.         return(currmode);
  242.     case SHOWMODE:
  243.     case SUPPORTED:
  244.     case HELP:
  245.     default:
  246.         return(0);
  247.     case NOTSUPPORTED:
  248.     case SUPPARGBAD:
  249.         return(1);
  250.     }
  251. }
  252. /* -------------------------------------------------------------------------- */
  253.  
  254.