/* WebROaR - Ruby Application Server - http://webroar.in/ * Copyright (C) 2009 Goonj LLC * * This file is part of WebROaR. * * WebROaR is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * WebROaR is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with WebROaR. If not, see . */ #ifndef WR_STRING_H_ #define WR_STRING_H_ #include #include #include #include "wr_macro.h" #define wr_tolower(c) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c) #define wr_toupper(c) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c) typedef struct { size_t len; char *str; }wr_str_t; #define wr_string_is_empty(_str) _str.str == NULL #define wr_string_new(_str,str1,_len) _str.len = _len; _str.str = (char*) malloc(sizeof(char)*(_len+1)); memcpy(_str.str, str1, _len); _str.str[_len] = 0 #define wr_string_null(_str) _str.len = 0; _str.str = NULL #define wr_string_append(_str, str1, _len) char *str2 =(char*) realloc(_str.str,sizeof(char)*(_str.len+_len+1));\ if(str2){memcpy(str2+_str.len, str1, _len); _str.len+=_len;str2[_str.len]=0;_str.str=str2;} #define wr_string_free(_str) if(_str.str) free(_str.str); _str.len = 0; _str.str = NULL #define wr_string_dump(_str,_str1) _str.len = _str1.len;_str.str = (char*) malloc(sizeof(char)*(_str.len+1)); memcpy(_str.str, _str1.str, _str.len); _str.str[_str.len] = 0 typedef struct { wr_str_t key; wr_str_t value; }wr_keyval_t; typedef struct wr_str_arr_s wr_str_arr_t; struct wr_str_arr_s { wr_str_t str; wr_str_arr_t *next; }; #define wr_string_arr_free(_arr) wr_string_free(_arr->str); free(_arr) typedef struct { wr_str_arr_t *front; wr_str_arr_t *rear; size_t len; }wr_str_list_t; #define wr_string_list_is_empty(_list) _list->front == NULL wr_str_list_t* wr_string_list_new(); int wr_string_list_add(wr_str_list_t*,const char*, size_t); wr_str_arr_t* wr_string_list_remove(wr_str_list_t*); void wr_string_list_free(wr_str_list_t*); typedef struct wr_buffer_s wr_buffer_t; struct wr_buffer_s{ char *str; size_t len; size_t size; wr_buffer_t *next; }; #define wr_buffer_new(_buf) _buf = wr_malloc(wr_buffer_t); _buf->len = _buf->size = 0; _buf->str = NULL #define wr_buffer_create(_buf,_size) _buf->len = 0; _buf->size = _size; _buf->str = (char*) malloc(sizeof(char)*(_size+1)) #define wr_buffer_null(_buf) _buf->len = 0; if(_buf->str) free(_buf->str); _buf->str = NULL; _buf->size = 0 #define wr_buffer_add(_buf, _str, _len) memcpy(_buf->str + _buf->len, _str, wr_min(_len, _buf->size - _buf->len)); _buf->len += wr_min(_len, _buf->size-_buf->len) #define wr_buffer_free(_buf) wr_buffer_null(_buf); free(_buf); _buf = NULL #define wr_buffer_set_zero(_buf) memset(_buf->str, 0, _buf->size) typedef struct { wr_buffer_t *front; wr_buffer_t *rear; }wr_buffer_list_t; #define wr_buffer_list_is_empty(_list) _list->front == NULL wr_buffer_list_t* wr_buffer_list_new(); int wr_buffer_list_add(wr_buffer_list_t *list, wr_buffer_t *buffer); wr_buffer_t* wr_buffer_list_remove(wr_buffer_list_t*); void wr_buffer_list_free(wr_buffer_list_t*); #define file_print(file, format, ...) do { FILE *f=fopen(file,"a+"); if(f){fprintf(f, format, __VA_ARGS__); fclose(f);} } while (0) #define file_write(file, buf, len) do { FILE *f=fopen(file,"a+"); if(f){fwrite(buf, sizeof(char), len, f); fclose(f);} } while (0) #endif /*WRR_STRING_H_*/