Update of /cvsroot/alsa/alsa-lib/src/alisp In directory sc8-pr-cvs1:/tmp/cvs-serv29050/src/alisp
Modified Files: alisp.c alisp_snd.c Log Message: More changes to the ordinary mixer API Index: alisp.c =================================================================== RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- alisp.c 9 Sep 2003 19:24:36 -0000 1.10 +++ alisp.c 13 Oct 2003 12:06:45 -0000 1.11 @@ -51,6 +51,7 @@ static void princ_cons(snd_output_t *out, struct alisp_object * p); static void princ_object(snd_output_t *out, struct alisp_object * p); static struct alisp_object * eval(struct alisp_instance *instance, struct alisp_object * p); +static struct alisp_object * eval_cons1(struct alisp_instance *instance, struct alisp_object * p1, struct alisp_object * p2); /* functions */ static struct alisp_object *F_eval(struct alisp_instance *instance, struct alisp_object *); @@ -467,7 +468,7 @@ return instance->thistoken; got_id: - case '_': case '+': case '*': case '/': case '%': + case '!': case '_': case '+': case '*': case '/': case '%': case '<': case '>': case '=': case '&': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': @@ -479,7 +480,7 @@ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': - /* Identifier: [-/+*%<>=&a-zA-Z_][-/+*%<>=&a-zA-Z_0-9]* */ + /* Identifier: [!-/+*%<>=&a-zA-Z_][-/+*%<>=&a-zA-Z_0-9]* */ p = instance->token_buffer; do { if (p - instance->token_buffer >= instance->token_buffer_max) { @@ -489,7 +490,7 @@ } *p++ = c; c = xgetc(instance); - } while (isalnum(c) || strchr("_-+*/%<>=&", c) != NULL); + } while (isalnum(c) || strchr("!_-+*/%<>=&", c) != NULL); xungetc(instance, c); *p = '\0'; return instance->thistoken = ALISP_IDENTIFIER; @@ -1326,6 +1327,19 @@ } /* + * Syntax: (!= expr1 expr2) + */ +static struct alisp_object * F_numneq(struct alisp_instance *instance, struct alisp_object * args) +{ + struct alisp_object * p; + + p = F_numeq(instance, args); + if (p == &alsa_lisp_nil) + return &alsa_lisp_t; + return &alsa_lisp_nil; +} + +/* * Syntax: (exfun name) * Test, if a function exists */ @@ -1333,7 +1347,7 @@ { struct alisp_object * p1, * p2; - p1 = car(args); + p1 = eval(instance, car(args)); if (p1->type != ALISP_OBJ_STRING && p1->type != ALISP_OBJ_IDENTIFIER) return &alsa_lisp_nil; p2 = get_object(instance, p1); @@ -1961,6 +1975,20 @@ } /* + * Syntax: (call function args...) + */ +struct alisp_object * F_call(struct alisp_instance *instance, struct alisp_object * args) +{ + struct alisp_object * p = eval(instance, car(args)); + + if (p->type != ALISP_OBJ_IDENTIFIER && p->type != ALISP_OBJ_STRING) { + lisp_warn(instance, "expected an function name"); + return &alsa_lisp_nil; + } + return eval_cons1(instance, p, cdr(args)); +} + +/* * Syntax: (int value) * 'value' can be integer or float type */ @@ -1968,9 +1996,9 @@ { struct alisp_object * p = eval(instance, car(args)); - if (p->type == ALISP_INTEGER) + if (p->type == ALISP_OBJ_INTEGER) return p; - if (p->type == ALISP_FLOAT) + if (p->type == ALISP_OBJ_FLOAT) return new_integer(instance, floor(p->value.f)); lisp_warn(instance, "expected an integer or float for integer conversion"); @@ -1985,9 +2013,9 @@ { struct alisp_object * p = eval(instance, car(args)); - if (p->type == ALISP_FLOAT) + if (p->type == ALISP_OBJ_FLOAT) return p; - if (p->type == ALISP_INTEGER) + if (p->type == ALISP_OBJ_INTEGER) return new_float(instance, p->value.i); lisp_warn(instance, "expected an integer or float for integer conversion"); @@ -2002,9 +2030,9 @@ { struct alisp_object * p = eval(instance, car(args)); - if (p->type == ALISP_STRING) + if (p->type == ALISP_OBJ_STRING) return p; - if (p->type == ALISP_INTEGER || p->type == ALISP_FLOAT) { + if (p->type == ALISP_OBJ_INTEGER || p->type == ALISP_OBJ_FLOAT) { char buf[64]; if (p->type == ALISP_INTEGER) { snprintf(buf, sizeof(buf), "%ld", p->value.i); @@ -2166,6 +2194,7 @@ }; static struct intrinsic intrinsics[] = { + { "!=", F_numneq }, { "%", F_mod }, { "&dump-memory", F_dump_memory }, { "&dump-objects", F_dump_objects }, @@ -2183,6 +2212,7 @@ { "assoc", F_assoc }, { "assq", F_assq }, { "atom", F_atom }, + { "call", F_call }, { "car", F_car }, { "cdr", F_cdr }, { "cond", F_cond }, @@ -2233,33 +2263,41 @@ ((struct intrinsic *)p2)->name); } -static struct alisp_object * eval_cons(struct alisp_instance *instance, struct alisp_object * p) +static struct alisp_object * eval_cons1(struct alisp_instance *instance, struct alisp_object * p1, struct alisp_object * p2) { - struct alisp_object * p1 = car(p), * p2 = cdr(p), * p3; + struct alisp_object * p3; + struct intrinsic key, *item; - if (p1 != &alsa_lisp_nil && p1->type == ALISP_OBJ_IDENTIFIER) { - struct intrinsic key, *item; + key.name = p1->value.id; + if ((item = bsearch(&key, intrinsics, + sizeof intrinsics / sizeof intrinsics[0], + sizeof intrinsics[0], compar)) != NULL) + return item->func(instance, p2); - if (!strcmp(p1->value.id, "lambda")) - return p; + if ((item = bsearch(&key, snd_intrinsics, + sizeof snd_intrinsics / sizeof snd_intrinsics[0], + sizeof snd_intrinsics[0], compar)) != NULL) + return item->func(instance, p2); - auto_garbage_collect(instance); + if ((p3 = get_object(instance, p1)) != &alsa_lisp_nil) + return eval_func(instance, p3, p2); + else + lisp_warn(instance, "function `%s' is undefined", p1->value.id); - key.name = p1->value.id; - if ((item = bsearch(&key, intrinsics, - sizeof intrinsics / sizeof intrinsics[0], - sizeof intrinsics[0], compar)) != NULL) - return item->func(instance, p2); + return &alsa_lisp_nil; +} - if ((item = bsearch(&key, snd_intrinsics, - sizeof snd_intrinsics / sizeof snd_intrinsics[0], - sizeof snd_intrinsics[0], compar)) != NULL) - return item->func(instance, p2); +static inline struct alisp_object * eval_cons(struct alisp_instance *instance, struct alisp_object * p) +{ + struct alisp_object * p1 = car(p); - if ((p3 = get_object(instance, p1)) != &alsa_lisp_nil) - return eval_func(instance, p3, p2); - else - lisp_warn(instance, "function `%s' is undefined", p1->value.id); + if (p1 != &alsa_lisp_nil && p1->type == ALISP_OBJ_IDENTIFIER) { + if (!strcmp(p1->value.id, "lambda")) + return p; + + auto_garbage_collect(instance); + + return eval_cons1(instance, p1, cdr(p)); } return &alsa_lisp_nil; @@ -2655,8 +2693,8 @@ { struct alisp_object * p2; - if (seq->type == ALISP_OBJ_CONS && seq->value.c.cdr->type == ALISP_OBJ_CONS) - seq = seq->value.c.cdr; + if (seq->type == ALISP_OBJ_CONS && seq->value.c.car->type == ALISP_OBJ_CONS) + seq = seq->value.c.car; if (seq->type == ALISP_OBJ_CONS) { p2 = seq->value.c.car; if (p2->type != ALISP_OBJ_STRING) Index: alisp_snd.c =================================================================== RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp_snd.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- alisp_snd.c 9 Sep 2003 19:24:36 -0000 1.6 +++ alisp_snd.c 13 Oct 2003 12:06:45 -0000 1.7 @@ -188,11 +188,6 @@ return lexpr; } -static inline struct alisp_object * new_result(struct alisp_instance * instance, int err) -{ - return new_integer(instance, err); -} - static struct alisp_object * new_result1(struct alisp_instance * instance, int err, const char *ptr_id, void *ptr) { struct alisp_object * lexpr, * p1; @@ -254,6 +249,7 @@ typedef int (*snd_int_pp_strp_int_t)(void **rctl, const char *name, int mode); typedef int (*snd_int_pp_p_t)(void **rctl, void *handle); typedef int (*snd_int_p_t)(void *rctl); +typedef char * (*snd_str_p_t)(void *rctl); typedef int (*snd_int_intp_t)(int *val); typedef int (*snd_int_str_t)(const char *str); typedef int (*snd_int_int_strp_t)(int val, char **str); @@ -328,7 +324,18 @@ handle = (void *)get_ptr(args, item->prefix); if (handle == NULL) return &alsa_lisp_nil; - return new_result(instance, ((snd_int_p_t)item->xfunc)(handle)); + return new_integer(instance, ((snd_int_p_t)item->xfunc)(handle)); +} + +static struct alisp_object * FA_str_p(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args) +{ + void *handle; + + args = eval(instance, car(args)); + handle = (void *)get_ptr(args, item->prefix); + if (handle == NULL) + return &alsa_lisp_nil; + return new_string(instance, ((snd_str_p_t)item->xfunc)(handle)); } static struct alisp_object * FA_int_intp(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args) @@ -351,7 +358,7 @@ if (args->type != ALISP_OBJ_STRING && args->type != ALISP_OBJ_IDENTIFIER) return &alsa_lisp_nil; err = ((snd_int_str_t)item->xfunc)(args->value.s); - return new_result(instance, err); + return new_integer(instance, err); } static struct alisp_object * FA_int_int_strp(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args) @@ -606,7 +613,7 @@ snd_ctl_elem_value_alloca(&value); err = snd_hctl_elem_info(handle, info); if (err < 0) - return new_result(instance, err); + return new_integer(instance, err); type = snd_ctl_elem_info_get_type(info); count = snd_ctl_elem_info_get_count(info); if (type == SND_CTL_ELEM_TYPE_IEC958) { @@ -641,7 +648,7 @@ p1 = cdr(p1); } while (p1 != &alsa_lisp_nil); err = snd_hctl_elem_write(handle, value); - return new_result(instance, err); + return new_integer(instance, err); } static struct alisp_object * FA_pcm_info(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args) @@ -701,6 +708,7 @@ { "hctl_open", &FA_int_pp_strp_int, (void *)&snd_hctl_open, "hctl" }, { "hctl_open_ctl", &FA_int_pp_p, (void *)&snd_hctl_open_ctl, "hctl" }, { "pcm_info", &FA_pcm_info, NULL, "pcm" }, + { "pcm_name", &FA_str_p, (void *)&snd_pcm_name, "pcm" }, }; static int acall_compar(const void *p1, const void *p2) ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. SourceForge.net hosts over 70,000 Open Source Projects. See the people who have HELPED US provide better services: Click here: http://sourceforge.net/supporters.php _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog