chiark / gitweb /
stupid test program now shares nmra code with to-be fancy one
authorian <ian>
Mon, 30 May 2005 13:01:57 +0000 (13:01 +0000)
committerian <ian>
Mon, 30 May 2005 13:01:57 +0000 (13:01 +0000)
hostside/commands.c
hostside/hostside.h
hostside/main.c
hostside/nmra.c
hostside/obc.c

index 5610f90829d293ad8f5df98c77ada747a3e776bc..57aaa99f57a172336e025141d1f315eef813b914 100644 (file)
@@ -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 }
 };
index d34fb3436d1dcbcf4aa8b4b25994d346b5bdd919..5075d7d4b366a0b666387a3dc0aedaef4b2e647d 100644 (file)
@@ -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*);
index 8fb1ce05646a74f7275a42f20fc192abbcdf75bb..138f563ac9d08bef780663181f8610e89df655b6 100644 (file)
@@ -13,9 +13,9 @@
 #include <stdlib.h>
 #include <limits.h>
 #include <unistd.h>
+#include <errno.h>
 
 #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 (l<min || l>max) 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;
   }
 
index 606d7159a3b7c83a098b6bd8e06963331e4aee18..e5bda79360b46aa1f7cb5b550b81d7dff90e0eb2 100644 (file)
@@ -1,8 +1,10 @@
 /**/
 
 #include <assert.h>
+#include <limits.h>
 
 #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 (l<min || l>LONG_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");
+}
index 7fb3c1aa632221f786d5f5a67920234000ae1466..bc272de697ba1000aba52dcaa20e20031ba7fe0f 100644 (file)
@@ -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;