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 }
};
((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 ----------*/
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;
}
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;
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 ----------*/