home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / comms / network / amigaelm.lzh / alias.c next >
C/C++ Source or Header  |  1992-02-24  |  4KB  |  228 lines

  1. #include "prefs.h"
  2. #ifdef LATTICE
  3. #include <dos.h>
  4. #endif
  5. #ifdef DICE
  6. #include <libraries/dos.h>
  7. #endif
  8.  
  9.  
  10.  
  11. Prototype void ReadAliasList(void);
  12. Prototype void FreeAliasList(struct AliasItem **);
  13. Prototype char *GetAlias(struct AliasItem *, char *);
  14. Prototype void PutAlias(struct AliasItem **, char *, char *);
  15. Prototype struct AliasItem *AdrsToAList(char *);
  16. Prototype char *delete_wspaces_begin(char *);
  17. Prototype char *delete_wspaces_end(char *);
  18.  
  19.  
  20.  
  21. void ReadAliasList(void)
  22. {
  23.     FILE *fp;
  24.     char *a,*r,*p;
  25.     char line[MAX_LINELENGTH];
  26.     struct AliasItem *list,*l;
  27.  
  28.     strcpy(line,UULIB);
  29.     strcat(line,UserName);
  30.     strcat(line,ELM_ALIASES);
  31.     if (!(fp=fopen(line,"r"))) {
  32.       strcpy(line,UULIB);
  33.       strcat(line,ELM_ALIASES);
  34.       if (!(fp=fopen(line,"r"))) {
  35.         return;
  36.       }
  37.     }
  38.  
  39.     while(fgets(line,MAX_LINELENGTH-1,fp)) {
  40.       removeCR(line);
  41.  
  42.       if (*line!='#' && (r = strchr(line,'='))) {
  43.         *r = '\0';
  44.         a = delete_wspaces_begin(line);
  45.         p = r-1;
  46.         while (p>=a && (*p==' ' || *p=='\t'))
  47.           p--;
  48.         p++;
  49.         *p = '\0';
  50.  
  51.         r = delete_wspaces_begin(r+1);
  52.         delete_wspaces_end(r);
  53.  
  54.         if (a && r && strlen(a) && strlen(r)) {
  55.  
  56.           l = list = AdrsToAList(a);
  57.  
  58.           while (l) {
  59.             if (GetAlias(AliasList,l->alias))
  60.               fprintf(stderr,"elm: alias %s defined twice\n",l->alias);
  61.             else
  62.               PutAlias(&AliasList,l->alias,r);
  63.  
  64.             l = l->next;
  65.           }
  66.  
  67.           FreeAliasList(&list);
  68.  
  69.         }
  70.       }
  71.     }
  72.  
  73.     fclose(fp);
  74. }
  75.  
  76.  
  77.  
  78. void FreeAliasList(struct AliasItem **list)
  79. {
  80.   struct AliasItem *i;
  81.  
  82.   while (*list) {
  83.     i = *list;
  84.     *list = (*list)->next;
  85.     free(i->alias);
  86.     free(i->real);
  87.     free(i);
  88.   }
  89.  
  90.   *list = NULL;
  91. }
  92.  
  93.  
  94.  
  95. void PutAlias(struct AliasItem **list, char *alias, char *real)
  96. {
  97.   struct AliasItem *i,*l;
  98.  
  99.   if (i=malloc(sizeof(struct AliasItem))) {
  100.  
  101.     if (alias)
  102.       i->alias = strdup(alias);
  103.     else
  104.       i->alias = NULL;
  105.  
  106.     if (real)
  107.       i->real = strdup(real);
  108.     else
  109.       i->real = NULL;
  110.  
  111.     i->next = NULL;
  112.  
  113.     if (*list) {
  114.       for (l = *list ; l->next ; l=l->next )
  115.         ;
  116.       l->next = i;
  117.     }
  118.     else {
  119.       *list = i;
  120.     }
  121.     /*printf("Alias: %s -> %s\n",i->alias,i->real);*/
  122.   }
  123. }
  124.  
  125.  
  126.  
  127. char *GetAlias(struct AliasItem *list, char *alias)
  128. {
  129.   struct AliasItem *i;
  130.  
  131.   if (alias && strlen(alias)) {
  132.     for (i=list;i;i=i->next)
  133.       if (!strcmp(i->alias,alias))
  134.         return(i->real);
  135.   }
  136.  
  137.   return(NULL);
  138. }
  139.  
  140.  
  141.  
  142. char *delete_wspaces_begin(char *str)
  143. {
  144.   if (str)
  145.     while (*str==' ' || *str=='\t')
  146.       str++;
  147.  
  148.   return(str);
  149. }
  150.  
  151.  
  152.  
  153. char *delete_wspaces_end(char *str)
  154. {
  155.   char *p;
  156.  
  157.   if (str) {
  158.     for (p = str+strlen(str)-1 ; p>=str && (*p==' ' || *p=='\t') ; p--)
  159.       *p = '\0';
  160.   }
  161.  
  162.   return(str);
  163. }
  164.  
  165.  
  166.  
  167. /* Addresses to Alias List */
  168. struct AliasItem *AdrsToAList(char *adrs)
  169. {
  170.   char *p,*ptr;
  171.   long klammer=0L;
  172.   BOOL gans = FALSE;
  173.   struct AliasItem *list = NULL;
  174.  
  175.   if (adrs && strlen(adrs) && (ptr = malloc(strlen(adrs)+2))) {
  176.  
  177.     strcpy(ptr,adrs);
  178.     ptr[strlen(ptr)+1] = '\0';    /* TWO null bytes !!!! */
  179.  
  180.     p = ptr;
  181.  
  182.     while (*p) {
  183.       if (*p=='\t') {
  184.         *p = ' ';
  185.         p++;
  186.       }
  187.       else if (*p=='\r'  || *p=='\n') {
  188.         char *c=p;
  189.         while(*c) {
  190.           *c = *(c+1);
  191.           c++;
  192.         }
  193.       }
  194.       else
  195.         p++;
  196.     }
  197.  
  198.     p = ptr;
  199.  
  200.     while (*p || *(p-1)) {
  201.       if (*p=='\0' || (*p==',' && !klammer && !gans)) {
  202.         char *ptrend = p-1;
  203.         while (ptrend>=ptr && *ptrend==' ')
  204.           ptrend--;
  205.         ptrend++;
  206.         *ptrend='\0';
  207.         while(*ptr==' ')
  208.           ptr++;
  209.         if (strlen(ptr))
  210.           PutAlias(&list,ptr,GetAlias(AliasList,ptr));
  211.         /*printf("adr: %s, %s\n",ptr,GetAlias(AliasList,ptr));*/
  212.         /*printf("adr: -> %s <-\n",strlen(ptr)?ptr:"(leer)");*/
  213.         ptr=p+1;
  214.       }
  215.       else if (*p=='(' || *p=='<' || *p=='[' || *p=='{')
  216.         klammer++;
  217.       else if (*p==')' || *p=='>' || *p==']' || *p=='}')
  218.         klammer--;
  219.       else if (*p=='\"')
  220.         gans=!gans;
  221.       p++;
  222.     }
  223.   }
  224.  
  225.   return(list);
  226. }
  227.  
  228.