home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 October / VPR9910A.BIN / OLS / bz2l003 / bz2l003.lzh / BZ2LIB / STRINGQ.C < prev    next >
C/C++ Source or Header  |  1998-06-02  |  2KB  |  120 lines

  1. /*
  2.     stringq
  3.     
  4.      process char buffer as queue like pipe
  5.  
  6.     by Yoshioka Tsuneo(QWF00133@niftyserve.or.jp)
  7.     This File is Copy,Edit,Re-Distribute,etc.. FREE!
  8.     Welcome any e-mail!!
  9. */
  10. #include "stringq.h"
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <string.h>
  14.  
  15. STRINGQ *STRINGQ_open(int size)
  16. {
  17.     STRINGQ *b;
  18.  
  19.     b = malloc(sizeof(STRINGQ));
  20.     if(!b)return NULL;
  21.  
  22.     memset(b,0,sizeof(STRINGQ));
  23.     b->buf = malloc(size);
  24.     if(! b->buf){free(b);return NULL;}
  25.     memset(b->buf ,0,size);
  26.     b->bufsize = size;
  27.     return b;
  28. }
  29. int STRINGQ_getc(STRINGQ *b)
  30. {
  31.     int c;
  32.  
  33.     if(b->len==0){
  34.         if(b->exist_eof){return EOF;}else{return -2;}
  35.     }
  36.     c = b->buf[b->start_ptr];
  37.     b->start_ptr++;
  38.     if(b->start_ptr == b->bufsize){b->start_ptr = 0;}
  39.     b->len--;
  40.     return c;
  41. }
  42. int STRINGQ_ungetc(int c,STRINGQ *b)
  43. {
  44.     b->start_ptr--;
  45.     if(b->start_ptr <0){b->start_ptr = b->bufsize -1;}
  46.     b->buf[b->start_ptr] = c;
  47.     b->len++;
  48.     return c;
  49. }
  50. int STRINGQ_putc(int c,STRINGQ *b)
  51. {
  52.     if(b->len==b->bufsize){return -2;}
  53.     
  54.     b->buf[b->end_ptr] = c;
  55.     b->end_ptr ++;
  56.     if(b->end_ptr == b->bufsize){b->end_ptr = 0;}
  57.     b->len++;
  58.     return c;
  59. }
  60.  
  61. void STRINGQ_puteof(STRINGQ *b)
  62. {
  63.     b->exist_eof = 1;
  64. }
  65. void STRINGQ_close(STRINGQ *b)
  66. {
  67.     free(b->buf);
  68.     free(b);
  69. }
  70. int STRINGQ_write(STRINGQ *b,char *buff,int len)
  71. {
  72.     int len2;
  73.     int save_len = len;
  74.  
  75.     if(len+b->len > b->bufsize){return -2;}
  76.  
  77.     len2=MIN(len,b->bufsize - b->start_ptr);
  78.     memcpy(b->buf + b->end_ptr,buff,len2);
  79.     len -= len2;
  80.     b->len += len2;
  81.     b->end_ptr += len2;
  82.     if(b->end_ptr == b->bufsize){b->end_ptr = 0;}
  83.  
  84.     if(len>0){
  85.         memcpy(b->buf,buff+len2,len);
  86.         b->len += len;
  87.         b->end_ptr += len;
  88.     }
  89.     return save_len;
  90. }
  91. int STRINGQ_read(STRINGQ *b,char *buff,int len)
  92. {
  93.     int readlen;
  94.     int len2;
  95.  
  96.     if(len > b->len){
  97.         if(b->exist_eof){
  98.             readlen = b->len;
  99.         }else{
  100.             return -2;
  101.         }
  102.     }else{
  103.         readlen = len;
  104.     }
  105.     /*len = readlen;*/
  106.     len2 = MIN(len,b->bufsize - b->start_ptr);
  107.     memcpy(buff,b->buf + b->start_ptr,len2);
  108.     len -= len2;
  109.     b->len -= len2;
  110.     b->start_ptr += len2;
  111.     if(b->start_ptr == b->bufsize){b->start_ptr =0;}
  112.     if(len>0){
  113.         /* b->end_ptr == 0*/
  114.         memcpy(buff+len2,b->buf,len);
  115.         b->len -=len;
  116.         b->start_ptr +=len;
  117.     }
  118.     return readlen;
  119. }
  120.