subst.c

00001 /*
00002  * $Id: subst.c 5147 2007-05-08 15:36:22Z ajc $
00003  */
00010 
00011 #include "webcit.h"
00012 
00013 
00017 void clear_local_substs(void) {
00018         struct wcsubst *ptr;
00019 
00020         while (WC->vars != NULL) {
00021                 ptr = WC->vars->next;
00022 
00023                 if ((WC->vars->wcs_type == WCS_STRING)
00024                    || (WC->vars->wcs_type == WCS_SERVCMD)) {
00025                         free(WC->vars->wcs_value);
00026                 }
00027 
00028                 free(WC->vars);
00029                 WC->vars = ptr;
00030         }
00031 
00032         WC->vars = NULL;
00033 }
00034 
00035 
00036 /*
00037  * \brief Add a substitution variable (local to this session)
00038  * \param keyname the replacementstring to substitute
00039  * \param keytype the kind of the key
00040  * \param format the format string ala printf
00041  * \param ... the arguments to substitute in the formatstring
00042  */
00043 void svprintf(char *keyname, int keytype, const char *format,...)
00044 {
00045         va_list arg_ptr;
00046         char wbuf[SIZ];
00047         struct wcsubst *ptr = NULL;
00048         struct wcsubst *scan;
00049 
00054         for (scan=WC->vars; scan!=NULL; scan=scan->next) {
00055                 if (!strcasecmp(scan->wcs_key, keyname)) {
00056                         ptr = scan;
00057                         free(ptr->wcs_value);
00058                 }
00059         }
00060 
00062         if (ptr == NULL) {
00063                 ptr = (struct wcsubst *) malloc(sizeof(struct wcsubst));
00064                 ptr->next = WC->vars;
00065                 safestrncpy(ptr->wcs_key, keyname, sizeof ptr->wcs_key);
00066                 WC->vars = ptr;
00067         }
00068 
00071         va_start(arg_ptr, format);
00072         vsnprintf(wbuf, sizeof wbuf, format, arg_ptr);
00073         va_end(arg_ptr);
00074 
00075         ptr->wcs_type = keytype;
00076         ptr->wcs_value = strdup(wbuf);
00077 }
00078 
00084 void svcallback(char *keyname, void (*fcn_ptr)() )
00085 {
00086         struct wcsubst *ptr;
00087 
00088         ptr = (struct wcsubst *) malloc(sizeof(struct wcsubst));
00089         ptr->next = WC->vars;
00090         ptr->wcs_type = WCS_FUNCTION;
00091         strcpy(ptr->wcs_key, keyname);
00092         ptr->wcs_function = fcn_ptr;
00093         WC->vars = ptr;
00094 }
00095 
00096 
00097 
00102 void pvo_do_cmd(char *servcmd) {
00103         char buf[SIZ];
00104 
00105         serv_puts(servcmd);
00106         serv_getln(buf, sizeof buf);
00107 
00108         switch(buf[0]) {
00109                 case '2':
00110                 case '3':
00111                 case '5':
00112                         wprintf("%s\n", &buf[4]);
00113                         break;
00114                 case '1':
00115                         fmout("CENTER");
00116                         break;
00117                 case '4':
00118                         wprintf("%s\n", &buf[4]);
00119                         serv_puts("000");
00120                         break;
00121         }
00122 }
00123 
00124 
00125 
00130 void print_value_of(char *keyname) {
00131         struct wcsubst *ptr;
00132         void *fcn();
00133 
00134         if (keyname[0] == '=') {
00135                 do_template(&keyname[1]);
00136         }
00137 
00138         if (!strcasecmp(keyname, "SERV_PID")) {
00139                 wprintf("%d", WC->ctdl_pid);
00140         }
00141 
00142         else if (!strcasecmp(keyname, "SERV_NODENAME")) {
00143                 escputs(serv_info.serv_nodename);
00144         }
00145 
00146         else if (!strcasecmp(keyname, "SERV_HUMANNODE")) {
00147                 escputs(serv_info.serv_humannode);
00148         }
00149 
00150         else if (!strcasecmp(keyname, "SERV_FQDN")) {
00151                 escputs(serv_info.serv_fqdn);
00152         }
00153 
00154         else if (!strcasecmp(keyname, "SERV_SOFTWARE")) {
00155                 escputs(serv_info.serv_software);
00156         }
00157 
00158         else if (!strcasecmp(keyname, "SERV_REV_LEVEL")) {
00159                 wprintf("%d.%02d",
00160                         serv_info.serv_rev_level / 100,
00161                         serv_info.serv_rev_level % 100
00162                 );
00163         }
00164 
00165         else if (!strcasecmp(keyname, "SERV_BBS_CITY")) {
00166                 escputs(serv_info.serv_bbs_city);
00167         }
00168 
00169         else if (!strcasecmp(keyname, "CURRENT_USER")) {
00170                 escputs(WC->wc_fullname);
00171         }
00172 
00173         else if (!strcasecmp(keyname, "CURRENT_ROOM")) {
00174                 escputs(WC->wc_roomname);
00175         }
00176 
00178         else for (ptr = WC->vars; ptr != NULL; ptr = ptr->next) {
00179                 if (!strcasecmp(ptr->wcs_key, keyname)) {
00180                         if (ptr->wcs_type == WCS_STRING) {
00181                                 wprintf("%s", ptr->wcs_value);
00182                         }
00183                         else if (ptr->wcs_type == WCS_SERVCMD) {
00184                                 pvo_do_cmd(ptr->wcs_value);
00185                         }
00186                         else if (ptr->wcs_type == WCS_FUNCTION) {
00187                                 (*ptr->wcs_function) ();
00188                         }
00189                 }
00190         }
00191 }
00192 
00193 
00194 
00199 void do_template(void *templatename) {
00200         char filename[PATH_MAX];
00201         FILE *fp;
00202         char inbuf[1024];
00203         char outbuf[sizeof inbuf];
00204         char key[sizeof inbuf];
00205         int i, pos;
00206 
00207         strcpy(filename, "static/");
00208         strcat(filename, templatename);
00209         if (WC->is_wap)
00210                 strcat(filename, ".wml");
00211         else
00212                 strcat(filename, ".html");
00213         
00214         fp = fopen(filename, "r");
00215         if (fp == NULL) {
00216                 wprintf(_("ERROR: could not open template "));
00217                 wprintf("'%s' - %s<br />\n",
00218                         templatename, strerror(errno));
00219                 return;
00220         }
00221 
00222         strcpy(inbuf, "");
00223 
00224         while (fgets(inbuf, sizeof inbuf, fp) != NULL) {
00225                 strcpy(outbuf, "");
00226 
00227                 while (strlen(inbuf) > 0) {
00228                         pos = (-1);
00229                         for (i=strlen(inbuf); i>=0; --i) {
00230                                 if ((inbuf[i]=='<')&&(inbuf[i+1]=='?')) pos = i;
00231                         }
00232                         if (pos < 0) {
00233                                 wprintf("%s", inbuf);
00234                                 strcpy(inbuf, "");
00235                         }
00236                         else {
00237                                 strncpy(outbuf, inbuf, pos);
00238                                 outbuf[pos] = 0;
00239                                 wprintf("%s", outbuf);
00240                                 strcpy(inbuf, &inbuf[pos]);
00241                                 pos = 1;
00242                                 for (i=strlen(inbuf); i>=0; --i) {
00243                                         if (inbuf[i]=='>') pos = i;
00244                                 }
00245                                 strncpy(key, &inbuf[2], pos-2);
00246                                 key[pos-2] = 0;
00247                                 print_value_of(key);
00248                                 strcpy(inbuf, &inbuf[pos+1]);
00249                         }
00250                 }
00251         }
00252 
00253         fclose(fp);
00254 }
00255 
00256 
00257 

Generated on Wed Jun 20 23:13:10 2007 for webcit by  doxygen 1.5.2