/*
* $Id$
- *
- * Variable substitution type stuff
- *
+ */
+/**
+ * \defgroup Subst Variable substitution type stuff
+ * \ingroup CitadelConfig
*/
+/*@{*/
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <signal.h>
+#include "sysdep.h"
#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <sys/time.h>
#include <sys/stat.h>
-#include <limits.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <string.h>
-#include <pwd.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <pthread.h>
-#include <signal.h>
-#include "webcit.h"
+#include <unistd.h>
+#include "webcit.h"
-/*
- * Clear out the list of substitution variables local to this session
+/**
+ * \brief Clear out the list of substitution variables local to this session
*/
void clear_local_substs(void) {
struct wcsubst *ptr;
/*
- * Add a substitution variable (local to this session)
+ * \brief Add a substitution variable (local to this session)
+ * \param keyname the replacementstring to substitute
+ * \param keytype the kind of the key
+ * \param format the format string ala printf
+ * \param ... the arguments to substitute in the formatstring
*/
void svprintf(char *keyname, int keytype, const char *format,...)
{
struct wcsubst *ptr = NULL;
struct wcsubst *scan;
- /* First scan through to see if we're doing a replacement of
+ /**
+ * First scan through to see if we're doing a replacement of
* an existing key
*/
for (scan=WC->vars; scan!=NULL; scan=scan->next) {
}
}
- /* Otherwise allocate a new one */
+ /** Otherwise allocate a new one */
if (ptr == NULL) {
ptr = (struct wcsubst *) malloc(sizeof(struct wcsubst));
ptr->next = WC->vars;
WC->vars = ptr;
}
- /* Format the string and save it */
+ /** Format the string and save it */
va_start(arg_ptr, format);
vsnprintf(wbuf, sizeof wbuf, format, arg_ptr);
ptr->wcs_value = strdup(wbuf);
}
-/*
- * Add a substitution variable (local to this session) that does a callback
+/**
+ * \brief Add a substitution variable (local to this session) that does a callback
+ * \param keyname the keystring to substitute
+ * \param fcn_ptr the function callback to give the substitution string
*/
void svcallback(char *keyname, void (*fcn_ptr)() )
{
-/*
- * back end for print_value_of() ... does a server command
+/**
+ * \brief back end for print_value_of() ... does a server command
+ * \param servcmd server command to execute on the citadel server
*/
void pvo_do_cmd(char *servcmd) {
char buf[SIZ];
serv_puts(servcmd);
- serv_gets(buf);
+ serv_getln(buf, sizeof buf);
switch(buf[0]) {
case '2':
wprintf("%s\n", &buf[4]);
break;
case '1':
- fmout(NULL, "CENTER");
+ fmout("CENTER");
break;
case '4':
wprintf("%s\n", &buf[4]);
-/*
- * Print the value of a variable
+/**
+ * \brief Print the value of a variable
+ * \param keyname get a key to print
*/
void print_value_of(char *keyname) {
struct wcsubst *ptr;
}
else if (!strcasecmp(keyname, "CURRENT_USER")) {
- escputs(WC->wc_username);
+ escputs(WC->wc_fullname);
}
else if (!strcasecmp(keyname, "CURRENT_ROOM")) {
escputs(WC->wc_roomname);
}
- /* Page-local variables */
+ /** Page-local variables */
else for (ptr = WC->vars; ptr != NULL; ptr = ptr->next) {
if (!strcasecmp(ptr->wcs_key, keyname)) {
if (ptr->wcs_type == WCS_STRING) {
}
}
+extern char *static_dirs[PATH_MAX]; /**< Disk representation */
-
-/*
- * Display a variable-substituted template
+/**
+ * \brief Display a variable-substituted template
+ * \param templatename template file to load
*/
void do_template(void *templatename) {
+ char flat_filename[PATH_MAX];
char filename[PATH_MAX];
FILE *fp;
char inbuf[1024];
char outbuf[sizeof inbuf];
char key[sizeof inbuf];
int i, pos;
+ struct stat mystat;
- strcpy(filename, "static/");
- strcat(filename, templatename);
+ strcpy(flat_filename, templatename);
if (WC->is_wap)
- strcat(filename, ".wml");
+ strcat(flat_filename, ".wml");
else
- strcat(filename, ".html");
+ strcat(flat_filename, ".html");
+ strcpy(filename, static_dirs[1]);
+ strcat(filename, flat_filename);
+ if (stat(filename, &mystat) == -1)
+ {
+ strcpy(filename, static_dirs[0]);
+ strcat(filename, flat_filename);
+ }
+
fp = fopen(filename, "r");
if (fp == NULL) {
- wprintf("<BLINK>ERROR</BLINK> - could not open template ");
- wprintf("'%s' - %s<BR>\n",
+ wprintf(_("ERROR: could not open template "));
+ wprintf("'%s' - %s<br />\n",
templatename, strerror(errno));
return;
}
strcpy(inbuf, "");
while (fgets(inbuf, sizeof inbuf, fp) != NULL) {
- strcpy(outbuf, "");
+ int len;
- while (strlen(inbuf) > 0) {
+ strcpy(outbuf, "");
+ len = strlen(inbuf);
+ while (len > 0) {
pos = (-1);
- for (i=strlen(inbuf); i>=0; --i) {
+ for (i=len; i>=0; --i) {
if ((inbuf[i]=='<')&&(inbuf[i+1]=='?')) pos = i;
}
if (pos < 0) {
wprintf("%s", inbuf);
strcpy(inbuf, "");
+ len = 0;
}
else {
strncpy(outbuf, inbuf, pos);
outbuf[pos] = 0;
wprintf("%s", outbuf);
- strcpy(inbuf, &inbuf[pos]);
+ memmove(inbuf, &inbuf[pos], len - pos +1);
+ len -= pos;
pos = 1;
- for (i=strlen(inbuf); i>=0; --i) {
+ for (i=len; i>=0; --i) {
if (inbuf[i]=='>') pos = i;
}
strncpy(key, &inbuf[2], pos-2);
key[pos-2] = 0;
print_value_of(key);
- strcpy(inbuf, &inbuf[pos+1]);
+ pos++;
+ memmove(inbuf, &inbuf[pos], len - pos + 1);
+ len -= pos;
}
}
}
fclose(fp);
}
+
+
+
+/*@}*/