summaryrefslogtreecommitdiffstats
path: root/cgi/cgitextarea.c
diff options
context:
space:
mode:
authorSam Varshavchik2013-08-19 16:39:41 -0400
committerSam Varshavchik2013-08-25 14:43:51 -0400
commit9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch)
tree7a81a04cb51efb078ee350859a64be2ebc6b8813 /cgi/cgitextarea.c
parenta9520698b770168d1f33d6301463bb70a19655ec (diff)
downloadcourier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2
Initial checkin
Imported from subversion report, converted to git. Updated all paths in scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'cgi/cgitextarea.c')
-rw-r--r--cgi/cgitextarea.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/cgi/cgitextarea.c b/cgi/cgitextarea.c
new file mode 100644
index 0000000..e9d814b
--- /dev/null
+++ b/cgi/cgitextarea.c
@@ -0,0 +1,120 @@
+/*
+** Copyright 2007 Double Precision, Inc.
+** See COPYING for distribution information.
+*/
+
+/*
+*/
+
+#include "cgi.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+extern void cgi_output_unicode_escapes(const unicode_char *value,
+ const char *escapes,
+ void (*output_func)(const char *,
+ size_t,
+ void *),
+ void *output_arg);
+
+static void do_cgi_textarea(const char *name,
+ int rows,
+ int cols,
+ const unicode_char *value,
+ const char *opts,
+ const char *wrap,
+ void (*output_func)(const char *, size_t,
+ void *),
+ void *output_arg)
+{
+ (*output_func)("<textarea name='", 0, output_arg);
+ (*output_func)(name, 0, output_arg);
+ (*output_func)("'", 0, output_arg);
+
+ if (strchr(opts, 'r'))
+ (*output_func)(" readonly='readonly'", 0, output_arg);
+ if (strchr(opts, 'd'))
+ (*output_func)(" disabled='disabled'", 0, output_arg);
+
+ (*output_func)("'", 0, output_arg);
+
+ if (rows)
+ {
+ char buf[100];
+
+ sprintf(buf, " rows='%d'", rows);
+
+ (*output_func)(buf, 0, output_arg);
+ }
+
+ if (cols)
+ {
+ char buf[100];
+
+ sprintf(buf, " cols='%d'", cols);
+
+ (*output_func)(buf, 0, output_arg);
+ }
+
+ if (wrap)
+ {
+ (*output_func)(" wrap='", 0, output_arg);
+ (*output_func)(wrap, 0, output_arg);
+ (*output_func)("'", 0, output_arg);
+ }
+
+ (*output_func)(">", 0, output_arg);
+
+ cgi_output_unicode_escapes(value, "<>'&", output_func, output_arg);
+
+ (*output_func)("</textarea>", 0, output_arg);
+}
+
+static void cnt_bytes(const char *str, size_t cnt, void *arg)
+{
+ if (!cnt)
+ cnt=strlen(str);
+
+ *(size_t *)arg += cnt;
+}
+
+static void save_bytes(const char *str, size_t cnt, void *arg)
+{
+ char **p=(char **)arg;
+
+ if (!cnt)
+ cnt=strlen(str);
+
+ memcpy(*p, str, cnt);
+
+ *p += cnt;
+}
+
+char *cgi_textarea(const char *name,
+ int rows,
+ int cols,
+ const unicode_char *value,
+ const char *wrap,
+ const char *opts)
+{
+ size_t cnt=1;
+ char *buf;
+ char *ptr;
+
+ if (!opts)
+ opts="";
+
+ do_cgi_textarea(name, rows, cols, value, opts, wrap, cnt_bytes, &cnt);
+
+ buf=malloc(cnt);
+
+ if (!buf)
+ return NULL;
+
+ ptr=buf;
+ do_cgi_textarea(name, rows, cols, value, opts, wrap, save_bytes, &ptr);
+ *ptr=0;
+ return buf;
+}