Back to index

courier  0.68.2
cgiinput.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2007 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 /*
00007 */
00008 
00009 #include      "cgi.h"
00010 #include      <stdio.h>
00011 #include      <string.h>
00012 #include      <stdlib.h>
00013 #include      <ctype.h>
00014 
00015 void cgi_output_unicode_escapes(const unicode_char *value,
00016                             const char *escapes,
00017                             void (*output_func)(const char *, size_t,
00018                                               void *),
00019                             void *output_arg)
00020 {
00021        while (value && *value)
00022        {
00023               size_t i;
00024 
00025               for (i=0; value[i]; i++)
00026               {
00027                      if (value[i] > 127 ||
00028                          strchr(escapes, value[i]))
00029                             break;
00030               }
00031 
00032               while (i)
00033               {
00034                      char buf[100];
00035 
00036                      size_t n=sizeof(buf);
00037                      size_t j;
00038 
00039                      if (n > i)
00040                             n=i;
00041 
00042                      for (j=0; j<n; j++)
00043                             buf[j]=value[j];
00044 
00045                      (*output_func)(buf, j, output_arg);
00046 
00047                      value += j;
00048                      i -= j;
00049               }
00050 
00051               if (*value)
00052               {
00053                      char buf[100];
00054 
00055                      sprintf(buf, "&#%lu;", (unsigned long)value[i]);
00056 
00057                      (*output_func)(buf, 0, output_arg);
00058                      ++value;
00059               }
00060        }
00061 }
00062 
00063 
00064 static void do_cgi_input(const char *name,
00065                       const unicode_char *value,
00066                       int size,
00067                       int maxlength,
00068                       const char *flags,
00069 
00070                       void (*output_func)(const char *, size_t,
00071                                         void *),
00072                       void *output_arg)
00073 {
00074        (*output_func)("<input name='", 0, output_arg);
00075        (*output_func)(name, 0, output_arg);
00076        (*output_func)("'", 0, output_arg);
00077 
00078        if (strchr(flags, 'r'))
00079               (*output_func)(" readonly='readonly'", 0, output_arg);
00080        if (strchr(flags, 'd'))
00081               (*output_func)(" disabled='disabled'", 0, output_arg);
00082 
00083        (*output_func)("'", 0, output_arg);
00084 
00085        if (size)
00086        {
00087               char buf[100];
00088 
00089               sprintf(buf, " size=%d", size);
00090 
00091               (*output_func)(buf, 0, output_arg);
00092        }
00093 
00094        if (maxlength)
00095        {
00096               char buf[100];
00097 
00098               sprintf(buf, " maxlength=%d", maxlength);
00099 
00100               (*output_func)(buf, 0, output_arg);
00101        }
00102 
00103        (*output_func)(" value='", 0, output_arg);
00104 
00105        cgi_output_unicode_escapes(value, "<>'&", output_func, output_arg);
00106 
00107        (*output_func)("' />", 0, output_arg);
00108 }
00109 
00110 static void cnt_bytes(const char *str, size_t cnt, void *arg)
00111 {
00112        if (!cnt)
00113               cnt=strlen(str);
00114 
00115        *(size_t *)arg += cnt;
00116 }
00117 
00118 static void save_bytes(const char *str, size_t cnt, void *arg)
00119 {
00120        char **p=(char **)arg;
00121 
00122        if (!cnt)
00123               cnt=strlen(str);
00124 
00125        memcpy(*p, str, cnt);
00126 
00127        *p += cnt;
00128 }
00129 
00130 char *cgi_input(const char *name,
00131               const unicode_char *value,
00132               int size,
00133               int maxlength,
00134               const char *flags)
00135 {
00136        size_t cnt=1;
00137        char *buf;
00138        char *ptr;
00139 
00140        if (!flags)
00141               flags="";
00142 
00143        do_cgi_input(name, value, size, maxlength, flags, cnt_bytes, &cnt);
00144 
00145        buf=malloc(cnt);
00146 
00147        if (!buf)
00148               return NULL;
00149 
00150        ptr=buf;
00151        do_cgi_input(name, value, size, maxlength, flags, save_bytes, &ptr);
00152        *ptr=0;
00153        return buf;
00154 }