summaryrefslogtreecommitdiff
path: root/emu/port/devtab.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2009-03-25 16:37:32 +0000
committerCharles.Forsyth <devnull@localhost>2009-03-25 16:37:32 +0000
commite0a2b8d82a5521d9391ca8c6f055777954c76c2f (patch)
treebed98eebad567e161db651e8a173f1a819169292 /emu/port/devtab.c
parentd8150d92150b08ade63d7cd8b666cb26551110ff (diff)
x20090315-1636
Diffstat (limited to 'emu/port/devtab.c')
-rw-r--r--emu/port/devtab.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/emu/port/devtab.c b/emu/port/devtab.c
new file mode 100644
index 00000000..69c5f7b2
--- /dev/null
+++ b/emu/port/devtab.c
@@ -0,0 +1,94 @@
+#include "dat.h"
+#include "fns.h"
+#include "error.h"
+
+extern Dev* devtab[];
+
+void
+devtabreset(void)
+{
+ int i;
+
+ for(i = 0; devtab[i] != nil; i++)
+ devtab[i]->reset();
+}
+
+void
+devtabinit(void)
+{
+ int i;
+
+ for(i = 0; devtab[i] != nil; i++)
+ devtab[i]->init();
+}
+
+void
+devtabshutdown(void)
+{
+ int i;
+
+ /*
+ * Shutdown in reverse order.
+ */
+ for(i = 0; devtab[i] != nil; i++)
+ ;
+ for(i--; i >= 0; i--)
+ devtab[i]->shutdown();
+}
+
+
+Dev*
+devtabget(int dc, int user)
+{
+ int i;
+
+ for(i = 0; devtab[i] != nil; i++){
+ if(devtab[i]->dc == dc)
+ return devtab[i];
+ }
+
+ if(user == 0)
+ panic("devtabget %C\n", dc);
+
+ return nil;
+}
+
+Dev*
+devbyname(char *name)
+{
+ int i;
+
+ for(i = 0; devtab[i] != nil; i++)
+ if(strcmp(devtab[i]->name, name) == 0)
+ return devtab[i];
+ return nil;
+}
+
+long
+devtabread(Chan*, void* buf, long n, vlong off)
+{
+ int i;
+ Dev *dev;
+ char *alloc, *e, *p;
+
+ alloc = malloc(READSTR);
+ if(alloc == nil)
+ error(Enomem);
+
+ p = alloc;
+ e = p + READSTR;
+ for(i = 0; devtab[i] != nil; i++){
+ dev = devtab[i];
+ p = seprint(p, e, "#%C %s\n", dev->dc, dev->name);
+ }
+
+ if(waserror()){
+ free(alloc);
+ nexterror();
+ }
+ n = readstr(off, buf, n, alloc);
+ free(alloc);
+ poperror();
+
+ return n;
+}