extern "C" { #include <string.h> #include <stdio.h> #include <ctype.h> } #include "muddle.h" int macro::match(char *str, char **array, int *len) { int i = 0, j = 0, last, n; int l = strlen(str); int l2 = strlen(key); if(!l || !l2) return 0; // strip header white space while(i < l && str[i] == ' ') i++; while(j < l2 && str[j] == ' ') j++; // interpret macro including %wildcards while(i < l && j < l2) { // Handle non-wildcard comparisons, and %%->% translation while(i < l && j < l2 && str[i] == key[j]) { if(key[j] == '%' && key[j+1] == '%') j++; i++; j++; } // Do we already have a match? if(i == l && j == l2) return 1; // No match, so it better be a % wildcard symbol. if(key[j++] != '%') return 0; // Make sure the %n symbol is such that n is a number // from 1 to 9 or a *. if((key[j+1] != ' ' && key[j+1] != 0) || ((key[j] < '1' || key[j] > '9') && key[j] != '*')) return 0; // If it's a *, use array location 0 to store wildcard info // and return success. if(key[j] == '*') { array[0] = &str[i]; len[0] = l-i; return 1; } // Get macro # from ascii value and store wildcard info // in that #'s wildcard spot. n = key[j] - '0'; array[n] = &str[i]; j++; last = i; while(str[i] != ' ' && str[i] != 0) i++; len[n] = i-last; } // If there's nothing left, we have a match. return(i == l && j == l2); } void macro::out(int cur, char **array, int *len) { int i=0, j=0, n=cur; int l = strlen(output); char outstr[512]; extern conn *Conn[]; // Interpret the macro, and output it to the appropriate descriptor. while(i < l) { // Check for %%, $$, and ^^ combinations. Output a single // one if it is found. if((output[i] == '%' || output[i] == '$' || output[i] == '^') && output[i+1] == output[i]) { outstr[j++] = output[i]; i+=2; continue; } // Handle control characters. if(output[i] == '^') { outstr[j++] = output[++i] - 'A' + 1; i++; continue; } // Handle wildcards. else if(output[i] == '%') { i++; if(isdigit(output[i])) { int d = output[i] - '0'; if(d < 1 || !array[d]) { i++; continue; } for(int k=0; k<len[d]; k++) outstr[j++] = array[d][k]; } if(output[i] == '*') { if(!array[0]) { i++; continue; } for(int k=0; k<len[0]; k++) outstr[j++] = array[0][k]; } } // Handle multi-descriptor outputs. else if(output[i] == '$') { i++; if((output[i] == '0' || !isdigit(output[i])) && output[i] != '*') { i++; continue; } int d; if(output[i] == '*') d = 0; else d = output[i] - '0'; if(!Conn[d]) { i++; continue; } outstr[j] = 0; if(!n) for(int k=9; k>0; k--) { if(Conn[k]) Conn[k]->send(outstr); if(k == cur) printf(outstr); } else { Conn[n]->send(outstr); if(n == cur) printf(outstr); } j=0; n = d; } // Just a regular character else outstr[j++] = output[i]; i++; } // Wrap things up by outputting the last string. if(j) { outstr[j] = 0; if(!n) for(int k=9; k>0; k--) { if(Conn[k]) Conn[k]->send(outstr); if(k==cur) printf(outstr); } else { Conn[n]->send(outstr); if(n == cur) printf(outstr); } } } int auton::match(char *str, int slot) { int matchslot = -1; char *matchstr = key; if(matchstr[0] == '$') { if(matchstr[1] == '$') matchstr++; else { matchslot = matchstr[1] - '0'; matchstr += 2; } } if(matchslot > -1 && matchslot != slot) return 0; if(strstr(str, matchstr)) return 1; return 0; } void auton::out(int cur, int slot) { int i=0, j=0, n=slot; int l = strlen(output); char outstr[512]; extern conn *Conn[]; // Interpret the macro, and output it to the appropriate descriptor. while(i < l) { // Check for $$ and ^^ combinations. Output a single // one if it is found. if((output[i] == '$' || output[i] == '^') && output[i+1] == output[i]) { outstr[j++] = output[i]; i+=2; continue; } // Handle control characters. if(output[i] == '^') { outstr[j++] = output[++i] - 'A' + 1; i++; continue; } // Handle multi-descriptor outputs. else if(output[i] == '$') { i++; if((output[i] == '0' || !isdigit(output[i])) && output[i] != '*') { i++; continue; } int d; if(output[i] == '*') d = 0; else d = output[i] - '0'; if(!Conn[d]) { i++; continue; } outstr[j] = 0; if(!n) for(int k=9; k>0; k--) { if(Conn[k]) Conn[k]->send(outstr); if(k == cur) printf(outstr); } else { Conn[n]->send(outstr); if(n == cur) printf(outstr); } j=0; n = d; } // Just a regular character else outstr[j++] = output[i]; i++; } // Wrap things up by outputting the last string. if(j) { outstr[j] = 0; if(!n) for(int k=9; k>0; k--) { if(Conn[k]) Conn[k]->send(outstr); if(k==cur) printf(outstr); } else { Conn[n]->send(outstr); if(n == cur) printf(outstr); } } }