home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / xdme_1.84_src.lha / XDME / Src / Mod / varaddes.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-03  |  6.3 KB  |  255 lines

  1. /******************************************************************************
  2.  
  3.     MODULE
  4.     VarAddes.c
  5.  
  6.     Some Variable Manipulation Commands
  7.  
  8.     DESCRIPTION
  9.     XDME Command Module
  10.  
  11.     BUGS
  12.     none known
  13.  
  14.     TODO
  15.     tell me
  16.  
  17.     EXAMPLES
  18.  
  19.     SEE ALSO
  20.  
  21.     INDEX
  22.  
  23.     HISTORY
  24.     12-11-94 b_noll created
  25.  
  26. ******************************************************************************/
  27.  
  28.  
  29. /**************************************
  30.           Includes
  31. **************************************/
  32.  
  33. /* #include "defs.h" */
  34. #include "xdme_base.h"
  35.  
  36. /**************************************
  37.       Internal Defines & Structures
  38. **************************************/
  39.  
  40. #define VA_OK            0
  41. #define VA_NOMEMORY        1
  42. #define VA_POSITION2FAR     2
  43. #define VA_UNKNOWNPOS        3
  44. #define VA_PATTERNNOTFOUND    4
  45. #define VA_NOSUCHVAR        5
  46. #define VA_VARNOTSET        6
  47.  
  48. #define ALNUM "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
  49.  
  50. /**************************************
  51.          Macros
  52. **************************************/
  53.  
  54. #define ToAssign(cp) do{ while ((*cp) && (*cp != '=')) cp++; if (*cp) cp++; }while(0)
  55.  
  56. /**************************************
  57.          Implementation
  58. **************************************/
  59.  
  60. /* delete max len characters in a string */
  61. void strdel (char *str, int len) {
  62.     int rlen;
  63.     rlen = strlen (str);
  64.     if (rlen < len)
  65.     len = rlen;
  66.     rlen -= len;
  67.  
  68.     /* ---- this works only, if strcpy() walks from start to end */
  69.     strcpy (str, str + len);
  70.  
  71.     /*        for sure the following way should be used: */
  72.     /* strncpy (str, str+len, len); */
  73.     /* if (rlen > len) */
  74.     /*       strcpy (str+len, str+len+len); */
  75. } /* strdel */
  76.  
  77.  
  78.  
  79. static int VA_beginVariableAccess (const char *vname, const char *pos, void **vlock0, int *vlock1, char **value, ULONG *position) {
  80.  
  81.     *value    = NULL;
  82.     *vlock0   = NULL;
  83.     *vlock1   = 0;
  84.     *position = 0;
  85.  
  86.     if ((*value = GetTypedVar (vname, vlock1)) == VAR_NEX) {
  87.     return VA_NOSUCHVAR;
  88.     } /* if */
  89.     *vlock0 = vname;
  90.  
  91.     if (pos)
  92.     switch (*pos | 32) {
  93.     case 'c': /* character# */
  94.         ToAssign(pos);
  95.         {
  96.         int ipos = atoi (pos);
  97.         if (ipos < 0) {
  98.             ipos = strlen (*value) - (ipos - 1);
  99.             *position = ipos;
  100.         } else if (ipos)
  101.             *position = ipos - 1;
  102.         else
  103.             *position = 0;
  104.         }
  105.         break;
  106.     case 'w': /* word# */
  107.         ToAssign(pos);
  108.         {
  109.         int   l = 0;
  110.         int   i = atoi (pos);
  111. //int z = 0;
  112.         if (i) --i;
  113. //printf ("searching word #%d\n", i);
  114.         for (pos = strpbrk(*value, ALNUM); (i && (pos)); pos = strpbrk (pos + l, ALNUM)) {
  115. //printf ("#%d:%s\n", z++, pos);
  116.             --i;
  117.             l = strspn (pos, ALNUM);
  118.             if (!l)
  119.             break;
  120.         } /* for */
  121. //printf ("rest: %d, %d, %s\n", i, l, pos);
  122.         if (i || !pos) {
  123.             return VA_POSITION2FAR;
  124.         } /* if */
  125.         *position = pos - *value;
  126.         }
  127.         break;
  128.     case 'p': /* pattern */
  129.         ToAssign(pos);
  130.         pos = strstr (*value, pos);
  131.         if (pos)
  132.         *position = (ULONG)(pos - *value);
  133.         else
  134.         return VA_PATTERNNOTFOUND;
  135.         break;
  136.     case 's': /* start */
  137.         *position = 0;
  138.         break;
  139.     case 'e': /* end */
  140.         *position = strlen (*value);
  141.         break;
  142.     default:
  143.         return VA_UNKNOWNPOS;
  144.     } /* switch */
  145.  
  146.     if (*position > strlen (*value)) {
  147.     return VA_POSITION2FAR;
  148.     } /* if */
  149.     return VA_OK;
  150. } /* VA_beginVariableAccess */
  151.  
  152. static void VA_endVariableAccess (void *vlock0, int vlock1, char *value)
  153. {
  154.     if (value)
  155.     free (value);
  156. } /* VA_endVariableAccess */
  157.  
  158.  
  159.  
  160. static int VA_InsTextIntoVariable (const char *vname, const char *pos, const char *text)
  161. {
  162.     APTR vl0; int vl1;
  163.     char *value;
  164.     ULONG position;
  165.     int rv;
  166.  
  167.     if ((rv = VA_beginVariableAccess(vname, pos, &vl0, &vl1, &value, &position)) == VA_OK) {
  168.     char *buffer;
  169.     if ((buffer = malloc(strlen(text) + strlen(value) + 1))) {
  170.         strcpy (buffer, value);
  171.         strins (buffer + position, text);
  172.         rv = SetTypedVar (vl0, buffer, vl1)? VA_OK: VA_VARNOTSET;
  173.         free (buffer);
  174.     } else {
  175.         rv = VA_NOMEMORY;
  176.     } /* if */
  177.     } /* if */
  178.  
  179.     VA_endVariableAccess(vl0, vl1, value);
  180.     return rv;
  181. } /* VA_InsTextIntoVariable */
  182.  
  183. static int VA_RemTextFromVariable (const char *vname, const char *pos, int len)
  184. {
  185.     APTR vl0; int vl1;
  186.     char *value;
  187.     ULONG position;
  188.     int rv;
  189.  
  190.     if ((rv = VA_beginVariableAccess(vname, pos, &vl0, &vl1, &value, &position)) == VA_OK) {
  191.     char *buffer;
  192.     if ((buffer = strdup(value))) {
  193.         strdel (buffer + position, len);
  194.         rv = SetTypedVar (vl0, buffer, vl1)? VA_OK: VA_VARNOTSET;
  195.         free (buffer);
  196.     } else {
  197.         rv = VA_NOMEMORY;
  198.     } /* if */
  199.     } /* if */
  200.  
  201.     VA_endVariableAccess(vl0, vl1, value);
  202.     return rv;
  203. } /* VA_RemTextFromVariale */
  204.  
  205. static int VA_Error (int code, char ** av)
  206. {
  207.     switch (code) {
  208.     case VA_OK:
  209.     return RET_SUCC;
  210.     case VA_NOMEMORY:
  211.     nomemory();
  212.     break;
  213.     case VA_POSITION2FAR:
  214.     error ("%s:\nPosition '%s' exceeds bounds of variable '%s'", av[0], av[2], av[1]);
  215.     break;
  216.     case VA_UNKNOWNPOS:
  217.     error ("%s:\nUnknown position directive '%s'", av[0], av[2]);
  218.     break;
  219.     case VA_PATTERNNOTFOUND:
  220.     error ("%s:\nPattern '%s' not found in variable '%s'", av[0], av[2], av[1]);
  221.     break;
  222.     case VA_NOSUCHVAR:
  223.     error ("%s:\nVariable '%s' not found", av[0], av[1]);
  224.     break;
  225.     case VA_VARNOTSET:
  226.     error ("%s:\nSet failed for '%s'", av[0], av[1]);
  227.     break;
  228.     default:
  229.     error ("%s:\nError %ld", av[0], (long)code);
  230.     } /* switch */
  231.     return RET_FAIL;
  232. } /* VA_Error */
  233.  
  234. /***************************************************
  235.         COMMAND INTERFACE
  236. ***************************************************/
  237.  
  238. /*DEFHELP #cmd var INSVAR var where value -Insert a string into the variable @{B}var@{UB} at position @{B}where@{UB};
  239. @{B}wher@{UB} can be @{B}Char@{UB}=n a characterno, @{B}Word@{UB}=n a wordno, @{B}Start@{UB} start, @{B}End@{UB} end or @{B}Pattern@{UB}=txt a subword */
  240. DEFUSERCMD("InsVar", 3, CF_VWM|CF_ICO|CF_COK, void, do_insV, (void), )
  241. {
  242.     VA_Error(VA_InsTextIntoVariable(av[1], av[2], av[3]), av);
  243. }
  244.  
  245. /*DEFHELP #cmd var REMVAR var where len -Delete @{B}len@{UB} characters from the variable @{B}var@{UB} at position @{B}where@{UB};
  246. @{B}wher@{UB} can be @{B}Char@{UB}=n a characterno, @{B}Word@{UB}=n a wordno, @{B}Start@{UB} start, @{B}End@{UB} end or @{B}Pattern@{UB}=txt a subword */
  247. DEFUSERCMD("RemVar", 3, CF_VWM|CF_ICO|CF_COK, void, do_remV, (void), )
  248. {
  249.     VA_Error(VA_RemTextFromVariable(av[1], av[2], atol(av[3])), av);
  250. }
  251.  
  252. /******************************************************************************
  253. *****  END VarAddes.c
  254. ******************************************************************************/
  255.