minidol: initial commit
[jump.git] / minidol / lib / dol.c
diff --git a/minidol/lib/dol.c b/minidol/lib/dol.c
new file mode 100644 (file)
index 0000000..fed6ca4
--- /dev/null
@@ -0,0 +1,94 @@
+/* DOL Block Implementation */
+
+#include <stdio.h>
+#include <dol.h>
+#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);
+}
+