#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 }
};
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 {
struct CmdInfo {
const char *name;
void (*fn)(ParseState *ps, const CmdInfo *ci);
+ int xarg;
};
extern oop_source *events;
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*);
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>
+#include <errno.h>
#include "hostside.h"
-#include "nmra.h"
FILE *dump_stream= 0;
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;
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;
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;
}
/**/
#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;
*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");
+}
#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;