From 5b4b5e4b2044ca0b940c0566b32a775c255e523d Mon Sep 17 00:00:00 2001 From: ian Date: Sun, 26 Sep 2004 13:50:42 +0000 Subject: [PATCH] better arg parsing; more sophisticated siggen --- parport/lib.c | 13 +++++++++++++ parport/lib.h | 1 + parport/siggen.c | 48 +++++++++++++++++++++++++++++++++++++----------- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/parport/lib.c b/parport/lib.c index 45b42d1..f36eef4 100644 --- a/parport/lib.c +++ b/parport/lib.c @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -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; +} diff --git a/parport/lib.h b/parport/lib.h index c9df1d3..8372ec8 100644 --- a/parport/lib.h +++ b/parport/lib.h @@ -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*/ diff --git a/parport/siggen.c b/parport/siggen.c index a92ea28..c5bc73a 100644 --- a/parport/siggen.c +++ b/parport/siggen.c @@ -3,24 +3,50 @@ #include #include #include +#include #include #include #include "lib.h" +static void badusage(void) { + fprintf(stderr, + "usage: siggen [m] item...\n" + "items:\n" + " k PPWCONTROL value\n" + " t PPWDATA value\n" + " w usleep(value)\n" + "options:\n" + " m 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); + } } } -- 2.30.2