Back to index

courier  0.68.2
cgiselect.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 static void do_cgi_select(const char *name,
00016                        const char *optvalues,
00017                        const char *optlabels,
00018                        const char *default_value,
00019                        size_t list_size,
00020                        const char *flags,
00021 
00022                        void (*output_func)(const char *, size_t, void *),
00023                        void *output_arg)
00024 {
00025        (*output_func)("<select name='", 0, output_arg);
00026        (*output_func)(name, 0, output_arg);
00027        (*output_func)("'", 0, output_arg);
00028 
00029        if (strchr(flags, 'm'))
00030               (*output_func)(" multiple='multiple'", 0, output_arg);
00031        if (strchr(flags, 'd'))
00032               (*output_func)(" disabled='disabled'", 0, output_arg);
00033 
00034        (*output_func)("'>", 0, output_arg);
00035 
00036        if (!optvalues)
00037               optvalues="";
00038 
00039        while (*optlabels)
00040        {
00041               const char *label_start=optlabels;
00042               const char *value_start=optvalues;
00043 
00044               while (*optlabels)
00045               {
00046                      if (*optlabels == '\n')
00047                             break;
00048                      ++optlabels;
00049               }
00050 
00051               while (*optvalues)
00052               {
00053                      if (*optvalues == '\n')
00054                             break;
00055                      ++optvalues;
00056               }
00057 
00058               (*output_func)("<option", 0, output_arg);
00059 
00060               if (*value_start)
00061               {
00062                      if (default_value &&
00063                          optvalues - value_start == strlen(default_value) &&
00064                          strncmp(value_start, default_value,
00065                                 optvalues-value_start) == 0)
00066                      {
00067                             (*output_func)(" selected='selected'", 0,
00068                                           output_arg);
00069                      }
00070 
00071                      (*output_func)(" value='", 0, output_arg);
00072                      (*output_func)(value_start, optvalues-value_start,
00073                                    output_arg);
00074                      (*output_func)("'", 0, output_arg);
00075               }
00076               (*output_func)(">", 0, output_arg);
00077               (*output_func)(label_start, optlabels-label_start, output_arg);
00078               (*output_func)("</option>", 0, output_arg);
00079               if (*optlabels)
00080                      ++optlabels;
00081               if (*optvalues)
00082                      ++optvalues;
00083        }
00084 
00085        (*output_func)("</select>", 0, output_arg);
00086 }
00087 
00088 static void cnt_bytes(const char *str, size_t cnt, void *arg)
00089 {
00090        if (!cnt)
00091               cnt=strlen(str);
00092 
00093        *(size_t *)arg += cnt;
00094 }
00095 
00096 static void save_bytes(const char *str, size_t cnt, void *arg)
00097 {
00098        char **p=(char **)arg;
00099 
00100        if (!cnt)
00101               cnt=strlen(str);
00102 
00103        memcpy(*p, str, cnt);
00104        *p += cnt;
00105 }
00106 
00107 char *cgi_select(const char *name,
00108                const char *optvalues,
00109                const char *optlabels,
00110                const char *default_value,
00111                size_t list_size,
00112                const char *flags)
00113 {
00114        size_t cnt=1;
00115        char *buf;
00116        char *ptr;
00117 
00118        if (!flags)
00119               flags="";
00120 
00121        do_cgi_select(name, optvalues, optlabels, default_value,
00122                     list_size, flags, cnt_bytes, &cnt);
00123 
00124        buf=malloc(cnt);
00125 
00126        if (!buf)
00127               return NULL;
00128 
00129        ptr=buf;
00130        do_cgi_select(name, optvalues, optlabels, default_value,
00131                     list_size, flags, save_bytes, &ptr);
00132        *ptr=0;
00133        return buf;
00134 }