home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / tcpipsrc / h / if / Misc / c / chat < prev    next >
Encoding:
Text File  |  1994-06-24  |  3.0 KB  |  169 lines

  1. #include "stdlib.h"
  2. #include "string.h"
  3. #include "global.h"
  4. #include "misc.h"
  5. /* #include "chat.h" */
  6. #include "event.h"
  7. #include "alarm.h"
  8. #include "arc.h"
  9. #include "iface.h"
  10.  
  11. #define TIMEOUT 4000
  12.  
  13. static char buff[80];
  14. static int trace = 0;
  15.  
  16. extern struct interface *ifaces;
  17.  
  18. static char *charg( char *arg )
  19. {
  20.   int len;
  21.   int i;
  22.   char new;
  23.  
  24.   len = strlen( arg );
  25.   if( arg[0] == '"' ) {
  26.     arg++, len--;
  27.     if( arg[len-1] == '"' ) { len--; arg[len] = 0; }
  28.     }
  29.  
  30.   for( i=0; i<len; i++ ) if( arg[i] == '\\' ) {
  31.  
  32.    switch( arg[i+1] ) {
  33.       case 'p':
  34.         new = 1;
  35.         break;
  36.  
  37.       case 'd':
  38.         new = 2;
  39.         break;
  40.  
  41.       default:
  42.         new = arg[i+1];
  43.         break;
  44.       }
  45.     memmove( &arg[i], &arg[i+1], len-i );
  46.     arg[i] = new;
  47.     len -= 1;
  48.     }
  49.   return arg;
  50. }
  51.  
  52.  
  53. static int expect( int dev, char *expstr )
  54. {
  55.   int time;
  56.   int blen=0;
  57.   int elen;
  58.   int i;
  59.  
  60.   elen = strlen( expstr );
  61.   if( ! elen ) { cwprintf(NULL, "got: \"\"\n" ); return 0; }
  62.   time = alarm_timenow();
  63.   while( alarm_timedifference( time, alarm_timenow() ) < TIMEOUT )
  64.   {
  65.     blen += (asy_recv(dev, &buff[blen]) ? 1 : 0);
  66.     buff[blen] = 0;
  67.     if( blen>=elen )
  68.     {
  69.       for( i=0; i<=blen-elen; i++ ) if( ! memcmp( &buff[i], expstr, elen ) )
  70.       {
  71.         if( blen>elen )
  72.         {
  73.           memmove( buff, &buff[blen-elen], elen+1 );
  74.           blen = elen;
  75.           }
  76.         if( trace )
  77.           cwprintf(NULL, "got: \"%s\"\n", buff );
  78.         return 0;
  79.         }
  80.       if( blen>elen ) {
  81.         memmove( buff, &buff[blen-elen], elen+1 );
  82.         blen = elen;
  83.         }
  84.       }
  85.     /*    event_process();*/
  86.     }
  87.   return 1;
  88. }
  89.  
  90.  
  91.  
  92. static void send( int dev, char *sendstr )
  93. {
  94.   int i;
  95.   int time;
  96.   int slen;
  97.   int td=0;
  98.   char eoln = '\r';
  99.  
  100.   slen = strlen( sendstr );
  101.   for( i=0; i<slen; i++ ) switch( sendstr[i] ) {
  102.  
  103.     case 1:
  104.       td = 40;
  105.  
  106.     case 2:
  107.       if( ! td ) td = 200;
  108.       time = alarm_timenow();
  109.       while( alarm_timedifference( time, alarm_timenow() ) < td ) event_process();
  110.       td = 0;
  111.       break;
  112.  
  113.    default:
  114.      asy_output( dev, &sendstr[i], 1 );
  115.    }
  116.   asy_output( dev, &eoln, 1 );
  117.   if( trace ) cwprintf(NULL, "sent: \"%s\"\n", sendstr );
  118. }
  119.  
  120.  
  121.  
  122.  
  123. int expect_send( int dev, int argc, char **argv )
  124. {
  125.   int i;
  126.   char *error;
  127.  
  128.   if( argc<3 ) return 1;
  129.   for( i=1; i<argc; i++ ) argv[i] = charg( argv[i] );
  130.   error = argv[1];
  131.  
  132.   for( i=2; i<argc;  ) {
  133.     if( expect( dev, argv[i] ) ) {
  134.       cwprintf(NULL, "chat script error: expected \"%s\", got \"%s\"\n", argv[i], buff );
  135.       send( dev, error );
  136.       return 1;
  137.       }
  138.     i++;
  139.     if( i<argc ) send( dev, argv[i] );
  140.     i++;
  141.     }
  142.   return 0;
  143. }
  144.  
  145.  
  146.  
  147. int chat_trace( int argc, char **argv )
  148. {
  149.   if( argc<2 ) cwprintf(NULL, "%d\n", trace );
  150.   trace = atoi(argv[1]);
  151.   return 0;
  152. }
  153.  
  154.  
  155. int dochat( int argc, char **argv )
  156. {
  157.   struct interface *ifp;
  158.  
  159.   if( argc<4 )
  160.     return 1;
  161.   for( ifp = ifaces; ifp; ifp=ifp->next )
  162.   {
  163.     if( ! strcmp( ifp->name, argv[1] ) )
  164.       return expect_send( ifp->dev, argc-1, &argv[1] );
  165.   }
  166.   cwprintf(NULL, "chat: unknown interface\n" );
  167.   return 1;
  168. }
  169.