Added the beginnings of list support for CCSP (using glib)

This commit is contained in:
Neil Brown 2008-03-25 18:44:49 +00:00
parent 963b677142
commit 20a142839f
2 changed files with 82 additions and 6 deletions

View File

@ -348,8 +348,7 @@ cgenType (A.Chan _ _ t) = tell ["Channel*"]
-- Any -- not used
--cgenType (A.Port t) =
--TODO have a pass that declares these list types:
cgenType t@(A.List {}) = tell [subRegex (mkRegex "[^A-Za-z0-9]") (show t) ""]
cgenType (A.List {}) = tell ["GQueue*"]
cgenType t
= do f <- fget getScalarType
@ -532,14 +531,33 @@ genLitSuffix A.UInt64 = tell ["ULL"]
genLitSuffix A.Real32 = tell ["F"]
genLitSuffix _ = return ()
-- TODO don't allocate for things less than 64-bits in size
cgenListLiteral :: [A.Expression] -> A.Type -> CGen ()
cgenListLiteral _ _ = call genMissing "C backend does not yet support lists"
cgenListLiteral es t
= foldl addItem (tell ["g_queue_new()"]) es
where
addItem :: CGen () -> A.Expression -> CGen ()
addItem prev add
= do tell ["g_queue_push_head("]
prev
tell [","]
call genExpression add
tell [")"]
cgenListSize :: A.Variable -> CGen ()
cgenListSize _ = call genMissing "C backend does not yet support lists"
cgenListSize v = do tell ["g_queue_get_length("]
call genVariable v
tell [")"]
cgenListAssign :: A.Variable -> A.Expression -> CGen ()
cgenListAssign _ _ = call genMissing "C backend does not yet support lists"
cgenListAssign v e
= do tell ["tock_free_queue("]
call genVariable v
tell [");"]
call genVariable v
tell ["="]
call genExpression e
tell [";"]
cgenLiteralRepr :: A.LiteralRepr -> A.Type -> CGen ()
cgenLiteralRepr (A.RealLiteral m s) t = tell [s] >> genLitSuffix t
@ -979,7 +997,12 @@ cgenDyadic _ A.Concat e f = call genListConcat e f
--}}}
cgenListConcat :: A.Expression -> A.Expression -> CGen ()
cgenListConcat _ _ = call genMissing "C backend does not yet support lists"
cgenListConcat a b
= do tell ["tock_queue_concat("]
call genExpression a
tell [","]
call genExpression b
tell [")"]
--{{{ input/output items
cgenInputItem :: A.Variable -> A.InputItem -> CGen ()

View File

@ -20,8 +20,10 @@
#define TOCK_SUPPORT_CIF_H
#include <cif.h>
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>
@ -141,4 +143,55 @@ static void tock_init_ccsp (bool uses_stdin) {
}
//}}}
//{{{ Helpers for lists
//Just like g_queue_push_tail, but returns the queue pointer:
static inline GQueue* tock_push_tail(GQueue*, gpointer) occam_unused;
static inline GQueue* tock_push_tail(GQueue* queue, gpointer data)
{
g_queue_push_tail(queue,data);
return queue;
}
static void tock_free_helper(gpointer, gpointer) occam_unused;
static void tock_free_helper(gpointer data, gpointer _unused)
{
free(data);
}
//This should go away once we start using mobiles properly:
static gpointer tock_new_helper(gpointer, guint) occam_unused;
static gpointer tock_new_helper(gpointer src, guint sz)
{
gpointer ret = malloc(sz);
memcpy(ret,src,sz);
return ret;
}
//Deletes everything in the queue and frees it:
static inline void tock_free_queue(GQueue*) occam_unused;
static inline void tock_free_queue(GQueue* queue)
{
g_queue_foreach(queue, tock_free_helper, NULL);
g_queue_free(queue);
}
//Moves both queues into a concatenated new queue.
//Don't rely on either of the passed arguments being
//valid afterwards
static inline GQueue* tock_queue_concat(GQueue*,GQueue*) occam_unused;
static inline GQueue* tock_queue_concat(GQueue* a, GQueue* b)
{
a->length += b->length;
a->head = g_list_concat(a->head, b-> head);
a->tail = b->tail;
b->head = NULL;
b->tail = NULL;
b->length = 0;
g_queue_free(b);
return a;
}
//}}}
#endif