X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=minidol%2Flib%2Fdol.c;fp=minidol%2Flib%2Fdol.c;h=fed6ca483a8c86bc18ce610ecaf55cca635ca461;hb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;hp=0000000000000000000000000000000000000000;hpb=3e30b001296fb059cb070498bbe5d8e8834cd3e3;p=jump.git diff --git a/minidol/lib/dol.c b/minidol/lib/dol.c new file mode 100644 index 0000000..fed6ca4 --- /dev/null +++ b/minidol/lib/dol.c @@ -0,0 +1,94 @@ +/* DOL Block Implementation */ + +#include +#include +#include "ports.h" + +/* DOL support functions + * ===================================================================== */ +int DOL_read(void *port, void *buf, int len, DOLProcess *p) +{ + port_t *pp = get_port(port); + if(!pp || !pp->read) return 0; + + return(pp->read(buf, len)); +} + +int DOL_write(void *port, void *buf, int len, DOLProcess *p) +{ + port_t *pp = get_port(port); + if(!pp || !pp->write) return 0; + + return(pp->write(buf, len)); +} + +int DOL_rtest(void *port, int len, DOLProcess *p) +{ + /* check if channel contains at least 'len' bytes */ + port_t *pp = get_port(port); + if(!pp || !pp->level) return 0; + + int level = pp->level(); + return (level >= len) ? 1 : 0; +} + +int DOL_wtest(void *port, int len, DOLProcess *p) +{ + /* check if channel has space for at least 'len' bytes */ + port_t *pp = get_port(port); + if(!pp || !pp->level) return 0; + + int level = pp->level(); + return (level < (pp->size() - len)) ? 1 : 0; +} + +void DOL_detach(DOLProcess *p) +{ + p->wptr->active = 0; + return; +} + +int DOL_get_index(int dim, DOLProcess *p) +{ + if((dim < 0) || (dim > 4)) return(-1); + + return(p->wptr->instance[dim]); +} + +char* DOL_create_port(char* port, char* base, int ndim, int index0, int range0, + int index1, int range1, int index2, int range2, int index3, int range3) +{ + /* hang on invalid input */ + if(range0 && (index0 >= range0)) while(1); + if(range1 && (index1 >= range1)) while(1); + if(range2 && (index2 >= range2)) while(1); + if(range3 && (index3 >= range3)) while(1); + + switch(ndim) { + case 1: + snprintf(port, PORTNAME_MAXLEN-1, + "%s_%i", base, index0); + port[PORTNAME_MAXLEN-1] = '\0'; + break; + case 2: + snprintf(port, PORTNAME_MAXLEN-1, + "%s_%i_%i", base, index0, index1); + port[PORTNAME_MAXLEN-1] = '\0'; + break; + case 3: + snprintf(port, PORTNAME_MAXLEN-1, + "%s_%i_%i_%i", base, index0, index1, index2), + port[PORTNAME_MAXLEN-1] = '\0'; + break; + case 4: + snprintf(port, PORTNAME_MAXLEN-1, + "%s_%i_%i_%i_%i", base, index0, index1, index2, index3); + port[PORTNAME_MAXLEN-1] = '\0'; + break; + default: + while(1); + } + + return(port); +} +