home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD v1.2 / amidev_cd_12.iso / devcon / sanfrancisco_1989 / sf-devcon89.1 / commodities / lattice / cxsupp / invert.c < prev    next >
C/C++ Source or Header  |  1992-08-27  |  2KB  |  157 lines

  1. /* invert.c -- string-to-inputevents    */
  2.  
  3. #include "sysall.h"
  4. #include "cx/cxusr.h"
  5.  
  6. #define D(x)    ;
  7.  
  8. extern struct Library    *CxBase;
  9.  
  10. struct InputEvent    *
  11. InvertString(str, km)
  12. UBYTE    *str;
  13. CPTR    *km;        /* keymap    */
  14. {
  15.     /* bugs:
  16.         can't escape '>'
  17.         puts '\0' on closing angles
  18.      */
  19.     /* allocate input event for each character in string    */
  20.  
  21.     struct InputEvent    *chain = NULL;
  22.     struct InputEvent    *tail;
  23.     struct InputEvent    *ie;
  24.     int                    abort = 0;
  25.     UBYTE                cc;
  26.  
  27.     BYTE doesc();
  28.  
  29.     if (!str || !*str) return (NULL);
  30.  
  31.     tail = (struct InputEvent *) &chain;    /* jvudu    */
  32.  
  33.     do {    /* have checked that str is not null     */
  34.         /* allocate the next ie and link it in    */
  35.         if (!(ie = 
  36.             AllocMem((LONG) sizeof (struct InputEvent), (LONG) MEMF_CLEAR)))
  37.         {
  38.             abort = 1;
  39.             goto DONE;
  40.         }
  41.         tail->ie_NextEvent = ie;    /* link in */
  42.         tail = ie;
  43.  
  44.         /* now fill in the input event    */
  45.         switch (cc = *str)
  46.         {
  47.         case    '<':
  48.             ++str;
  49.             if (!doangle(&str, ie)) 
  50.             {
  51.                 D( printf("doangle failed.  abort\n") );
  52.                 abort = 1;
  53.                 goto DONE;
  54.             }
  55.             break;
  56.  
  57.         case    '\\':
  58.             D( printf("is: doesc\n"); )
  59.             if ((cc = doesc( *(++str) )) == -1)    /* get escaped character    */
  60.             {
  61.                 abort = 1;
  62.                 goto DONE;
  63.             }
  64.             /* fall through    */
  65.         default:
  66.             InvertKeyMap((ULONG) cc, ie, km);
  67.         }
  68.  
  69.  
  70.     } while (*(++str));
  71.  
  72. DONE:
  73.     if (abort)
  74.     {
  75.         FreeIEvents(ie);
  76.         return (NULL);
  77.     }
  78.     return (chain);
  79. }
  80.  
  81. BYTE
  82. doesc(cc)
  83. BYTE    cc;
  84. {
  85.     switch(cc)
  86.     {
  87.     case    'n':    /* \n means "return"    */
  88.     case    'r':
  89.         return ('\r');
  90.         break;
  91.     case    't':
  92.         return ('\t');
  93.         break;
  94.     case    '0':
  95.         return ('\0');
  96.         break;
  97.  
  98.     case    '\\':
  99.     case    '\"':
  100.     case    '\'':
  101.     case    '<':
  102.         break;
  103.     default:
  104.         cc = -1;
  105.     }
  106.  
  107.     return (cc);
  108. }
  109.  
  110. /* return 0 if problem    */
  111. doangle(strp, ie)
  112. char                **strp;
  113. struct InputEvent    *ie;
  114. {
  115.     IX    ix;
  116.     char    *cp = NULL;
  117.     ULONG    retval;
  118.  
  119.     /* find closing angle '>', put a null there    */
  120.     for (cp = *strp; *cp; ++cp)
  121.     {
  122.         if (*cp == '>')
  123.         {
  124.             D( printf("found >") );
  125.             *cp = '\0';
  126.             break;
  127.         }
  128.         D( printf("> look past %c\n", *cp) );
  129.     }
  130.  
  131.     retval = ParseIX(*strp, &ix);
  132.  
  133.     D( printf("> parseix back\n") );
  134.  
  135.     if (cp)
  136.     {
  137.         *cp = '>';    /* fix it    */
  138.         *strp = cp;    /* point to char following '>'    */
  139.     }
  140.     else
  141.     {
  142.         *strp = cp - 1;    /* ++will point to terminating null    */
  143.     }
  144.  
  145.     if (retval)     /* error */
  146.     {
  147.         return (0);
  148.     }
  149.  
  150.     /* use IX to describe a suitable InputEvent    */
  151.     ie->ie_Class        = ix.ix_Class;
  152.     ie->ie_Code            = ix.ix_Code;
  153.     ie->ie_Qualifier    = ix.ix_Qualifier;
  154.  
  155.     return (1);
  156. }
  157.