/* * if.c: handles the IF command for IRCII * * Written By Michael Sandrof * * Copyright(c) 1990, 1991 * * See the COPYRIGHT file, or do a HELP IRCII COPYRIGHT */ #ifndef lint static char rcsid[] = "@(#)$Id: if.c,v 1.7 1994/07/02 02:32:13 mrg Stab $"; #endif #include "irc.h" #include "alias.h" #include "ircaux.h" #include "window.h" #include "vars.h" #include "output.h" extern char *arg_numword(); extern int word_count(); extern char *stristr(); extern char *rstristr(); int lastif; /* * next_expr finds the next expression delimited by brackets. The type * of bracket expected is passed as a parameter. Returns NULL on error. */ extern char * next_expr(args, type) char **args; char type; { char *ptr, *ptr2, *ptr3; if (!*args) return NULL; ptr2 = *args; if (!*ptr2) return 0; if (*ptr2 != type) { say("Expression syntax"); return 0; } /* { */ ptr = MatchingBracket(ptr2 + 1, type, (type == '(') ? ')' : '}'); if (!ptr) { say("Unmatched '%c'", type); return 0; } *ptr = '\0'; do { ptr2++; } while (isspace(*ptr2)); ptr3 = ptr+1; while (isspace(*ptr3)) ptr3++; *args = ptr3; if (*ptr2) { ptr--; while (isspace(*ptr)) *ptr-- = '\0'; } return ptr2; } /*ARGSUSED*/ void ifcmd(command, args, subargs) char *command, *args; char *subargs; { char *exp; char *sub; int flag = 0; int result; if (!(exp = next_expr(&args, '('))) { yell("Missing CONDITION in IF"); return; } sub = parse_inline(exp, subargs?subargs:empty_string, &flag); if (get_int_var(DEBUG_VAR) & DEBUG_EXPANSIONS) yell("If expression expands to: (%s)", sub); if (!*sub || *sub == '0') result = 0; else result = 1; new_free(&sub); if (!(exp = next_expr(&args, '{'))) { yell("Missing THEN portion in IF"); return; } if (!result && !(exp = next_expr(&args, '{'))) return; parse_line((char *) 0, exp, subargs ? subargs : empty_string, 0, 0); return; } /*ARGSUSED*/ void whilecmd(command, args, subargs) char *command, *args; char *subargs; { char *exp = (char *) 0, *ptr, *body = (char *) 0, *newexp = (char *) 0; int args_used; /* this isn't used here, but is passed * to expand_alias() */ if ((ptr = next_expr(&args, '(')) == (char *) 0) { yell("WHILE: missing boolean expression"); return; } malloc_strcpy(&exp, ptr); if ((ptr = next_expr(&args, '{')) == (char *) 0) { say("WHILE: missing expression"); new_free(&exp); return; } malloc_strcpy(&body, ptr); while (1) { malloc_strcpy(&newexp, exp); ptr = parse_inline(newexp, subargs ? subargs : empty_string, &args_used); if (*ptr && *ptr !='0') { new_free(&ptr); parse_line((char *) 0, body, subargs ? subargs : empty_string, 0, 0); } else break; } new_free(&newexp); new_free(&ptr); new_free(&exp); new_free(&body); } void fe(); void foreach(); void forcmd(); int charcount(string, what) char *string, what; { int x = 0; char *place = string-1; while (place = index(place+1, what)) x++; return x; } /* * How it works -- if There are no parenthesis, it must be a * foreach array command. If there are parenthesis, and there are * exactly two commas, it must be a C-like for command, else it must * must be an foreach word command */ void foreach_handler(command,args,subargs) char *command, *args, *subargs; { char *temp = (char *) 0; char *placeholder; char *temp2 = (char *) 0; int ick=0; malloc_strcpy(&temp, args); placeholder = temp; if (*temp == '(') { if ((temp2 = next_expr(&temp,'(')) == (char *) 0) { new_free(&placeholder); return; } if (charcount(temp2,',') == 2) forcmd(command,args,subargs); else fe(command,args,subargs); } else foreach(command,args,subargs); new_free(&placeholder); } /*ARGSUSED*/ void foreach(command, args, subargs) char *command, *args; char *subargs; { char *struc = (char *) 0, *ptr, *body = (char *) 0, *var = (char *) 0; char **sublist; int total; int i; int slen; int old_display; if ((ptr = new_next_arg(args, &args)) == (char *) 0) { yell("FOREACH: missing structure expression"); return; } malloc_strcpy(&struc, ptr); malloc_strcat(&struc, "."); upper(struc); if ((var = next_arg(args, &args)) == (char *) 0) { new_free(&struc); yell("FOREACH: missing variable"); return; } while (isspace(*args)) *args++; if ((body = next_expr(&args, '{')) == (char *) 0) /* } */ { new_free(&struc); yell("FOREACH: missing statement"); return; } sublist=match_alias(struc, &total, VAR_ALIAS); slen=strlen(struc); old_display=window_display; for (i=0;i