chiark / gitweb /
now with a movfeat command
authorian <ian>
Sun, 6 Apr 2008 12:19:27 +0000 (12:19 +0000)
committerian <ian>
Sun, 6 Apr 2008 12:19:27 +0000 (12:19 +0000)
hostside/commands.c
hostside/common.h
hostside/parseutils.c
hostside/realtime.c
hostside/realtime.h

index 9dd543409b2d11bc6e4df818ccbfcea1768ae21e..55fcc3b770aff042803b8d750a0c15185aec466a 100644 (file)
@@ -187,9 +187,35 @@ static void cmd_pic(ParseState *ps, const CmdInfo *ci) {
   ouack(ci);
 }
 
+static void cmd_movfeat(ParseState *ps, const CmdInfo *ci) {
+  Segment *back, *move, *fwd;
+  long ms;
+  ErrorCode ec;
+  
+  if (!ps_needsegment(ps,&back,0) ||
+      !ps_needsegment(ps,&move,0) ||
+      !ps_needsegment(ps,&fwd,0)) return;
+  
+  ms= INT_MAX;
+  if (ps->remain)
+    if (!ps_neednumber(ps,&ms,0,INT_MAX,"milliseconds")) return;
+
+  if (!ps_neednoargs(ps)) return;
+
+  ec= movpos_change(back,move,fwd,ms,0);
+  if (ec)
+    badcmd(ps,"movfeat %s %s %s %ld %s",
+          back->i->pname, move->i->pname, fwd->i->pname,
+          ms==INT_MAX ? -1L : ms,
+          errorcodelist[ec]);
+
+  ouack(ci);  
+}
+
 const CmdInfo toplevel_cmds[]= {
   { "pic",        cmd_pic         },
   { "nmra",       cmd_nmra,       },
   { "noop",       cmd_noop        },
+  { "movfeat",    cmd_movfeat     },
   { 0 }
 };
index ef4d3e7089b9f7afefe50481a277c521b1284158..72b18da6259186434a56a729436bf75a44b43526 100644 (file)
@@ -64,13 +64,20 @@ int ps_neednoargs(ParseState *ps);
   ((const typeof(infos[0])*)                   \
    any_lookup((ps),(infos),sizeof((infos)[0])))
 
+#define some_needword_lookup_counted(ps, infos, ninfos, what)  \
+  ((const typeof(infos[0])*)                                   \
+   any_needword_lookup((ps),                                   \
+                      (infos), (ninfos), sizeof((infos)[0]),   \
+                      (what)))
+
 #define some_needword_lookup(ps, infos, what)                  \
   ((const typeof(infos[0])*)                                   \
-   any_needword_lookup((ps),(infos),sizeof((infos)[0]),(what)))
+   any_needword_lookup((ps),(infos),INT_MAX,sizeof((infos)[0]),(what)))
 
-const void *any_lookup(ParseState *ps, const void *infos, size_t infosz);
+const void *any_lookup(ParseState *ps,
+                      const void *infos, int ninfsmax, size_t infosz);
 const void *any_needword_lookup(ParseState *ps, const void *infos,
-                               size_t sz, const char *what);
+                               int ninfsmax, size_t sz, const char *what);
 
 /*---------- from client.c ----------*/
 
index 7cb962a42aff5844fe92cf4fff406a4d6ce61fa9..d1509f3ff528bfb880ac9a601c641eaac9e33dec 100644 (file)
@@ -93,23 +93,24 @@ int ps_needhextoend(ParseState *ps, Byte *d, int *len_io) {
   return 1;
 }
 
-
-const void *any_lookup(ParseState *ps, const void *inf, size_t sz) {
+const void *any_lookup(ParseState *ps, const void *inf, int ninfsmax,
+                      size_t sz) {
   const char *tname;
+  int i;
   
-  for (;
-       (tname= *(const char *const*)inf);
+  for (i=0;
+       i<ninfsmax && (tname= *(const char *const*)inf);
        inf= (const char*)inf + sz)
     if (!thiswordstrcmp(ps,tname))
       return inf;
   return 0;
 }
 
-const void *any_needword_lookup(ParseState *ps, const void *infs,
+const void *any_needword_lookup(ParseState *ps, const void *infs, int ninfsmax,
                                size_t sz, const char *what) {
   const void *r;
   if (!ps_needword(ps)) return 0;
-  r= any_lookup(ps,infs,sz);
+  r= any_lookup(ps,infs,ninfsmax,sz);
   if (!r) { badcmd(ps,"unknown %s",what); return 0; }
   return r;
 }
index 1f36162ba8dcf7be1464fe4e1a8f4ceacedd87f4..99544ce34a66b37aceeeb89a2895292984703934 100644 (file)
@@ -254,6 +254,18 @@ void die_hook(void) {
   if (e) fprintf(stderr,"(unwritten command output: %s)\n",strerror(e));
 }
 
+int ps_needsegment(ParseState *ps, Segment **seg_r,
+                  const SegmentInfo **segi_r) {
+  const SegmentInfo *segi;
+  if (!ps_needword(ps)) return 0;
+  segi= some_needword_lookup_counted(ps,info_segments,info_nsegments,
+                                    ps->thisword);
+  if (!segi) return 0;
+  if (segi_r) *segi_r= segi;
+  if (seg_r) *seg_r= segments + (segi - info_segments);
+  return 1;
+}
+
 /*---------- serial input (via oop) ----------*/
 
 static PicInsn serial_buf;
index f74ae99651e3e0f598f2768bd342ada6daddfb84..ca5e10128677900bc7820d52c1e61b5fd188ab13 100644 (file)
@@ -111,6 +111,8 @@ void oupicio(const char *dirn, const PicInsnInfo *pii, int objnum);
 void ouhex(const char *word, const Byte *command, int length);
 
 void serial_transmit(const PicInsn *pi);
+int ps_needsegment(ParseState *ps, Segment **seg_r,
+                  const SegmentInfo **segi_r);
 
 /*---------- from actual.c ----------*/