/* stringq process char buffer as queue like pipe by Yoshioka Tsuneo(QWF00133@niftyserve.or.jp) This File is Copy,Edit,Re-Distribute,etc.. FREE! Welcome any e-mail!! */ #include "stringq.h" #include #include #include #include STRINGQ *STRINGQ_open(char *buf,int size) { STRINGQ *b; b = malloc(sizeof(STRINGQ)); if(!b)return NULL; memset(b,0,sizeof(STRINGQ)); if(buf==NULL){ b->buf = malloc(size); if(! b->buf){free(b);return NULL;} }else{ b->buf_by_user = 1; b->buf=buf; } memset(b->buf ,0,size); b->bufsize = size; return b; } int STRINGQ_getc(STRINGQ *b) { int c; if(b->len==0){ if(b->exist_eof){return EOF;}else{return -2;} } c = b->buf[b->start_ptr]; b->start_ptr++; if(b->start_ptr == b->bufsize){b->start_ptr = 0;} b->len--; return c; } int STRINGQ_ungetc(int c,STRINGQ *b) { b->start_ptr--; if(b->start_ptr <0){b->start_ptr = b->bufsize -1;} b->buf[b->start_ptr] = c; b->len++; return c; } int STRINGQ_putc(int c,STRINGQ *b) { if(b->len==b->bufsize){return -2;} b->buf[b->end_ptr] = c; b->end_ptr ++; if(b->end_ptr == b->bufsize){b->end_ptr = 0;} b->len++; return c; } void STRINGQ_puteof(STRINGQ *b) { b->exist_eof = 1; } void STRINGQ_close(STRINGQ *b) { if(!b->buf_by_user)free(b->buf); free(b); } int STRINGQ_write(STRINGQ *b,const char *buff,int len) { int len2; int save_len; if(b->len >= b->bufsize){ return -2; }else if((len + b->len) > b->bufsize){ len = b->bufsize - b->len; } /*if(len + b->len > b->bufsize){return -2;}*/ save_len = len; len2=MIN(len,b->bufsize - b->start_ptr); memcpy(b->buf + b->end_ptr,buff,len2); len -= len2; b->len += len2; b->end_ptr += len2; if(b->end_ptr == b->bufsize){b->end_ptr = 0;} if(len>0){ memcpy(b->buf,buff+len2,len); b->len += len; b->end_ptr += len; } return save_len; } int STRINGQ_read(STRINGQ *b,char *buff,int len) { int readlen; int len2; if(len > b->len){ if(b->exist_eof){ readlen = b->len; }else{ return -2; } }else{ readlen = len; } /*len = readlen;*/ len2 = MIN(len,b->bufsize - b->start_ptr); memcpy(buff,b->buf + b->start_ptr,len2); len -= len2; b->len -= len2; b->start_ptr += len2; if(b->start_ptr == b->bufsize){b->start_ptr =0;} if(len>0){ /* b->end_ptr == 0*/ memcpy(buff+len2,b->buf,len); b->len -=len; b->start_ptr +=len; } return readlen; } int STRINGQ_puts(const char *str,STRINGQ *b) { return STRINGQ_write(b,str,strlen(str)); } int STRINGQ_printf(STRINGQ *b,const char *format,...) { va_list vp; int ret; char line[10000]; va_start(vp,format); vsprintf(line,format,vp); ret = STRINGQ_puts(line,b); va_end(vp); return ret; } /* may be contain bug */ char *STRINGQ_gets(char *str,int n,STRINGQ *b) { int c; char *str2 = str; c = STRINGQ_getc(b); if(c==EOF){return NULL;} *str2++=c; while(c!=EOF && c!='\n' && c!='\0' && --n>0){ c = STRINGQ_getc(b); *str2++ = c; } *str2 = '\0'; return str; }