-const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.9 2002/01/17 20:56:22 jongfoster Exp $";
+const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.15 2002/03/06 22:54:35 jongfoster Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/cgiedit.c,v $
*
* Revisions :
* $Log: cgiedit.c,v $
+ * Revision 1.15 2002/03/06 22:54:35 jongfoster
+ * Automated function-comment nitpicking.
+ *
+ * Revision 1.14 2002/03/05 00:24:51 jongfoster
+ * Patch to always edit the current actions file.
+ *
+ * Revision 1.13 2002/03/04 02:07:59 david__schmidt
+ * Enable web editing of actions file on OS/2 (it had been broken all this time!)
+ *
+ * Revision 1.12 2002/03/03 09:18:03 joergs
+ * Made jumbjuster work on AmigaOS again.
+ *
+ * Revision 1.11 2002/01/23 01:03:31 jongfoster
+ * Fixing gcc [CygWin] compiler warnings
+ *
+ * Revision 1.10 2002/01/23 00:22:59 jongfoster
+ * Adding new function cgi_edit_actions_section_swap(), to reorder
+ * the actions file.
+ *
+ * Adding get_url_spec_param() to get a validated URL pattern.
+ *
+ * Moving edit_read_line() out of this file and into loaders.c.
+ *
+ * Adding missing html_encode() to many CGI functions.
+ *
+ * Moving the functions that #include actionlist.h to the end of the file,
+ * because the Visual C++ 97 debugger gets extremely confused if you try
+ * to debug any code that comes after them in the file.
+ *
+ * Major optimizations in cgi_edit_actions_list() to reduce the size of
+ * the generated HTML (down 40% from 550k to 304k), with major side-effects
+ * throughout the editor and templates. In particular, the length of the
+ * URLs throughout the editor has been drastically reduced, by cutting
+ * paramater names down to 1 character and CGI names down to 3-4
+ * characters, by removing all non-essential CGI paramaters even at the
+ * expense of having to re-read the actions file for the most trivial
+ * page, and by using relative rather than absolute URLs. This means
+ * that this (typical example):
+ *
+ * <a href="http://ijbswa.sourceforge.net/config/edit-actions-url-form?
+ * filename=ijb&ver=1011487572&section=12&pattern=13
+ * &oldval=www.oesterhelt.org%2Fdeanimate-demo">
+ *
+ * is now this:
+ *
+ * <a href="eau?f=ijb&v=1011487572&p=13">
+ *
* Revision 1.9 2002/01/17 20:56:22 jongfoster
* Replacing hard references to the URL of the config interface
* with #defines from project.h
static jb_err map_radio(struct map * exports,
const char * optionname,
const char * values,
- char value);
+ int value);
static jb_err actions_to_radio(struct map * exports,
const struct action_spec *action);
static jb_err actions_from_radio(const struct map * parameters,
static jb_err map_copy_parameter_html(struct map *out,
const struct map *in,
const char *name);
+#if 0 /* unused function */
static jb_err map_copy_parameter_url(struct map *out,
const struct map *in,
const char *name);
-
+#endif /* unused function */
/*********************************************************************
*
* encoding it.
*
* Parameters :
- * 1 : out = target map
- * 2 : in = source map
- * 3 : name = name of cgi parameter to copy
+ * 1 : out = target map
+ * 2 : in = source map
+ * 3 : name = name of cgi parameter to copy
*
* Returns : JB_ERR_OK on success
* JB_ERR_MEMORY on out-of-memory
}
+#if 0 /* unused function */
/*********************************************************************
*
* Function : map_copy_parameter_html
* encoding it.
*
* Parameters :
- * 1 : out = target map
- * 2 : in = source map
- * 3 : name = name of cgi parameter to copy
+ * 1 : out = target map
+ * 2 : in = source map
+ * 3 : name = name of cgi parameter to copy
*
* Returns : JB_ERR_OK on success
* JB_ERR_MEMORY on out-of-memory
return JB_ERR_OK;
}
}
-
+#endif /* 0 - unused function */
/*********************************************************************
*
* edit-actions-url
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters
* f : (filename) Identifies the file to edit
* edit-actions-url
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* f : (filename) Identifies the file to edit
* edit-actions-url
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* f : (filename) Identifies the file to edit
assert(file);
assert(file->filename);
+#if defined(AMIGA) || defined(__OS2__)
+ if (NULL == (fp = fopen(file->filename, "w")))
+#else
if (NULL == (fp = fopen(file->filename, "wt")))
+#endif /* def AMIGA */
{
return JB_ERR_FILE;
}
/* Allocate new memory for string */
len = strlen(cur_line->unprocessed);
- if (NULL == (str = malloc(len + 1 + numhash)))
+ if (NULL == (str = malloc((size_t) len + 1 + numhash)))
{
/* Uh oh, just trashed file! */
fclose(fp);
* Description : Match an actions file {{header}} line
*
* Parameters :
- * 1 : line - String from file
- * 2 : name - Header to match against
+ * 1 : line = String from file
+ * 2 : name = Header to match against
*
* Returns : 0 iff they match.
*
*********************************************************************/
static int match_actions_file_header_line(const char * line, const char * name)
{
- int len;
+ size_t len;
assert(line);
assert(name);
* Description : Match an actions file {{header}} line
*
* Parameters :
- * 1 : line - String from file. Must not start with
+ * 1 : line = String from file. Must not start with
* whitespace (else infinite loop!)
- * 2 : name - Destination for name
- * 2 : name - Destination for value
+ * 2 : name = Destination for name
+ * 2 : name = Destination for value
*
* Returns : JB_ERR_OK on success
* JB_ERR_MEMORY on out-of-memory
{
const char * name_end;
const char * value_start;
- int name_len;
+ size_t name_len;
assert(line);
assert(pname);
jb_err edit_parse_actions_file(struct editable_file * file)
{
struct file_line * cur_line;
- int len;
+ size_t len;
const char * text; /* Text from a line */
char * name; /* For lines of the form name=value */
char * value; /* For lines of the form name=value */
}
}
+#if defined(AMIGA) || defined(__OS2__)
+ if (NULL == (fp = fopen(filename,"r")))
+#else
if (NULL == (fp = fopen(filename,"rt")))
+#endif /* def AMIGA */
{
free(filename);
return JB_ERR_FILE;
* secure.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : parameters = map of cgi parameters
- * 3 : param_name = The name of the parameter to read
- * 4 : suffix = File extension, e.g. ".actions"
- * 5 : pfilename = destination for full filename. Caller
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : parameters = map of cgi parameters
+ * 3 : param_name = The name of the parameter to read
+ * 4 : suffix = File extension, e.g. ".actions"
+ * 5 : pfilename = destination for full filename. Caller
* free()s. Set to NULL on error.
- * 6 : pparam = destination for partial filename,
+ * 6 : pparam = destination for partial filename,
* suitable for use in another URL. Allocated as part
* of the map "parameters", so don't free it.
* Set to NULL if not specified.
{
const char *param;
const char *s;
+#if 0 /* Patch to make 3.0.0 work properly. */
char *name;
+#endif /* 0 - Patch to make 3.0.0 work properly. */
char *fullpath;
char ch;
int len;
}
}
+ /*
+ * FIXME Following is a hack to make 3.0.0 work properly.
+ * Change "#if 0" --> "#if 1" below when we have modular action
+ * files.
+ * -- Jon
+ */
+#if 0 /* Patch to make 3.0.0 work properly. */
/* Append extension */
name = malloc(len + strlen(suffix) + 1);
if (name == NULL)
/* Prepend path */
fullpath = make_path(csp->config->confdir, name);
free(name);
+#else /* 1 - Patch to make 3.0.0 work properly. */
+ if ((csp->actions_list == NULL)
+ || (csp->actions_list->filename == NULL))
+ {
+ return JB_ERR_CGI_PARAMS;
+ }
+
+ fullpath = ( (csp->actions_list && csp->actions_list->filename)
+ ? strdup(csp->actions_list->filename) : NULL);
+#endif /* 1 - Patch to make 3.0.0 work properly. */
if (fullpath == NULL)
{
return JB_ERR_MEMORY;
* passed to a CGI function.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : parameters = map of cgi parameters
- * 3 : name = Name of CGI parameter to read
- * 4 : pvalue = destination for value.
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : parameters = map of cgi parameters
+ * 3 : name = Name of CGI parameter to read
+ * 4 : pvalue = destination for value.
* Set to -1 on error.
*
* Returns : JB_ERR_OK on success
assert(name);
assert(pvalue);
- *pvalue = -1;
+ *pvalue = 0;
param = lookup(parameters, name);
if (!*param)
*pvalue = value;
return JB_ERR_OK;
+
}
* spaces and validates it.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : parameters = map of cgi parameters
- * 3 : name = Name of CGI parameter to read
- * 4 : pvalue = destination for value. Will be malloc()'d.
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : parameters = map of cgi parameters
+ * 3 : name = Name of CGI parameter to read
+ * 4 : pvalue = destination for value. Will be malloc()'d.
* Set to NULL on error.
*
* Returns : JB_ERR_OK on success
* Where 'sel' is 'a', 'b', or 'c'.
*
* Parameters :
- * 1 : exports = Exports map to modify.
- * 2 : optionname = name for map
- * 3 : values = null-terminated list of values;
- * 4 : value = Selected value.
+ * 1 : exports = Exports map to modify.
+ * 2 : optionname = name for map
+ * 3 : values = null-terminated list of values;
+ * 4 : value = Selected value.
*
* CGI Parameters : None
*
static jb_err map_radio(struct map * exports,
const char * optionname,
const char * values,
- char value)
+ int value)
{
- int len;
+ size_t len;
char * buf;
char * p;
char c;
* outside the CGI editor.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : filename = The file that was modified.
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : filename = The file that was modified.
*
* CGI Parameters : none
*
* be parsed by the CGI editor.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : file = The file that was modified.
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : file = The file that was modified.
*
* CGI Parameters : none
*
* opened by the CGI editor.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : filename = The file that was modified.
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : filename = The file that was modified.
*
* CGI Parameters : none
*
* (query string) for a CGI were wrong.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
*
* CGI Parameters : none
*
* actions file to edit.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters : None
*
* FIXME: This function shouldn't FATAL ever.
* FIXME: This function doesn't check the retval of map()
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters : filename
*
* Description : CGI function that edits the Actions list.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters : None
*
* Description : CGI function that actually edits the Actions list.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters : None
*
unsigned sectionid;
char * actiontext;
char * newtext;
- int len;
+ size_t len;
struct editable_file * file;
struct file_line * cur_line;
unsigned line_number;
* an actions file.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* filename : Identifies the file to edit
* an actions file.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* filename : Identifies the file to edit
* the actions file.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* f : (filename) Identifies the file to edit
* (else JB_ERR_CGI_PARAMS).
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* f : (filename) Identifies the file to edit
* an actions file.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* f : (filename) Identifies the file to edit
* specified.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* f : (filename) Identifies the file to edit
* an actions file.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : rsp = http_response data structure for output
- * 3 : parameters = map of cgi parameters
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
* CGI Parameters :
* set : If present, how to change toggle setting: