chiark / gitweb /
better arg parsing; more sophisticated siggen
authorian <ian>
Sun, 26 Sep 2004 13:50:42 +0000 (13:50 +0000)
committerian <ian>
Sun, 26 Sep 2004 13:50:42 +0000 (13:50 +0000)
parport/lib.c
parport/lib.h
parport/siggen.c

index 45b42d1e703c082fcc6a4f45868b34661dbbbf3c..f36eef489ea590e40734faa0562cc15a4f77d769 100644 (file)
@@ -3,6 +3,7 @@
 #include <errno.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include <sys/ioctl.h>
 
@@ -20,3 +21,15 @@ void doioctl(int ioctlnum, void *vp, unsigned long vpv) {
     exit(127);
   }
 }
+
+unsigned long number(const char *a) {
+  unsigned long v;
+  char *ep;
+
+  v= strtoul(a,&ep,0);
+  if (*ep || ep==a) {
+    fprintf(stderr,"bad number `%s'\n",a);
+    exit(127);
+  }
+  return v;
+}
index c9df1d39c4fe2c145c0d7cfb6a29febc33790d4e..8372ec899a26ff0137680c43ef78ad15d8989ee3 100644 (file)
@@ -4,6 +4,7 @@
 #define LIB_H
 
 void doioctl(int ioctlnum, void *vp, unsigned long vpv);
+unsigned long number(const char *a);
 extern int fd;
 
 #endif /*LIB_H*/
index a92ea280f95facb88b8c6e8813360af03b1a1f5a..c5bc73aaafcdb20517fefad8b07b6587a54dec35 100644 (file)
@@ -3,24 +3,50 @@
 #include <assert.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <stdio.h>
 
 #include <sys/ioctl.h>
 #include <linux/ppdev.h>
 
 #include "lib.h"
 
+static void badusage(void) {
+  fprintf(stderr,
+         "usage: siggen [m<mult>] item...\n"
+         "items:\n"
+         "  k<value>   PPWCONTROL value\n"
+         "  t<value>   PPWDATA    value\n"
+         "  w<value>   usleep(value)\n"
+         "options:\n"
+         "  m<value>   do every item m times\n");
+}        
+
 int main(int argc, const char *const *argv) {
-  unsigned char v[2];
-  int wh=0, p;
-  
-  assert(argc==3 || argc==4);
+  int ii, io=0, m=1;
+  unsigned char v;
+  const char *a;
 
-  v[0]= strtoul(argv[1],0,0);
-  v[1]= strtoul(argv[2],0,0);
-  p= argv[3] ? atoi(argv[3]) : -1;
-  for (;;) {
-    doioctl(PPWCONTROL, &v[wh], v[wh]);
-    wh= !wh;
-    if (p>=0) usleep(p);
+  argc--;
+  argv++;
+  if (argc>=1 && (a=argv[0]) && a[0]=='m') {
+    m= number(a+1);
+    argc--;
+    argv++;
+  }
+  if (argc<1) badusage();
+  for (ii=0; ; ii++, ii%=(argc*m)) {
+    a= argv[ii/m];
+    switch (a[0]) {
+    case 'k': io= PPWCONTROL; break;
+    case 't': io= PPWDATA;    break;
+    case 'w': io= -1;         break;
+    default: badusage();
+    }
+    v= number(a+1);
+    if (io==-1) {
+      usleep(v);
+    } else {
+      doioctl(io, &v, v);
+    }
   }
 }