param.c - rohrpost - A commandline mail client to change the world as we see it.
 (HTM) git clone git://r-36.net/rohrpost
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       param.c (1812B)
       ---
            1 /*
            2  * Copy me if you can.
            3  * by 20h
            4  */
            5 
            6 #include <unistd.h>
            7 #include <stdlib.h>
            8 #include <stdio.h>
            9 #include <string.h>
           10 
           11 #include "ind.h"
           12 
           13 char *
           14 paramenc(char *str, int len)
           15 {
           16         char *ret, add[6];
           17         int i, rlen, alen;
           18 
           19         ret = NULL;
           20         for (i = 0, rlen = 0; i < len; i++) {
           21                 if (str[i] < 0x20 || str[i] > 0x7E)
           22                         snprintf(add, sizeof(add), "%%%02x", str[i] & 0xFF);
           23                 else {
           24                         switch(str[i]) {
           25                         case ' ':
           26                                 add[0] = '_';
           27                                 add[1] = '\0';
           28                                 break;
           29                         case '\'':
           30                         case '_':
           31                         case '%':
           32                         case '(':
           33                         case ')':
           34                         case '<':
           35                         case '>':
           36                         case '@':
           37                         case ',':
           38                         case ';':
           39                         case ':':
           40                         case '\\':
           41                         case '"':
           42                         case '/':
           43                         case '[':
           44                         case ']':
           45                         case '?':
           46                         case '=':
           47                                 snprintf(add, sizeof(add), "%%%02x",
           48                                                 str[i] & 0xFF);
           49                                 break;
           50                         default:
           51                                 add[0] = str[i];
           52                                 add[1] = '\0';
           53                                 break;
           54                         }
           55                 }
           56                 alen = strlen(add);
           57                 ret = memdupcat(ret, rlen, add, alen+1);
           58                 rlen += alen;
           59         }
           60 
           61         return ret;
           62 }
           63 
           64 char *
           65 paramdec(char *str, int *len)
           66 {
           67         char *ret, add, abuf[3], *eabuf;
           68         int i, rlen, pbreak;
           69         long nval;
           70 
           71         ret = NULL;
           72         for (i = 0, rlen = 0; i < *len; i++) {
           73                 add = '\0';
           74                 pbreak = 0;
           75                 switch (str[i]) {
           76                 case '_':
           77                         add = ' ';
           78                         break;
           79                 case '%':
           80                         if (str[i+1] == '\n' || str[i+2] == '\0') {
           81                                 pbreak = 1;
           82                                 i++;
           83                                 break;
           84                         }
           85                         if (str[i+1] == '\0')
           86                                 break;
           87                         memmove(&abuf, &str[i+1], 2);
           88                         abuf[2] = '\0';
           89 
           90                         eabuf = NULL;
           91                         nval = strtol((char *)&abuf, &eabuf, 16);
           92                         if (eabuf != NULL && *eabuf != '\0')
           93                                 break;
           94 
           95                         add = (char)(nval & 0xFF);
           96                         i += 2;
           97                         break;
           98                 default:
           99                         add = str[i];
          100                         break;
          101                 }
          102                 if (pbreak)
          103                         continue;
          104                 if (add == '\0')
          105                         break;
          106 
          107                 ret = reallocz(ret, ++rlen+1, 0);
          108                 ret[rlen-1] = add;
          109                 ret[rlen] = '\0';
          110         }
          111         if (add == '\0' && ret != NULL) {
          112                 free(ret);
          113                 return NULL;
          114         }
          115 
          116         *len = rlen;
          117         return ret;
          118 }
          119