static char *catchdata;
static size_t catchdatal,catchdatasiz;
-static void catched(const char *end)
+static void catched(const char *end,char edata)
{
size_t len;
-const char *p1,*p2;
+const char *p;
if (!record) return;
assert(end>=record);
- p1=memchr(record,'\n',end-record);
- p2=memchr(record,'\r',end-record);
- if (!p1 || (p1 && p2 && p2<p1)) p1=p2;
- if ((len=(p1?p1:end)-record)) {
+ p=memchr(record,edata,end-record);
+ if ((len=(p?p:end)-record)) {
if (!catchdata)
chk(catchdata=malloc((catchdatasiz=LINE_MAX)));
if (catchdatal+len>catchdatasiz)
memcpy(catchdata+catchdatal,record,len);
catchdatal+=len;
}
- record=(p1?NULL:end);
+ record=(p?NULL:end);
assert(catchdatal<=catchdatasiz);
}
ssize_t got;
char *hit,*s;
va_list ap;
-char errout,extend,convcr;
+char errout,extend,noconvcr,edata;
long alarmtime;
const char *osend;
static const char emptystring[]="";
if (!term) term="\nOK\n";
- convcr=!strchr(term,'\r');
if (!strcmp(send," ")) send=NULL; /* GCC formatstring-check workaround */
if (!(osend=send)) send="";
+ if ((noconvcr=(catch && *catch=='@'))) catch++;
if ((errout=(*send=='!'))) send++;
errout|=(maxretryn==-1);
if ((extend=(*send=='~'))) send++;
alarmtime=readtimen*(extend?EXT_READTIME:1);
- d8("devcmd(), alarmtime=%ld, errout=%d, extend=%d, convcr=%d, osend=%p, bufl=%d, buf: %s\n",
- alarmtime,errout,extend,convcr,osend,bufl,reform(buf,0));
+ d8("devcmd(), alarmtime=%ld, errout=%d, extend=%d, noconvcr=%d, osend=%p, bufl=%d, buf: %s\n",
+ alarmtime,errout,extend,noconvcr,osend,bufl,reform(buf,0));
if (0) {
err:
alarm(0);
record=NULL;
wasalarm=0;
alarm(alarmtime);
+ edata=(noconvcr?'\r':'\n');
if (!osend) {
got=bufl;
bufl=0;
while (buf+bufl2>s && (s=memchr(s,'\0',buf+bufl2-s))) *s++=REPL_NULLCHAR;
if (verbose>=3)
error("\nGot chunk of data from device: %s",reform(buf+bufl,0));
- if (convcr) {
+ if (!noconvcr) {
s=buf+bufl;
while (buf+bufl2>s && (s=memchr(s,'\r',buf+bufl2-s))) *s++='\n';
}
bufl=bufl2;
- catched(buf+bufl); assert(!record || record==buf+bufl);
+ catched(buf+bufl,edata); assert(!record || record==buf+bufl);
assert(bufl<sizeof(buf)-1);
buf[bufl]='\0';
assert(strlen(buf)==bufl);
error("Found ERROR response on command %s",reform(send,0));
goto err;
}
- if (catch && bufl>=catchl && (hit=strstr(buf,catch))) {
+ if (catch && !record && bufl>=catchl && (hit=strstr(buf,catch))) {
record=hit+catchl;
- catched(buf+bufl); assert(!record || record==buf+bufl);
+ catched(buf+bufl,edata); assert(!record || record==buf+bufl);
}
if ( bufl>= terml && (hit=strstr(buf,term))) {
memmove(buf,hit+terml,(bufl2=(buf+bufl)-(hit+terml))); bufl=bufl2;
}
if (bufl<fragl) continue;
memmove(buf,buf+bufl-(fragl-1),(bufl2=fragl-1)); bufl=bufl2;
- if (record) record=buf+bufl;
+ if (record) record=buf+fragl-1;
}
alarm(0);
if (!catchdatal) {
}
assert(!!catch);
record=emptystring;
- catched(record+1);
+ catched(record+1,edata);
if (verbose>=2) error(".Returning data %s for cmd %s",reform(catchdata,0),reform(send,1));
return(catchdata);
}
d1("Lock-device succeeded\n");
do {
d1("Reading a message for us...\n");
- if (!(s=devcmd("\r","+CMT:"," ")))
+ if (!(s=devcmd("\r","@+CMT:"," ")))
goto retryall;
if (!(i=receive_headerparse(s)))
error("Receive-header parsing failed on: %s",s);
- if (!(s=devcmd("\r","\n"," ")))
+ if (!(s=devcmd("\r","@\n"," ")))
goto retryall;
if (i) receive_accept(s);
if (!devcmd("\n",NULL," ")) /* eat last '\n' */