[BACK]Return to buffer.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/Attic/buffer.c between version 1.1 and 1.2

version 1.1, 1999/09/26 20:53:34 version 1.2, 1999/11/23 22:25:53
Line 22 
Line 22 
   
 /* Initializes the buffer structure. */  /* Initializes the buffer structure. */
   
 void buffer_init(Buffer *buffer)  void
   buffer_init(Buffer *buffer)
 {  {
   buffer->alloc = 4096;          buffer->alloc = 4096;
   buffer->buf = xmalloc(buffer->alloc);          buffer->buf = xmalloc(buffer->alloc);
   buffer->offset = 0;          buffer->offset = 0;
   buffer->end = 0;          buffer->end = 0;
 }  }
   
 /* Frees any memory used for the buffer. */  /* Frees any memory used for the buffer. */
   
 void buffer_free(Buffer *buffer)  void
   buffer_free(Buffer *buffer)
 {  {
   memset(buffer->buf, 0, buffer->alloc);          memset(buffer->buf, 0, buffer->alloc);
   xfree(buffer->buf);          xfree(buffer->buf);
 }  }
   
 /* Clears any data from the buffer, making it empty.  This does not actually  /* Clears any data from the buffer, making it empty.  This does not actually
    zero the memory. */     zero the memory. */
   
 void buffer_clear(Buffer *buffer)  void
   buffer_clear(Buffer *buffer)
 {  {
   buffer->offset = 0;          buffer->offset = 0;
   buffer->end = 0;          buffer->end = 0;
 }  }
   
 /* Appends data to the buffer, expanding it if necessary. */  /* Appends data to the buffer, expanding it if necessary. */
   
 void buffer_append(Buffer *buffer, const char *data, unsigned int len)  void
   buffer_append(Buffer *buffer, const char *data, unsigned int len)
 {  {
   char *cp;          char *cp;
   buffer_append_space(buffer, &cp, len);          buffer_append_space(buffer, &cp, len);
   memcpy(cp, data, len);          memcpy(cp, data, len);
 }  }
   
 /* Appends space to the buffer, expanding the buffer if necessary.  /* Appends space to the buffer, expanding the buffer if necessary.
    This does not actually copy the data into the buffer, but instead     This does not actually copy the data into the buffer, but instead
    returns a pointer to the allocated region. */     returns a pointer to the allocated region. */
   
 void buffer_append_space(Buffer *buffer, char **datap, unsigned int len)  void
   buffer_append_space(Buffer *buffer, char **datap, unsigned int len)
 {  {
   /* If the buffer is empty, start using it from the beginning. */          /* If the buffer is empty, start using it from the beginning. */
   if (buffer->offset == buffer->end)          if (buffer->offset == buffer->end) {
     {                  buffer->offset = 0;
       buffer->offset = 0;                  buffer->end = 0;
       buffer->end = 0;          }
     }  restart:
           /* If there is enough space to store all data, store it now. */
  restart:          if (buffer->end + len < buffer->alloc) {
   /* If there is enough space to store all data, store it now. */                  *datap = buffer->buf + buffer->end;
   if (buffer->end + len < buffer->alloc)                  buffer->end += len;
     {                  return;
       *datap = buffer->buf + buffer->end;          }
       buffer->end += len;          /* If the buffer is quite empty, but all data is at the end, move
       return;             the data to the beginning and retry. */
     }          if (buffer->offset > buffer->alloc / 2) {
                   memmove(buffer->buf, buffer->buf + buffer->offset,
   /* If the buffer is quite empty, but all data is at the end, move the                          buffer->end - buffer->offset);
      data to the beginning and retry. */                  buffer->end -= buffer->offset;
   if (buffer->offset > buffer->alloc / 2)                  buffer->offset = 0;
     {                  goto restart;
       memmove(buffer->buf, buffer->buf + buffer->offset,          }
               buffer->end - buffer->offset);          /* Increase the size of the buffer and retry. */
       buffer->end -= buffer->offset;          buffer->alloc += len + 32768;
       buffer->offset = 0;          buffer->buf = xrealloc(buffer->buf, buffer->alloc);
       goto restart;          goto restart;
     }  
   
   /* Increase the size of the buffer and retry. */  
   buffer->alloc += len + 32768;  
   buffer->buf = xrealloc(buffer->buf, buffer->alloc);  
   goto restart;  
 }  }
   
 /* Returns the number of bytes of data in the buffer. */  /* Returns the number of bytes of data in the buffer. */
   
 unsigned int buffer_len(Buffer *buffer)  unsigned int
   buffer_len(Buffer *buffer)
 {  {
   return buffer->end - buffer->offset;          return buffer->end - buffer->offset;
 }  }
   
 /* Gets data from the beginning of the buffer. */  /* Gets data from the beginning of the buffer. */
   
 void buffer_get(Buffer *buffer, char *buf, unsigned int len)  void
   buffer_get(Buffer *buffer, char *buf, unsigned int len)
 {  {
   if (len > buffer->end - buffer->offset)          if (len > buffer->end - buffer->offset)
     fatal("buffer_get trying to get more bytes than in buffer");                  fatal("buffer_get trying to get more bytes than in buffer");
   memcpy(buf, buffer->buf + buffer->offset, len);          memcpy(buf, buffer->buf + buffer->offset, len);
   buffer->offset += len;          buffer->offset += len;
 }  }
   
 /* Consumes the given number of bytes from the beginning of the buffer. */  /* Consumes the given number of bytes from the beginning of the buffer. */
   
 void buffer_consume(Buffer *buffer, unsigned int bytes)  void
   buffer_consume(Buffer *buffer, unsigned int bytes)
 {  {
   if (bytes > buffer->end - buffer->offset)          if (bytes > buffer->end - buffer->offset)
     fatal("buffer_get trying to get more bytes than in buffer");                  fatal("buffer_get trying to get more bytes than in buffer");
   buffer->offset += bytes;          buffer->offset += bytes;
 }  }
   
 /* Consumes the given number of bytes from the end of the buffer. */  /* Consumes the given number of bytes from the end of the buffer. */
   
 void buffer_consume_end(Buffer *buffer, unsigned int bytes)  void
   buffer_consume_end(Buffer *buffer, unsigned int bytes)
 {  {
   if (bytes > buffer->end - buffer->offset)          if (bytes > buffer->end - buffer->offset)
     fatal("buffer_get trying to get more bytes than in buffer");                  fatal("buffer_get trying to get more bytes than in buffer");
   buffer->end -= bytes;          buffer->end -= bytes;
 }  }
   
 /* Returns a pointer to the first used byte in the buffer. */  /* Returns a pointer to the first used byte in the buffer. */
   
 char *buffer_ptr(Buffer *buffer)  char *
   buffer_ptr(Buffer *buffer)
 {  {
   return buffer->buf + buffer->offset;          return buffer->buf + buffer->offset;
 }  }
   
 /* Dumps the contents of the buffer to stderr. */  /* Dumps the contents of the buffer to stderr. */
   
 void buffer_dump(Buffer *buffer)  void
   buffer_dump(Buffer *buffer)
 {  {
   int i;          int i;
   unsigned char *ucp = (unsigned char *)buffer->buf;          unsigned char *ucp = (unsigned char *) buffer->buf;
   
   for (i = buffer->offset; i < buffer->end; i++)          for (i = buffer->offset; i < buffer->end; i++)
     fprintf(stderr, " %02x", ucp[i]);                  fprintf(stderr, " %02x", ucp[i]);
   fprintf(stderr, "\n");          fprintf(stderr, "\n");
 }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2