Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
Файл: expr.c Проект: kybp/basic
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);
    }
}