bool SkParse::FindBool(const char str[], bool* value) { static const char* gYes[] = { "yes", "1", "true" }; static const char* gNo[] = { "no", "0", "false" }; if (lookup_str(str, gYes, SK_ARRAY_COUNT(gYes))) { if (value) *value = true; return true; } else if (lookup_str(str, gNo, SK_ARRAY_COUNT(gNo))) { if (value) *value = false; return true; } return false; }
int main(int argc, char **argv) { long nid, verb, param; int c; char **p; bool quiet = false; while ((c = getopt(argc, argv, "qlL")) >= 0) { switch (c) { case 'l': list_verbs(0); return 0; case 'L': list_verbs(1); return 0; case 'q': quiet = true; break; default: usage(); return 1; } } if (argc - optind < 3) { usage(); return 1; } p = argv + optind; nid = strtol(*p, NULL, 0); if (nid < 0 || nid > 0xff) { fprintf(stderr, "invalid nid %s\n", *p); return 1; } p++; if (!isdigit(**p)) { strtoupper(*p); verb = lookup_str(hda_verbs, *p); if (verb < 0) return 1; } else { verb = strtol(*p, NULL, 0); if (verb < 0 || verb > 0xfff) { fprintf(stderr, "invalid verb %s\n", *p); return 1; } } p++; if (!isdigit(**p)) { strtoupper(*p); param = lookup_str(hda_params, *p); if (param < 0) return 1; } else { param = strtol(*p, NULL, 0); if (param < 0 || param > 0xffff) { fprintf(stderr, "invalid param %s\n", *p); return 1; } } if (!quiet) printf("nid = 0x%lx, verb = 0x%lx, param = 0x%lx\n", nid, verb, param); UInt32 command = (UInt32)HDA_VERB(nid, verb, param); // Execute command UInt32 result = execute_command(command, 0x10ec0892, 0x0, 0x01); // Print result if (quiet) printf("0x%08x\n", result); else printf("command 0x%08x --> result = 0x%08x\n", command, result); return 0; }
void eval_expr(expr *in, expr *out, symtab *table) { switch (in->type) { case NOTHING: break; case INTEGER: case REAL: case STRING: out->type = in->type; out->val = in->val; return; case INT_VAR: { int n; if (lookup_int(in->val.string, table, &n)) { out->type = INTEGER; out->val.integer = n; return; } else { fprintf(stderr, "undefined integer variable '%s'\n", in->val.string); exit(1); } } break; case REAL_VAR: { double d; if (lookup_real(in->val.string, table, &d)) { out->type = REAL; out->val.real = d; return; } else { fprintf(stderr, "undefined real variable '%s'\n", in->val.string); exit(1); } } break; case STR_VAR: { char *s = (char *)malloc(MAX_LINE); if (lookup_str(in->val.string, table, &s)) { out->type = STRING; out->val.string = s; return; } else { fprintf(stderr, "undefined string variable '%s'\n", in->val.string); exit(1); } } break; } switch (in->op) { case NOTHING: fprintf(stderr, "No operation for non-constant expression\n"); exit(1); case ADD: add_expr(in, out, table); break; case SUB: sub_expr(in, out, table); break; case EXPT: pow_expr(in, out, table); break; case MUL: mul_expr(in, out, table); break; case DIV: div_expr(in, out, table); break; case LT: eval_expr(in->arg1, out->arg1, table); eval_expr(in->arg2, out->arg2, table); out->type = INTEGER; out->val.integer = compare(out->arg1, out->arg2, LT); break; case LE: eval_expr(in->arg1, out->arg1, table); eval_expr(in->arg2, out->arg2, table); out->type = INTEGER; out->val.integer = compare(out->arg1, out->arg2, LE); break; case EQ: eval_expr(in->arg1, out->arg1, table); eval_expr(in->arg2, out->arg2, table); out->type = INTEGER; out->val.integer = compare(out->arg1, out->arg2, EQ); break; case GE: eval_expr(in->arg1, out->arg1, table); eval_expr(in->arg2, out->arg2, table); out->type = INTEGER; out->val.integer = compare(out->arg1, out->arg2, GE); break; case GT: eval_expr(in->arg1, out->arg1, table); eval_expr(in->arg2, out->arg2, table); out->type = INTEGER; out->val.integer = compare(out->arg1, out->arg2, GT); break; case NE: eval_expr(in->arg1, out->arg1, table); eval_expr(in->arg2, out->arg2, table); out->type = INTEGER; out->val.integer = compare(out->arg1, out->arg2, NE); break; /* Numerical functions */ case RAND: { expr arg; eval_expr(in->arg1, &arg, table); out->type = INTEGER; out->val.integer = rand() % arg.val.integer; } break; case SQRT: { expr arg; eval_expr(in->arg1, &arg, table); out->type = REAL; out->val.real = sqrt(arg.type == REAL ? arg.val.real : (double)arg.val.integer); } break; /* Casting */ case CEIL: { expr arg; eval_expr(in->arg1, &arg, table); out->type = INTEGER; out->val.integer = (int)ceil(arg.val.real); } break; case FLOOR: { expr arg; eval_expr(in->arg1, &arg, table); out->type = INTEGER; out->val.integer = (int)floor(arg.val.real); } break; case REAL_CAST: { expr arg; eval_expr(in->arg1, &arg, table); out->type = REAL; out->val.real = (double)arg.val.integer; } break; case ROUND: { expr arg; eval_expr(in->arg1, &arg, table); out->type = INTEGER; out->val.integer = (int)round(arg.val.real); } break; default: fprintf(stderr, "unrecognised operation\n"); exit(1); } }