/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */ /*********************************************************************/ /* file: variables.c - functions related the the variables */ /* TINTIN ++ */ /* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */ /* coded by peter unold 1992 */ /*********************************************************************/ #ifdef HAVE_STRING_H #include <string.h> #else #ifdef HAVE_STRINGS_H #include <strings.h> #endif #endif #include <ctype.h> #include "tintin.h" #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif #ifdef HAVE_UNISTD_H #include <unistd.h> #endif extern char *get_arg_in_braces(); extern struct listnode *search_node_with_wild(); extern struct listnode *searchnode_list(); extern struct listnode *deletenode_list(); extern struct listnode *common_myvars; extern char vars[10][BUFFER_SIZE]; /* the %0, %1, %2,....%9 variables */ extern int varnum; extern int mesvar[5]; /*************************/ /* the #variable command */ /*************************/ void var_command(arg, ses) char *arg; struct session *ses; { char left[BUFFER_SIZE], right[BUFFER_SIZE], arg2[BUFFER_SIZE]; struct listnode *tempvars, *ln; /* char right2[BUFFER_SIZE]; */ tempvars = (ses) ? ses->myvars : common_myvars; arg = get_arg_in_braces(arg, left, 0); arg = get_arg_in_braces(arg, right, 1); if (!*left) { tintin_puts2("#THESE VARIABLES HAVE BEEN SET:", ses); show_list(tempvars); prompt(ses); } else if (*left && !*right) { if ((ln = search_node_with_wild(tempvars, left)) != NULL) { do { shownode_list(ln); } while ((ln = search_node_with_wild(ln->next, left))); prompt(ses); } else if (mesvar[5]) tintin_puts2("#THAT VARIABLE IS NOT DEFINED.", ses); } else { if ((ln = searchnode_list(tempvars, left)) != NULL) deletenode_list(tempvars, ln); insertnode_list(tempvars, left, right, "0", ALPHA); varnum++; if (mesvar[5]) { sprintf(arg2, "#Ok. $%s is now set to {%s}.", left, right); tintin_puts2(arg2, ses); } } } /************************/ /* the #unvar command */ /************************/ void unvar_command(arg, ses) char *arg; struct session *ses; { char left[BUFFER_SIZE], result[BUFFER_SIZE]; struct listnode *tempvars, *ln, *temp; int flag; flag = FALSE; tempvars = (ses) ? ses->myvars : common_myvars; temp = tempvars; arg = get_arg_in_braces(arg, left, 1); while ((ln = search_node_with_wild(temp, left)) != NULL) { if (mesvar[5]) { sprintf(result, "#Ok. $%s is no longer a variable.", ln->left); tintin_puts2(result, ses); } /* @@@changed -- perry (ln is deleted and free'd by deletenode!!!) deletenode_list(tempvars, ln); temp = ln; */ temp = deletenode_list(tempvars, ln); flag = TRUE; } if (!flag && mesvar[5]) tintin_puts2("#THAT VARIABLE IS NOT DEFINED.", ses); } /*************************************************************************/ /* copy the arg text into the result-space, but substitute the variables */ /* $<string> with the values they stand for */ /*************************************************************************/ void substitute_myvars(arg, result, ses) char *arg; char *result; struct session *ses; { /* int varflag=FALSE; char *right; */ char varname[20]; int nest = 0, counter, varlen; struct listnode *ln, *tempvars; tempvars = (ses) ? ses->myvars : common_myvars; fflush(stdout); while (*arg) { if (*arg == '$') { /* substitute variable */ counter = 0; while (*(arg + counter) == '$') counter++; varlen = 0; while (isalpha(*(arg + varlen + counter))) varlen++; if (varlen > 0) strncpy(varname, arg + counter, varlen); *(varname + varlen) = '\0'; if (counter == nest + 1 && !isdigit(*(arg + counter + 1))) { if ((ln = searchnode_list(tempvars, varname)) != NULL) { strcpy(result, ln->right); result += strlen(ln->right); arg += counter + varlen; } else { strncpy(result, arg, counter + varlen); result += varlen + counter; arg += varlen + counter; } } else { strncpy(result, arg, counter + varlen); result += varlen + counter; arg += varlen + counter; } } else if (*arg == DEFAULT_OPEN) { nest++; *result++ = *arg++; } else if (*arg == DEFAULT_CLOSE) { nest--; *result++ = *arg++; } else if (*arg == '\\' && *(arg + 1) == '$' && nest == 0) { arg++; *result++ = *arg++; } else *result++ = *arg++; } *result = '\0'; } /*************************/ /* the #tolower command */ /*************************/ void tolower_command(arg, ses) char *arg; struct session *ses; { char left[BUFFER_SIZE], right[BUFFER_SIZE], arg2[BUFFER_SIZE], *p; struct listnode *tempvars, *ln; tempvars = (ses) ? ses->myvars : common_myvars; arg = get_arg_in_braces(arg, left, 0); arg = get_arg_in_braces(arg, right, 1); if (!*left || !*right) { tintin_puts2("#Syntax: #tolower <var> <text>", ses); } else { if ((ln = searchnode_list(tempvars, left)) != NULL) deletenode_list(tempvars, ln); for (p = right; *p; p++) *p = tolower(*p); insertnode_list(tempvars, left, right, "0", ALPHA); varnum++; if (mesvar[5]) { sprintf(arg2, "#Ok. $%s is now set to {%s}.", left, right); tintin_puts2(arg2, ses); } } } /*************************/ /* the #toupper command */ /*************************/ void toupper_command(arg, ses) char *arg; struct session *ses; { char left[BUFFER_SIZE], right[BUFFER_SIZE], arg2[BUFFER_SIZE], *p; struct listnode *tempvars, *ln; tempvars = (ses) ? ses->myvars : common_myvars; arg = get_arg_in_braces(arg, left, 0); arg = get_arg_in_braces(arg, right, 1); if (!*left || !*right) { tintin_puts2("#Syntax: #toupper <var> <text>", ses); } else { if ((ln = searchnode_list(tempvars, left)) != NULL) deletenode_list(tempvars, ln); for (p = right; *p; p++) *p = toupper(*p); insertnode_list(tempvars, left, right, "0", ALPHA); varnum++; if (mesvar[5]) { sprintf(arg2, "#Ok. $%s is now set to {%s}.", left, right); tintin_puts2(arg2, ses); } } }