#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <process.h>


/*Las siguientes definiciones son necesarias para acceder al buffer de teclado*/
/*los punteros FAR nos permiten acceder a direcciones de memoria que no se pueden*/
/*alcanzar con los punteros normales*/

#ifdef __TURBOC__
 #define FAR far
#else
 #define FAR _far
#endif


/*Macro para evitar teclear fputs(str"\n", stderr) cada vez*/
#define Escribe(str) fputs(str"\n", stderr)


/*INCOMPLETO : */
/*ActivaBit es una funcion que activa el bit de la posicion que corresponda     */
/*dentro de todos los bits que tenga arg.Esto se implementa con una operacion OR*/
/*------------------------------------------------------------------------------*/
/*DesactivaBit: funcion que desactiva el bit de la posicion deseada dentro de */
/*todos los bits que tenga arg, se hace con una operacion and y el negado ~ de 1L*/
/*------------------------------------------------------------------------------*/

#define ActivaBit(arg,posn) ((?????) | (?????) ) 
#define DesactivaBit(arg,posn) (????? & ~(???????))

/*------------------------------------------------------------------------------*/

#define LOCKS_POSN 4
#define BYTE unsigned char /* declaramos BYTE como un unsigned char (8 bits)*/

BYTE FAR *estado_teclado = (BYTE FAR *) ????????L;


void sintaxis(void)
{
      Escribe("Sintaxis: TECLADO {+|-}[switches] [...{+|-}[switches]]");
      Escribe("Donde \"switches\" son uno o mas de :");
      Escribe(" +/-C - Activa o desactiva las mayusculas");
      Escribe(" +/-N - Activa o desactiva Teclado Numerico");
      Escribe(" +/-S - Activa o desactiva Scroll Lock");
      Escribe("Los switches puede ir en mayusculas o minusculas\n");
      Escribe("Ejemplo: \"TECLADO +Cn -S\" Activa mayusculas y teclado numerico "
            "y desactiva scroll lock");
      exit(-1);
}

int main(int argc, char *argv[])
{
      int i, j;
      char *args = "SNC";
      BYTE bits_estado = *teclado_estado; 

      if (2 > argc) sintaxis();
      for (i = 1; i < argc; ++i)
      {
            if (NULL == strchr("+-", *argv[i])) sintaxis();

            for (j = 1; argv[i][j]; ++j)
            {
                  char *encontrado;

                  if (NULL != (encontrado = strchr(args, toupper(argv[i][j]))))
                  {
                        int posn = LOCKS_POSN + (encontrado - args);

                        if ('+' == *argv[i])
                              bits_estado = (BYTE)????????????(bits_estado, posn);
                        else  bits_estado = (BYTE)????????????(bits_estado, posn);
                  }
                  else  sintaxis();
            }
      }
      *estado_teclado = bits_estado;                    
      return(0);
}
