home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / util / mayflower.lha / MayFlower / CapsLock / cf / capslock.c
C/C++ Source or Header  |  1994-03-17  |  3KB  |  73 lines

  1. /* 17 Mar 1994 */
  2. #include "mem:h/main.h"
  3. #define KEYMATRIXSIZE 24
  4.  
  5. /* __saveds not needed when using compiler option STRMER */
  6. LONG __asm capslock( register __d0 int cmdlen, register __a0 char *cmd ) {
  7.    struct DosLibrary *DOSBase;
  8.    struct IOStdReq KeyIO;
  9.    char KeyMatrix[ KEYMATRIXSIZE ];
  10.    LONG result = RETURN_FAIL;
  11.  
  12.    /* Note: Should check for Workbench message and exit appropriatly */
  13.  
  14.    if( DOSBase = (DL_S*) OpenLibrary( "dos.library", 0 )) {
  15.      register struct IOStdReq *keyio = &KeyIO;
  16.      register char *errarg = NULL;
  17.      register ULONG i1;
  18.      register LONG capsresult = RETURN_WARN;  /* default */
  19.  
  20.      /* check for command line options */
  21.      for( i1 = 0; i1 < cmdlen; i1++ ) {
  22.        register char c = *(cmd + i1) | ' ';
  23.  
  24.        if( c == '?' ) {
  25.          cmd = "Script Usage> CapsLock [option]\n"
  26.                "option w = if CAPSLOCK lit return WARN (default)\n"
  27.                "       e = if CAPSLOCK lit return ERROR\n"
  28.                "       f = if CAPSLOCK lit return FAIL"; goto exitsub;
  29.        }
  30.        if( c == 'e' ) capsresult = RETURN_ERROR;
  31.        if( c == 'f' ) capsresult = RETURN_FAIL;
  32.      }
  33.  
  34.      /* fill stuff with zero */
  35.      for( i1 = 0; i1 < KEYMATRIXSIZE; i1++ ) KeyMatrix[i1] = 0;
  36.  
  37.      errarg = (char *) keyio;
  38.      for( i1 = 0; i1 < sizeof( IOSR_S ); i1++ ) *(errarg + i1) = 0;
  39.  
  40.      cmd = "no "; errarg = "keyboard.device";
  41.      if( !OpenDevice( errarg, NULL, (IOR_S *) keyio, NULL )) {
  42.        register struct ExecBase *ExecBase = (EB_S*) *((ULONG *) 4L);
  43.  
  44.        /* Must check for version and set io_Length accordingly:
  45.           Kickstart v34 or earlier uses length 13,
  46.           v35 or greater [<--assumption] than use length 20 */
  47.        if( ExecBase->LibNode.lib_Version < 35 ) keyio->io_Length = 13;
  48.        else keyio->io_Length = 20;
  49.  
  50.        keyio->io_Command = KBD_READMATRIX;
  51.        keyio->io_Data = (APTR) &KeyMatrix[0];
  52.  
  53.        /* io_Length must be 13 for Kickstart V34 (Workbench 1.3)
  54.           else DoIO() will return fail */
  55.        cmd = "io err"; errarg = NULL;
  56.        if( !(DoIO( (IOR_S *) keyio ))) {
  57.          if( KeyMatrix[12] & (1 << 2) ) result = capsresult;
  58.          else result = RETURN_OK;
  59.          cmd = NULL;    /* no errors to report */
  60.        }
  61.        CloseDevice( (IOR_S *) keyio );
  62.      }
  63. exitsub:
  64.      if( cmd ) {
  65.        register LONG ofh = (LONG) Output();
  66.        Write( (BPTR) ofh, cmd, strlen( cmd ));
  67.        if( errarg ) Write( (BPTR) ofh, errarg, strlen( errarg ));
  68.        Write( (BPTR) ofh, "\n", 1 ); }
  69.      CloseLibrary( (L_S*) DOSBase );
  70.    }
  71.    return( result );
  72. }
  73.