From a373a16aea8626bf68b9f15f2f058de67426e55e Mon Sep 17 00:00:00 2001 From: ian Date: Mon, 30 May 2005 13:01:57 +0000 Subject: [PATCH] stupid test program now shares nmra code with to-be fancy one --- hostside/commands.c | 22 ++++++++++------ hostside/hostside.h | 13 +++++----- hostside/main.c | 61 +++++++++++++++++++-------------------------- hostside/nmra.c | 39 +++++++++++++++++++++++++++++ hostside/obc.c | 6 +++++ 5 files changed, 93 insertions(+), 48 deletions(-) diff --git a/hostside/commands.c b/hostside/commands.c index 5610f90..57aaa99 100644 --- a/hostside/commands.c +++ b/hostside/commands.c @@ -2,19 +2,27 @@ #include "hostside.h" +#if 0 +static void cmd_nmra_c(ParseState *ps, const CmdInfo *ci) { + +} +#endif + static void cmd_noop(ParseState *ps, const CmdInfo *ci) { oprintf(&ps->cl->ch,"noop successful\n"); } const CmdInfo toplevel_cmds[]= { #if 0 - { "nmra-x", cmd_nmra_x }, - { "nmra-1", cmd_nmra_1 }, - { "xmit-x", cmd_xmit_x }, - { "xmit-1", cmd_xmit_1 }, - { "pic", cmd_pic }, - { "raw", cmd_raw }, + { "nmra-cx", cmd_nmra_c }, /* eg nmra-c1 speed28 3 13 1 */ + { "nmra-c1", cmd_nmra_c, 1 }, + { "nmra-hx", cmd_nmra_h }, + { "nmra-h1", cmd_nmra_h, 1 }, /* eg nmra-h1 0348 */ + { "nmra-rx", cmd_nmra_r }, + { "nmra-r1", cmd_nmra_r, 1 }, /* eg nmra-r1 03484b */ + { "pic", cmd_pic }, /* eg pic point 3 */ + { "pic-raw", cmd_pic_raw }, /* pic-raw 7f7f00644197, pic-raw a003 */ #endif - { "noop", cmd_noop }, + { "noop", cmd_noop }, { 0 } }; diff --git a/hostside/hostside.h b/hostside/hostside.h index d34fb34..5075d7d 100644 --- a/hostside/hostside.h +++ b/hostside/hostside.h @@ -15,12 +15,6 @@ typedef struct Client Client; typedef struct ParseState ParseState; typedef struct CmdInfo CmdInfo; -struct OutBuffer { - OutBuffer *back, *next; - char *m; - int l; -}; - typedef void OutBufferError(OutBufferChain*, const char *e1, const char *e2); struct OutBufferChain { @@ -48,6 +42,7 @@ struct ParseState { struct CmdInfo { const char *name; void (*fn)(ParseState *ps, const CmdInfo *ci); + int xarg; }; extern oop_source *events; @@ -88,6 +83,12 @@ typedef struct Nmra { int l; } Nmra; +typedef struct NmraParseEncodeCaller NmraParseEncodeCaller; +void nmra_parse_encode(Nmra *out, const char *arg, int argl, + int argc, NmraParseEncodeCaller *pec); +unsigned long nmra_argnumber(NmraParseEncodeCaller *pec, int argi); +void nmra_problem(const char *problem); + void xmit_nmra_raw(const Byte *with_csum, int length); void xmit_nmra_bytes(const Byte *without_csum, int length); void xmit_nmra(const Nmra*); diff --git a/hostside/main.c b/hostside/main.c index 8fb1ce0..138f563 100644 --- a/hostside/main.c +++ b/hostside/main.c @@ -13,9 +13,9 @@ #include #include #include +#include #include "hostside.h" -#include "nmra.h" FILE *dump_stream= 0; @@ -31,25 +31,6 @@ static void badusage(const char *why) { fprintf(stderr,"bad usage: %s\n",why); exit(8); } -static long argnumber(const char *const *argv, int argc, int argi, - unsigned long *au, - long min, long max) { - long l; - unsigned long abit; - const char *arg; - char *ep; - - if (argi >= argc) badusage("missing numeric arg value"); - abit= 1ul << argi; - assert(!(*au & abit)); - *au |= abit; - arg= argv[argi]; - - l= strtoul(arg,&ep,0); if (*ep) badusage("bad numeric arg value"); - if (lmax) badusage("numeric arg value out of range"); - return l; -} - static void pahex(const char **argv) { const char *data_string; char hbuf[3], *ep; @@ -76,6 +57,27 @@ static void pahex(const char **argv) { buf.nmra.l= c - buf.nmra.d; } +struct NmraParseEncodeCaller { + int argc; + const char *const *argv; +}; + +unsigned long nmra_argnumber(NmraParseEncodeCaller *pec, int argi) { + const char *arg; + char *ep; + unsigned long l; + + if (argi >= pec->argc) badusage("missing numeric arg value"); + arg= pec->argv[argi]; + errno=0; l= strtoul(arg,&ep,0); + if (errno || *ep || ep==arg) badusage("bad numeric arg value"); + return l; +} + +void nmra_problem(const char *problem) { + badusage(problem); +} + int main(int argc, const char **argv) { void (*xmitter)(const Byte *d, int l); const char *arg; @@ -113,21 +115,10 @@ int main(int argc, const char **argv) { BARE(nmra_bytes) #undef BARE { - unsigned long au=0; - for (argc=0; argv[argc]; argc++); - #define Aint(x,i) , argnumber(argv,argc,i,&au, INT_MIN,INT_MAX) - #define Abitmap(x,i) , argnumber(argv,argc,i,&au, 0,~0u>>1) - #define Abyte(x,i) , argnumber(argv,argc,i,&au, 0,0xff) - #define Anone - #define NMRA(n,al,body) \ - if (!strcmp(arg,#n)) { \ - enco_nmra_##n(&buf.nmra al); \ - } else -#include "nmra-packets.h" - { - badusage("unknown instruction"); - } - if (au != (1ul << argc)-1) badusage("too many args for packet type"); + NmraParseEncodeCaller pec; + pec.argv= argv; + for (pec.argc=0; argv[pec.argc]; pec.argc++); + nmra_parse_encode(&buf.nmra, arg, strlen(arg), pec.argc, &pec); xmitter= xmit_nmra_bytes; } diff --git a/hostside/nmra.c b/hostside/nmra.c index 606d715..e5bda79 100644 --- a/hostside/nmra.c +++ b/hostside/nmra.c @@ -1,8 +1,10 @@ /**/ #include +#include #include "hostside.h" +#include "nmra.h" void xmit_nmra_raw(const Byte *nmra_packet, int length) { Byte encoded[COMMAND_ENCODED_MAX], *encp; @@ -67,3 +69,40 @@ void xmit_nmra_bytes(const Byte *without_csum, int length) { *out= running; xmit_nmra_raw(with_csum, length+1); } + +static long argnumber(NmraParseEncodeCaller *pec, int argi, + unsigned long *au, + long min, long max) { + long l; + unsigned long abit; + + l= nmra_argnumber(pec, argi); + + abit= 1ul << argi; + assert(!(*au & abit)); + *au |= abit; + + if (lLONG_MAX || l>max) + nmra_problem("numeric arg value out of range"); + return l; +} + +void nmra_parse_encode(Nmra *out, const char *arg, int argl, + int argc, NmraParseEncodeCaller *pec) { + unsigned long au= 0; + + #define Aint(x,i) , argnumber(pec,i,&au, INT_MIN,INT_MAX) + #define Abitmap(x,i) , argnumber(pec,i,&au, 0,~0u>>1) + #define Abyte(x,i) , argnumber(pec,i,&au, 0,0xff) + #define Anone + #define NMRA(n,al,body) \ + if (argl == sizeof(#n)-1 && !memcmp(arg,#n,argl)) { \ + enco_nmra_##n(out al); \ + } else +#include "nmra-packets.h" + { + nmra_problem("unknown instruction"); + } + if (au != (1ul << argc)-1) + nmra_problem("too many args for packet type"); +} diff --git a/hostside/obc.c b/hostside/obc.c index 7fb3c1a..bc272de 100644 --- a/hostside/obc.c +++ b/hostside/obc.c @@ -9,6 +9,12 @@ #include "hostside.h" #include "../layout/dlist.h" +struct OutBuffer { + OutBuffer *back, *next; + char *m; + int l; +}; + static void *writeable(oop_source *evts, int fd, oop_event evt, void *ch_v) { OutBufferChain *ch= ch_v; -- 2.30.2