static FcBool interpret_builtin (FcFormatContext *c, FcPattern *pat, FcStrBuf *buf) { FcChar8 *new_str = NULL; FcBool ret; if (!expect_char (c, '=') || !read_word (c)) return FcFalse; /* try simple builtins first */ if (0) { } #define BUILTIN(name, func) \ else if (0 == strcmp ((const char *) c->word, name))\ do { new_str = func (pat); ret = FcTrue; } while (0) BUILTIN ("unparse", FcNameUnparse); /* BUILTIN ("verbose", FcPatternPrint); XXX */ #undef BUILTIN else
static struct buffer parse_table(struct buffer buff, struct invocation *invocation, const char **error) { unsigned i; size_t ident_len; struct argument args[QUERY_MAX_ARGS]; const char *ident_name = NULL; unsigned argi = 0; buff = chomp(buff); buff = expect_char(buff, '{', error); if (*error) goto clean; buff = chomp(buff); while (!peek(buff, "}")) { if (argi >= QUERY_MAX_ARGS) { raise_too_many_arguments(error); goto clean; } if (isalpha((int)buff.data[buff.offset])) { buff = get_ident(buff, &ident_name, &ident_len, error); if (!*error) { args[argi].a.value.type = RDT_STRING; args[argi].a.value.val.string.len = ident_len; args[argi].a.value.val.string.buff = (char*)calloc( ident_len + 1, sizeof(char) ); if (!args[argi].a.value.val.string.buff) goto clean; strncpy( args[argi].a.value.val.string.buff, ident_name, ident_len ); } } else buff = parse_string(buff, &args[argi].a.value, error); if (*error) goto clean; args[argi].type = AT_VALUE; buff = chomp(buff); argi++; buff = expect_char(buff, ':', error); if (*error) goto clean; buff = chomp(buff); if (argi >= QUERY_MAX_ARGS) { raise_too_many_arguments(error); goto clean; } buff = parse_argument(buff, &args[argi], error); if (*error) goto clean; argi++; buff = chomp(buff); buff = expect_char(buff, ',', error); if (*error) { *error = NULL; break; } buff = chomp(buff); } buff = expect_char(buff, '}', error); if (*error) goto clean; invocation->func = all_map; invocation->argc = argi; invocation->argv = (struct argument*) malloc(sizeof(struct argument) * argi); if (!invocation->argv) { raise_enomem(error); goto clean; } memcpy(invocation->argv, args, sizeof(struct argument) * argi); goto success; clean: for (i = 0; i < argi; i++) argument_free(&args[i]); success: return buff; }
int main (int argc, char **argv) { char * password = 0; char * username = 0; char expect = ':'; int opt, pty, pid, rc; int times = 1; while((opt = getopt(argc,argv,"+hrp:u:")) != -1) switch(opt) { case 'h': printf("%s",myexpect_usage); exit(0); break; case 'p': password = strdup(optarg); break; case 'u': username = strdup(optarg); break; case 'r': times = 2; break; default: fprintf(stderr,"Wrong option. Check usage\n"); fprintf(stderr,"%s",myexpect_usage); exit(-1); break; } if (password == 0 || username == 0 || optind >= argc ) { fprintf(stderr,"Wrong number of arguments. Check usage\n"); fprintf(stderr,"%s",myexpect_usage); exit(-1); } pid = forkpty(&pty,0,0,0); if(pid == 0) { struct termios tios; tcgetattr(pty, &tios); tios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); tios.c_oflag &= ~(ONLCR); tcsetattr(pty, TCSANOW, &tios); execvp(argv[optind],&(argv[optind])); exit(-1); } else if (pid == -1) { perror("fork\n"); } while ( times > 0 ) { if (expect_char(pty,&expect,1) == -1) { return -1; } sleep(1); write_answer(pty,username); if (expect_char(pty,&expect,1) == -1) { return -1; } sleep(1); write_answer(pty,password); times = times - 1; } expect_char(pty,0,0); wait(&rc); return WEXITSTATUS(rc); }
static struct buffer parse_method_call(struct buffer buff, struct invocation *invocation, const char **error) { size_t func_name_len; unsigned i; struct argument args[QUERY_MAX_ARGS]; unsigned argi = 0; const char *func_name = NULL; struct registered_func *rf = registered_functions; invocation->func = NULL; buff = get_ident(buff, &func_name, &func_name_len, error); if (*error) goto clean; buff = chomp(buff); buff = expect_char(buff, '(', error); if (*error) goto clean; while (rf->name) { if (strncmp(rf->name, func_name, func_name_len) == 0) { invocation->func = rf->func; break; } rf++; } if (!invocation->func) { raise_unknown_function(buff.offset, func_name, func_name_len, error); goto clean; } buff = chomp(buff); while (!peek(buff, ")")) { if (argi >= QUERY_MAX_ARGS) { raise_too_many_arguments(error); goto clean; } buff = parse_argument(buff, &args[argi], error); if (*error) goto clean; argi++; buff = chomp(buff); buff = expect_char(buff, ',', error); if (*error) { *error = NULL; break; } buff = chomp(buff); } buff = expect_char(buff, ')', error); if (*error) goto clean; invocation->argc = argi; invocation->argv = (struct argument*) malloc(sizeof(struct argument) * argi); if (!invocation->argv) { raise_enomem(error); goto clean; } memcpy(invocation->argv, args, sizeof(struct argument) * argi); goto success; clean: for (i = 0; i < argi; i++) argument_free(&args[i]); success: return buff; }