home *** CD-ROM | disk | FTP | other *** search
- #include "stdlib.h"
- #include "string.h"
- #include "global.h"
- #include "misc.h"
- /* #include "chat.h" */
- #include "event.h"
- #include "alarm.h"
- #include "arc.h"
- #include "iface.h"
-
- #define TIMEOUT 4000
-
- static char buff[80];
- static int trace = 0;
-
- extern struct interface *ifaces;
-
- static char *charg( char *arg )
- {
- int len;
- int i;
- char new;
-
- len = strlen( arg );
- if( arg[0] == '"' ) {
- arg++, len--;
- if( arg[len-1] == '"' ) { len--; arg[len] = 0; }
- }
-
- for( i=0; i<len; i++ ) if( arg[i] == '\\' ) {
-
- switch( arg[i+1] ) {
- case 'p':
- new = 1;
- break;
-
- case 'd':
- new = 2;
- break;
-
- default:
- new = arg[i+1];
- break;
- }
- memmove( &arg[i], &arg[i+1], len-i );
- arg[i] = new;
- len -= 1;
- }
- return arg;
- }
-
-
- static int expect( int dev, char *expstr )
- {
- int time;
- int blen=0;
- int elen;
- int i;
-
- elen = strlen( expstr );
- if( ! elen ) { cwprintf(NULL, "got: \"\"\n" ); return 0; }
- time = alarm_timenow();
- while( alarm_timedifference( time, alarm_timenow() ) < TIMEOUT )
- {
- blen += (asy_recv(dev, &buff[blen]) ? 1 : 0);
- buff[blen] = 0;
- if( blen>=elen )
- {
- for( i=0; i<=blen-elen; i++ ) if( ! memcmp( &buff[i], expstr, elen ) )
- {
- if( blen>elen )
- {
- memmove( buff, &buff[blen-elen], elen+1 );
- blen = elen;
- }
- if( trace )
- cwprintf(NULL, "got: \"%s\"\n", buff );
- return 0;
- }
- if( blen>elen ) {
- memmove( buff, &buff[blen-elen], elen+1 );
- blen = elen;
- }
- }
- /* event_process();*/
- }
- return 1;
- }
-
-
-
- static void send( int dev, char *sendstr )
- {
- int i;
- int time;
- int slen;
- int td=0;
- char eoln = '\r';
-
- slen = strlen( sendstr );
- for( i=0; i<slen; i++ ) switch( sendstr[i] ) {
-
- case 1:
- td = 40;
-
- case 2:
- if( ! td ) td = 200;
- time = alarm_timenow();
- while( alarm_timedifference( time, alarm_timenow() ) < td ) event_process();
- td = 0;
- break;
-
- default:
- asy_output( dev, &sendstr[i], 1 );
- }
- asy_output( dev, &eoln, 1 );
- if( trace ) cwprintf(NULL, "sent: \"%s\"\n", sendstr );
- }
-
-
-
-
- int expect_send( int dev, int argc, char **argv )
- {
- int i;
- char *error;
-
- if( argc<3 ) return 1;
- for( i=1; i<argc; i++ ) argv[i] = charg( argv[i] );
- error = argv[1];
-
- for( i=2; i<argc; ) {
- if( expect( dev, argv[i] ) ) {
- cwprintf(NULL, "chat script error: expected \"%s\", got \"%s\"\n", argv[i], buff );
- send( dev, error );
- return 1;
- }
- i++;
- if( i<argc ) send( dev, argv[i] );
- i++;
- }
- return 0;
- }
-
-
-
- int chat_trace( int argc, char **argv )
- {
- if( argc<2 ) cwprintf(NULL, "%d\n", trace );
- trace = atoi(argv[1]);
- return 0;
- }
-
-
- int dochat( int argc, char **argv )
- {
- struct interface *ifp;
-
- if( argc<4 )
- return 1;
- for( ifp = ifaces; ifp; ifp=ifp->next )
- {
- if( ! strcmp( ifp->name, argv[1] ) )
- return expect_send( ifp->dev, argc-1, &argv[1] );
- }
- cwprintf(NULL, "chat: unknown interface\n" );
- return 1;
- }
-