home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / languages / c / oslib / Examples / p2-622 < prev    next >
Text File  |  1994-03-24  |  2KB  |  90 lines

  1.    /*Note there are bugs in the assembler: the receive block is not abandoned
  2. if econet_do_transmit() fails, and R6, R7 are the wrong way round in the call
  3. to Econet_DoTransmit.*/
  4.  
  5. #include "econet.h"
  6. #include "os.h"
  7.  
  8. #define ENTRY_PORT 0x1Fu
  9. #define ERROR_NUMBER_BUFFER_OVERFLOW 1
  10.  
  11. extern byte Server_Station, Server_Net;
  12. extern int Server_Delay, Server_Tx_Delay, Server_Tx_Count;
  13.  
  14. static os_error Buffer_Overflow_Error =
  15.       {ERROR_NUMBER_BUFFER_OVERFLOW, "Command too long for buffer"};
  16.  
  17. os_error *example (char *text)
  18.  
  19. {  byte reply_port = 0, buffer [80];
  20.    os_error *error = NULL, error1;
  21.    econet_rx_cb rx_cb = 0;
  22.    int i,status;
  23.    char c;
  24.  
  25.    if ((error = xeconet_allocate_port (&reply_port)) != NULL)
  26.       goto finish;
  27.  
  28.    if ((error = xeconet_create_receive (reply_port, Server_Station,
  29.          Server_Net, buffer, sizeof buffer, &rx_cb, NULL)) != NULL)
  30.       goto finish;
  31.  
  32.    buffer [0] = reply_port;
  33.    for (i = 1, c = *text++;; i++)
  34.    {  if (!(i < sizeof buffer))
  35.       {  error = &Buffer_Overflow_Error;
  36.          goto finish;
  37.       }
  38.       if (c < ' ')
  39.       {  buffer [i] = '\r';
  40.          break;
  41.       }
  42.       else
  43.          buffer [i] = c;
  44.    }
  45.  
  46.    if ((error = xeconet_do_transmit (NONE, ENTRY_PORT, Server_Station,
  47.          Server_Net, buffer, sizeof buffer, Server_Tx_Count,
  48.          Server_Tx_Delay, &status, NULL)) != NULL)
  49.       goto finish;
  50.  
  51.    if (status != econet_STATUS_TRANSMITTED)
  52.    {  error = xeconet_convert_status_to_error (status, &error1,
  53.             sizeof error1, Server_Station, Server_Net);
  54.       goto finish;
  55.    }
  56.  
  57.    if ((error = xeconet_wait_for_reception (rx_cb, Server_Delay,
  58.          /*abort on excape?*/ FALSE, &status, NULL, NULL, NULL,
  59.          NULL, NULL, NULL)) != NULL)
  60.       goto finish;
  61.    rx_cb = 0;
  62.  
  63.    if (status != econet_STATUS_RECEIVED)
  64.    {  error = xeconet_convert_status_to_error (status, &error1,
  65.             sizeof error1, Server_Station, Server_Net);
  66.       goto finish;
  67.    }
  68.  
  69.    Server_Command_Port = *(int *) buffer;
  70.  
  71. finish:
  72.    if (error != NULL)
  73.    {  if (rx_cb != 0)
  74.       {  os_error *error1;
  75.  
  76.          error1 = xeconet_abandon_receive (rx_cb);
  77.          if (error == NULL) error = error1;
  78.       }
  79.  
  80.       if (reply_port != 0)
  81.       {  os_error *error1;
  82.  
  83.          error1 = xeconet_de_allocate_port (reply_port);
  84.          if (error == NULL) error = error1;
  85.       }
  86.    }
  87.  
  88.    return error;
  89. }
  90.