Update of /cvsroot/alsa/alsa-lib/src/alisp
In directory sc8-pr-cvs1:/tmp/cvs-serv5084/src/alisp

Modified Files:
        Makefile.am alisp.c alisp_local.h 
Added Files:
        alisp_snd.c 
Log Message:
Added snd_hctl_open_ctl() function.
alisp massive extensions and tested ALSA function bindings.


--- NEW FILE: alisp_snd.c ---
/*
 *  ALSA lisp implementation - sound related commands
 *  Copyright (c) 2003 by Jaroslav Kysela <[EMAIL PROTECTED]>
 *
 *
 *   This library is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Lesser General Public License as
 *   published by the Free Software Foundation; either version 2.1 of
 *   the License, or (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Lesser General Public License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public
 *   License along with this library; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 */

struct acall_table {
        const char *name;
        struct alisp_object * (*func) (struct alisp_instance *instance, struct 
acall_table * item, struct alisp_object * args);
        void * xfunc;
        const char *prefix;
};

/*
 *  helper functions
 */

static inline const void *get_pointer(struct alisp_object * obj)
{
        if (obj->type == ALISP_OBJ_POINTER)
                return obj->value.ptr;
        return NULL;
}

static const char *get_string(struct alisp_object * obj, const char * deflt)
{
        if (obj == &alsa_lisp_t)
                return "true";
        if (obj->type == ALISP_OBJ_STRING)
                return obj->value.s;
        if (obj->type == ALISP_OBJ_IDENTIFIER)
                return obj->value.id;
        return deflt;
}

struct flags {
        const char *key;
        unsigned int mask;
}; 

static unsigned int get_flags(struct alisp_object * obj, const struct flags * flags, 
unsigned int deflt)
{
        const char *key;
        int invert;
        unsigned int result;
        const struct flags *ptr;

        if (obj == &alsa_lisp_nil)
                return deflt;
        result = deflt;
        do {
                key = get_string(obj, NULL);
                if (key) {
                        invert = key[0] == '!';
                        key += invert;
                        ptr = flags;
                        while (ptr->key) {
                                if (!strcmp(ptr->key, key)) {
                                        if (invert)
                                                result &= ~ptr->mask;
                                        else
                                                result |= ptr->mask;
                                        break;
                                }
                                ptr++;
                        }
                }
                obj = cdr(obj);
        } while (obj != &alsa_lisp_nil);
        return result;
}

static const void *get_ptr(struct alisp_object * obj, const char *_ptr_id)
{
        const char *ptr_id;
        
        ptr_id = get_string(car(obj), NULL);
        if (ptr_id == NULL)
                return NULL;
        if (strcmp(ptr_id, _ptr_id))
                return NULL;
        return get_pointer(cdr(obj));
}

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;

        if (err < 0)
                ptr = NULL;
        lexpr = new_object(instance, ALISP_OBJ_CONS);
        if (lexpr == NULL)
                return NULL;
        lexpr->value.c.car = new_integer(instance, err);
        if (lexpr->value.c.car == NULL)
                return NULL;
        p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
        if (p1 == NULL)
                return NULL;
        p1->value.c.car = new_object(instance, ALISP_OBJ_CONS);
        if ((p1 = p1->value.c.car) == NULL)
                return NULL;
        p1->value.c.car = new_string(instance, ptr_id);
        if (p1->value.c.car == NULL)
                return NULL;
        p1->value.c.cdr = new_pointer(instance, ptr);
        if (p1->value.c.cdr == NULL)
                return NULL;
        return lexpr;
}

/*
 *  macros
 */

/*
 *  HCTL functions
 */

typedef int (*snd_xxx_open_t)(void **rctl, const char *name, int mode);
typedef int (*snd_xxx_open1_t)(void **rctl, void *handle);
typedef int (*snd_xxx_close_t)(void **rctl);

static struct alisp_object * FA_xxx_open(struct alisp_instance * instance, struct 
acall_table * item, struct alisp_object * args)
{
        const char *name;
        int err, mode;
        void *handle;
        static struct flags flags[] = {
                { "nonblock", SND_CTL_NONBLOCK },
                { "async", SND_CTL_ASYNC },
                { "readonly", SND_CTL_READONLY },
                { NULL, 0 }
        };

        name = get_string(eval(instance, car(args)), NULL);
        if (name == NULL)
                return &alsa_lisp_nil;
        mode = get_flags(eval(instance, car(cdr(args))), flags, 0);
        
        err = ((snd_xxx_open_t)item->xfunc)(&handle, name, mode);
        return new_result1(instance, err, item->prefix, handle);
}

static struct alisp_object * FA_xxx_open1(struct alisp_instance * instance, struct 
acall_table * item, struct alisp_object * args)
{
        int err;
        void *handle;
        const char *prefix1 = "ctl";

        args = eval(instance, args);
        handle = (void *)get_ptr(args, prefix1);
        if (handle == NULL)
                return &alsa_lisp_nil;
        err = ((snd_xxx_open1_t)item->xfunc)(&handle, handle);
        return new_result1(instance, err, item->prefix, handle);
}

static struct alisp_object * FA_xxx_close(struct alisp_instance * instance, struct 
acall_table * item, struct alisp_object * args)
{
        void *handle;

        args = eval(instance, args);
        handle = (void *)get_ptr(args, item->prefix);
        if (handle == NULL)
                return &alsa_lisp_nil;
        return new_result(instance, ((snd_xxx_close_t)item->xfunc)(handle));
}

/*
 *  main code
 */

static struct acall_table acall_table[] = {
        { "ctl_close", &FA_xxx_close, (void *)&snd_ctl_close, "ctl" },
        { "ctl_open", &FA_xxx_open, (void *)&snd_ctl_open, "ctl" },
        { "hctl_close", &FA_xxx_close, (void *)&snd_hctl_close, "hctl" },
        { "hctl_open", &FA_xxx_open, (void *)&snd_hctl_open, "hctl" },
        { "hctl_open_ctl", &FA_xxx_open1, (void *)&snd_hctl_open_ctl, "hctl" },
};

static int acall_compar(const void *p1, const void *p2)
{
        return strcmp(((struct acall_table *)p1)->name,
                      ((struct acall_table *)p2)->name);
}

static struct alisp_object * F_acall(struct alisp_instance *instance, struct 
alisp_object * args)
{
        struct alisp_object * p1, *p2;
        struct acall_table key, *item;

        p1 = eval(instance, car(args));
        if (p1->type != ALISP_OBJ_IDENTIFIER && p1->type != ALISP_OBJ_STRING)
                return &alsa_lisp_nil;
        p2 = car(cdr(args));
        key.name = p1->value.s;
        if ((item = bsearch(&key, acall_table,
                            sizeof acall_table / sizeof acall_table[0],
                            sizeof acall_table[0], acall_compar)) != NULL)
                return item->func(instance, item, p2);
        lisp_warn(instance, "acall function %s' is undefined", p1->value.s);
        return &alsa_lisp_nil;
}

static struct intrinsic snd_intrinsics[] = {
        { "acall", F_acall },
};

Index: Makefile.am
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/alisp/Makefile.am,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Makefile.am 24 Jun 2003 19:30:09 -0000      1.1
+++ Makefile.am 27 Jul 2003 20:20:26 -0000      1.2
@@ -1,5 +1,7 @@
 EXTRA_LTLIBRARIES = libalisp.la
 
+EXTRA_DIST = alisp_snd.c
+
 libalisp_la_SOURCES = alisp.c
 
 noinst_HEADERS = alisp_local.h

Index: alisp.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- alisp.c     26 Jul 2003 15:19:27 -0000      1.3
+++ alisp.c     27 Jul 2003 20:20:26 -0000      1.4
@@ -142,6 +142,89 @@
        return p;
 }
 
+static void free_object(struct alisp_object * p)
+{
+       switch (p->type) {
+       case ALISP_OBJ_STRING:
+               if (p->value.s)
+                       free(p->value.s);
+               break;
+       case ALISP_OBJ_IDENTIFIER:
+               if (p->value.id)
+                       free(p->value.id);
+               break;
+       }
+}
+
+static void free_objects(struct alisp_instance *instance)
+{
+       struct alisp_object * p, * next;
+
+       for (p = instance->used_objs_list; p != NULL; p = next) {
+               next = p->next;
+               free_object(p);
+               free(p);
+       }
+       for (p = instance->free_objs_list; p != NULL; p = next) {
+               next = p->next;
+               free(p);
+       }
+}
+
+static struct alisp_object * new_integer(struct alisp_instance *instance, long value)
+{
+       struct alisp_object * obj;
+       
+       obj = new_object(instance, ALISP_OBJ_INTEGER);
+       if (obj)
+               obj->value.i = value;
+       return obj;
+}
+
+static struct alisp_object * new_float(struct alisp_instance *instance, double value)
+{
+       struct alisp_object * obj;
+       
+       obj = new_object(instance, ALISP_OBJ_FLOAT);
+       if (obj)
+               obj->value.f = value;
+       return obj;
+}
+
+static struct alisp_object * new_string(struct alisp_instance *instance, const char 
*str)
+{
+       struct alisp_object * obj;
+       
+       obj = new_object(instance, ALISP_OBJ_STRING);
+       if (obj && (obj->value.s = strdup(str)) == NULL) {
+               nomem();
+               return NULL;
+       }
+       return obj;
+}
+
+static struct alisp_object * new_identifier(struct alisp_instance *instance, const 
char *id)
+{
+       struct alisp_object * obj;
+       
+       obj = new_object(instance, ALISP_OBJ_IDENTIFIER);
+       if (obj && (obj->value.id = strdup(id)) == NULL) {
+               nomem();
+               return NULL;
+       }
+       return obj;
+}
+
+static struct alisp_object * new_pointer(struct alisp_instance *instance, const void 
*ptr)
+{
+       struct alisp_object * obj;
+       
+       obj = new_object(instance, ALISP_OBJ_POINTER);
+       if (obj)
+               obj->value.ptr = ptr;
+       return obj;
+}
+
 static struct alisp_object * search_object_identifier(struct alisp_instance 
*instance, const char *s)
 {
        struct alisp_object * p;
@@ -164,7 +247,7 @@
        return NULL;
 }
 
-static struct alisp_object * search_object_integer(struct alisp_instance *instance, 
int in)
+static struct alisp_object * search_object_integer(struct alisp_instance *instance, 
long in)
 {
        struct alisp_object * p;
 
@@ -448,13 +531,9 @@
        if (p == NULL)
                return NULL;
 
-       p->value.c.car = new_object(instance, ALISP_OBJ_IDENTIFIER);
+       p->value.c.car = new_identifier(instance, "quote");
        if (p->value.c.car == NULL)
                return NULL;
-       if ((p->value.c.car->value.id = strdup("quote")) == NULL) {
-               nomem();
-               return NULL;
-       }
        p->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
        if (p->value.c.cdr == NULL)
                return NULL;
@@ -490,48 +569,28 @@
                else if (!strcmp(instance->token_buffer, "nil"))
                        p = &alsa_lisp_nil;
                else {
-                       if ((p = search_object_identifier(instance, 
instance->token_buffer)) == NULL) {
-                               p = new_object(instance, ALISP_OBJ_IDENTIFIER);
-                               if (p) {
-                                       if ((p->value.id = 
strdup(instance->token_buffer)) == NULL) {
-                                               nomem();
-                                               return NULL;
-                                       }
-                               }
-                       }
+                       if ((p = search_object_identifier(instance, 
instance->token_buffer)) == NULL)
+                               p = new_identifier(instance, instance->token_buffer);
                }
                break;
        case ALISP_INTEGER: {
                long i;
                i = atol(instance->token_buffer);
-               if ((p = search_object_integer(instance, i)) == NULL) {
-                       p = new_object(instance, ALISP_OBJ_INTEGER);
-                       if (p)
-                               p->value.i = i;
-               }
+               if ((p = search_object_integer(instance, i)) == NULL)
+                       p = new_integer(instance, i);
                break;
        }
        case ALISP_FLOAT:
        case ALISP_FLOATE: {
                double f;
                f = atof(instance->token_buffer);
-               if ((p = search_object_float(instance, f)) == NULL) {
-                       p = new_object(instance, ALISP_OBJ_FLOAT);
-                       if (p)
-                               p->value.f = f;
-               }
+               if ((p = search_object_float(instance, f)) == NULL)
+                       p = new_float(instance, f);
                break;
        }
        case ALISP_STRING:
-               if ((p = search_object_string(instance, instance->token_buffer)) == 
NULL) {
-                       p = new_object(instance, ALISP_OBJ_STRING);
-                       if (p) {
-                               if ((p->value.s = strdup(instance->token_buffer)) == 
NULL) {
-                                       nomem();
-                                       return NULL;
-                               }
-                       }
-               }
+               if ((p = search_object_string(instance, instance->token_buffer)) == 
NULL)
+                       p = new_string(instance, instance->token_buffer);
                break;
        default:
                lisp_warn(instance, "%d:%d: unexpected character `%c'", 
instance->lineno, instance->charno, thistoken);
@@ -716,14 +775,7 @@
                if (p->gc != instance->gc_id && p->gc > 0) {
                        /* Remove unreferenced object. */
                        lisp_debug(instance, "** collecting cons %p", p);
-                       switch (p->type) {
-                       case ALISP_OBJ_STRING:
-                               free(p->value.s);
-                               break;
-                       case ALISP_OBJ_IDENTIFIER:
-                               free(p->value.id);
-                               break;
-                       }
+                       free_object(p);
 
                        p->next = instance->free_objs_list;
                        instance->free_objs_list = p;
@@ -821,13 +873,9 @@
        } while (p != &alsa_lisp_nil);
 
        if (type == ALISP_OBJ_INTEGER) {
-               p1 = new_object(instance, ALISP_OBJ_INTEGER);
-               if (p1)
-                       p1->value.i = v;
+               p1 = new_integer(instance, v);
        } else {
-               p1 = new_object(instance, ALISP_OBJ_FLOAT);
-               if (p1)
-                       p1->value.f = f;
+               p1 = new_float(instance, f);
        }
        return p1;
 }
@@ -869,13 +917,9 @@
        } while (p != &alsa_lisp_nil);
 
        if (type == ALISP_OBJ_INTEGER) {
-               p1 = new_object(instance, ALISP_OBJ_INTEGER);
-               if (p1)
-                       p1->value.i = v;
+               p1 = new_integer(instance, v);
        } else {
-               p1 = new_object(instance, ALISP_OBJ_FLOAT);
-               if (p1)
-                       p1->value.f = f;
+               p1 = new_object(instance, f);
        }
        return p1;
 }
@@ -907,13 +951,9 @@
        } while (p != &alsa_lisp_nil);
 
        if (type == ALISP_OBJ_INTEGER) {
-               p1 = new_object(instance, ALISP_OBJ_INTEGER);
-               if (p1)
-                       p1->value.i = v;
+               p1 = new_integer(instance, v);
        } else {
-               p1 = new_object(instance, ALISP_OBJ_FLOAT);
-               if (p1)
-                       p1->value.f = f;
+               p1 = new_float(instance, f);
        }
 
        return p1;
@@ -969,13 +1009,9 @@
        } while (p != &alsa_lisp_nil);
 
        if (type == ALISP_OBJ_INTEGER) {
-               p1 = new_object(instance, ALISP_OBJ_INTEGER);
-               if (p1)
-                       p1->value.i = v;
+               p1 = new_integer(instance, v);
        } else {
-               p1 = new_object(instance, ALISP_OBJ_FLOAT);
-               if (p1)
-                       p1->value.f = f;
+               p1 = new_float(instance, f);
        }
 
        return p1;
@@ -1151,9 +1187,6 @@
                f2 = p2->type == ALISP_OBJ_INTEGER ? p2->value.i : p2->value.f;
                if (f1 == f2)
                        return &alsa_lisp_t;
-       } else if ((p1->type == ALISP_OBJ_STRING || p2->type == ALISP_OBJ_STRING)) {
-               if (!strcmp(p1->value.s, p2->value.s))
-                       return &alsa_lisp_t;
        } else {
                lisp_warn(instance, "comparison with a non integer or float operand");
        }
@@ -1216,6 +1249,9 @@
        case ALISP_OBJ_FLOAT:
                snd_output_printf(out, "%f", p->value.f);
                break;
+       case ALISP_OBJ_POINTER:
+               snd_output_printf(out, "<%p>", p->value.ptr);
+               break;
        case ALISP_OBJ_CONS:
                snd_output_putc(out, '(');
                princ_cons(out, p);
@@ -1255,8 +1291,10 @@
        case ALISP_OBJ_T:
        case ALISP_OBJ_NIL:
        case ALISP_OBJ_INTEGER:
+       case ALISP_OBJ_FLOAT:
        case ALISP_OBJ_STRING:
        case ALISP_OBJ_IDENTIFIER:
+       case ALISP_OBJ_POINTER:
                return &alsa_lisp_t;
        }
 
@@ -1305,38 +1343,69 @@
        return first;
 }
 
-/*
- * Syntax: (eq expr1 expr2)
- */
-static struct alisp_object * F_eq(struct alisp_instance *instance, struct 
alisp_object * args)
+static inline int eq(struct alisp_object * p1, struct alisp_object * p2)
 {
-       struct alisp_object * p1, * p2;
-
-       p1 = eval(instance, car(args));
-       p2 = eval(instance, car(cdr(args)));
+       return p1 == p2;
+}
 
-       if (p1 == p2)
-               return &alsa_lisp_t;
+static int equal(struct alisp_object * p1, struct alisp_object * p2)
+{
+       if (eq(p1, p1))
+               return 1;
 
        if (p1->type == ALISP_OBJ_CONS || p2->type == ALISP_OBJ_CONS)
-               return &alsa_lisp_nil;
+               return 0;
 
        if (p1->type == p2->type)
                switch (p1->type) {
                case ALISP_OBJ_IDENTIFIER:
                        if (!strcmp(p1->value.id, p2->value.id))
-                               return &alsa_lisp_t;
-                       return &alsa_lisp_nil;
+                               return 1;
+                       return 0;
                case ALISP_OBJ_STRING:
                        if (!strcmp(p1->value.s, p2->value.s))
-                               return &alsa_lisp_t;
-                       return &alsa_lisp_nil;
+                               return 1;
+                       return 0;
                case ALISP_OBJ_INTEGER:
                        if (p1->value.i == p2->value.i)
-                               return &alsa_lisp_t;
-                       return &alsa_lisp_nil;
+                               return 1;
+                       return 0;
+               case ALISP_OBJ_FLOAT:
+                       if (p1->value.i == p2->value.i)
+                               return 1;
+                       return 0;
                }
 
+       return 0;
+}
+
+/*
+ * Syntax: (eq expr1 expr2)
+ */
+static struct alisp_object * F_eq(struct alisp_instance *instance, struct 
alisp_object * args)
+{
+       struct alisp_object * p1, * p2;
+
+       p1 = eval(instance, car(args));
+       p2 = eval(instance, car(cdr(args)));
+
+       if (eq(p1, p2))
+               return &alsa_lisp_t;
+       return &alsa_lisp_nil;
+}
+
+/*
+ * Syntax: (equal expr1 expr2)
+ */
+static struct alisp_object * F_equal(struct alisp_instance *instance, struct 
alisp_object * args)
+{
+       struct alisp_object * p1, * p2;
+
+       p1 = eval(instance, car(args));
+       p2 = eval(instance, car(cdr(args)));
+
+       if (equal(p1, p2))
+               return &alsa_lisp_t;
        return &alsa_lisp_nil;
 }
 
@@ -1584,13 +1653,9 @@
 
        lexpr = new_object(instance, ALISP_OBJ_CONS);
        if (lexpr) {
-               lexpr->value.c.car = new_object(instance, ALISP_OBJ_IDENTIFIER);
+               lexpr->value.c.car = new_identifier(instance, "lambda");
                if (lexpr->value.c.car == NULL)
                        return NULL;
-               if ((lexpr->value.c.car->value.id = strdup("lambda")) == NULL) {
-                       nomem();
-                       return NULL;
-               }
                if ((lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS)) == 
NULL)
                        return NULL;
                lexpr->value.c.cdr->value.c.car = p2;
@@ -1679,14 +1744,8 @@
 
        if (p->type == ALISP_INTEGER)
                return p;
-       if (p->type == ALISP_FLOAT) {
-               struct alisp_object * p1;
-               p1 = new_object(instance, ALISP_OBJ_INTEGER);
-               if (p1 == NULL)
-                       return NULL;
-               p1->value.i = floor(p->value.f);
-               return p1;
-       }
+       if (p->type == ALISP_FLOAT)
+               return new_integer(instance, floor(p->value.f));
 
        lisp_warn(instance, "expected an integer or float for integer conversion");
        return &alsa_lisp_nil;
@@ -1702,14 +1761,8 @@
 
        if (p->type == ALISP_FLOAT)
                return p;
-       if (p->type == ALISP_INTEGER) {
-               struct alisp_object * p1;
-               p1 = new_object(instance, ALISP_OBJ_FLOAT);
-               if (p1 == NULL)
-                       return NULL;
-               p1->value.f = p->value.i;
-               return p1;
-       }
+       if (p->type == ALISP_INTEGER)
+               return new_float(instance, p->value.i);
 
        lisp_warn(instance, "expected an integer or float for integer conversion");
        return &alsa_lisp_nil;
@@ -1726,27 +1779,95 @@
        if (p->type == ALISP_STRING)
                return p;
        if (p->type == ALISP_INTEGER || p->type == ALISP_FLOAT) {
-               struct alisp_object * p1;
                char buf[64];
-               p1 = new_object(instance, ALISP_OBJ_STRING);
-               if (p1 == NULL)
-                       return NULL;
                if (p->type == ALISP_INTEGER) {
                        snprintf(buf, sizeof(buf), "%ld", p->value.i);
                } else {
                        snprintf(buf, sizeof(buf), "%.f", p->value.f);
                }
-               if ((p1->value.s = strdup(buf)) == NULL) {
-                       nomem();
-                       return &alsa_lisp_nil;
-               }
-               return p1;
+               return new_string(instance, buf);
        }
 
        lisp_warn(instance, "expected an integer or float for integer conversion");
        return &alsa_lisp_nil;
 }
 
+/*
+ *  Syntax: (assoc key alist)
+ */
+struct alisp_object * F_assoc(struct alisp_instance *instance, struct alisp_object * 
args)
+{
+       struct alisp_object * p1, *p2;
+
+       p1 = eval(instance, car(args));
+       p2 = eval(instance, car(cdr(args)));
+
+       do {
+               if (eq(p1, car(car(p2))))
+                       return car(p2);
+               p2 = cdr(p2);
+       } while (p2 != &alsa_lisp_nil);
+
+       return &alsa_lisp_nil;  
+}
+
+/*
+ *  Syntax: (rassoc value alist)
+ */
+struct alisp_object * F_rassoc(struct alisp_instance *instance, struct alisp_object * 
args)
+{
+       struct alisp_object * p1, *p2;
+
+       p1 = eval(instance, car(args));
+       p2 = eval(instance, car(cdr(args)));
+
+       do {
+               if (eq(p1, cdr(car(p2))))
+                       return car(p2);
+               p2 = cdr(p2);
+       } while (p2 != &alsa_lisp_nil);
+
+       return &alsa_lisp_nil;  
+}
+
+/*
+ *  Syntax: (assq key alist)
+ */
+struct alisp_object * F_assq(struct alisp_instance *instance, struct alisp_object * 
args)
+{
+       struct alisp_object * p1, *p2;
+
+       p1 = eval(instance, car(args));
+       p2 = eval(instance, car(cdr(args)));
+
+       do {
+               if (equal(p1, car(car(p2))))
+                       return car(p2);
+               p2 = cdr(p2);
+       } while (p2 != &alsa_lisp_nil);
+
+       return &alsa_lisp_nil;  
+}
+
+/*
+ *  Syntax: (rassq value alist)
+ */
+struct alisp_object * F_rassq(struct alisp_instance *instance, struct alisp_object * 
args)
+{
+       struct alisp_object * p1, *p2;
+
+       p1 = eval(instance, car(args));
+       p2 = eval(instance, car(cdr(args)));
+
+       do {
+               if (equal(p1, cdr(car(p2))))
+                       return car(p2);
+               p2 = cdr(p2);
+       } while (p2 != &alsa_lisp_nil);
+
+       return &alsa_lisp_nil;  
+}
+
 static struct alisp_object * F_dump_memory(struct alisp_instance *instance, struct 
alisp_object * args)
 {
        struct alisp_object * p = car(args);
@@ -1798,6 +1919,8 @@
        { ">", F_gt },
        { ">=", F_ge },
        { "and", F_and },
+       { "assoc", F_assoc },
+       { "assq", F_assq },
        { "atom", F_atom },
        { "car", F_car },
        { "cdr", F_cdr },
@@ -1805,6 +1928,7 @@
        { "cons", F_cons },
        { "defun", F_defun },
        { "eq", F_eq },
+       { "equal", F_equal },
        { "eval", F_eval },
        { "float", F_float },
        { "garbage-collect", F_gc },
@@ -1820,6 +1944,8 @@
        { "prog2", F_prog2 },
        { "progn", F_progn },
        { "quote", F_quote },
+       { "rassoc", F_rassoc },
+       { "rassq", F_rassq },
        { "set", F_set },
        { "setf", F_setq },
        { "setq", F_setq },
@@ -1829,6 +1955,8 @@
        { "while", F_while },
 };
 
+#include "alisp_snd.c"
+
 static int compar(const void *p1, const void *p2)
 {
        return strcmp(((struct intrinsic *)p1)->name,
@@ -1850,6 +1978,11 @@
                                    sizeof intrinsics[0], compar)) != NULL)
                        return item->func(instance, p2);
 
+               if ((item = bsearch(&key, snd_intrinsics,
+                                   sizeof snd_intrinsics / sizeof snd_intrinsics[0],
+                                   sizeof snd_intrinsics[0], compar)) != NULL)
+                       return item->func(instance, p2);
+
                if ((p3 = get_object(instance, p1)) != &alsa_lisp_nil)
                        return eval_func(instance, p3, p2);
                else
@@ -1883,7 +2016,7 @@
  *  main routine
  */
  
-int alsa_lisp(struct alisp_cfg *cfg)
+int alsa_lisp(struct alisp_cfg *cfg, struct alisp_instance **_instance)
 {
        struct alisp_instance *instance;
        struct alisp_object *p, *p1;
@@ -1932,7 +2065,18 @@
        }
 
        done_lex(instance);
-       free(instance);
+       if (_instance)
+               *_instance = instance;
+       else
+               alsa_lisp_free(instance); 
        
        return 0;
+}
+
+void alsa_lisp_free(struct alisp_instance *instance)
+{
+       if (instance == NULL)
+               return;
+       free_objects(instance);
+       free(instance);
 }

Index: alisp_local.h
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp_local.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- alisp_local.h       26 Jul 2003 15:19:27 -0000      1.3
+++ alisp_local.h       27 Jul 2003 20:20:26 -0000      1.4
@@ -36,6 +36,7 @@
        ALISP_OBJ_FLOAT,
        ALISP_OBJ_IDENTIFIER,
        ALISP_OBJ_STRING,
+       ALISP_OBJ_POINTER,
        ALISP_OBJ_CONS
 };
 
@@ -47,6 +48,7 @@
                char    *s;
                long    i;
                double  f;
+               const void *ptr;
                struct {
                        struct alisp_object *car;
                        struct alisp_object *cdr;



-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to