pelib
2.0.0
|
00001 /* 00002 * pair.c 00003 * 00004 * Created on: 5 Sep 2011 00005 * Copyright 2011 Nicolas Melot 00006 * 00007 * This file is part of pelib. 00008 * 00009 * pelib is free software: you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation, either version 3 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * pelib is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with pelib. If not, see <http://www.gnu.org/licenses/>. 00021 * 00022 */ 00023 00024 #include <stdio.h> 00025 #include <stdlib.h> 00026 #include <assert.h> 00027 #include <string.h> 00028 00029 #if !(defined PAIR_KEY_T && defined PAIR_VALUE_T) 00030 #error Using generic pair without key or value types 00031 #endif 00032 00033 pair_t(PAIR_KEY_T, PAIR_VALUE_T)* 00034 pelib_alloc_struct(pair_t(PAIR_KEY_T, PAIR_VALUE_T))() 00035 { 00036 pair_t(PAIR_KEY_T, PAIR_VALUE_T)* pair; 00037 00038 pair = malloc(sizeof(pair_t(PAIR_KEY_T, PAIR_VALUE_T))); 00039 assert(pair != NULL); 00040 00041 return pair; 00042 } 00043 00044 int 00045 pelib_init(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair_t(PAIR_KEY_T, PAIR_VALUE_T)* pair) 00046 { 00047 int a = pelib_init(PAIR_KEY_T)(&pair->key); 00048 return a && pelib_init(PAIR_VALUE_T)(&pair->value); 00049 } 00050 00051 int 00052 pelib_copy(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair_t(PAIR_KEY_T, PAIR_VALUE_T) src, pair_t(PAIR_KEY_T, PAIR_VALUE_T)* dst) 00053 { 00054 int a = pelib_copy(PAIR_KEY_T)(src.key, &dst->key); 00055 return a && pelib_copy(PAIR_VALUE_T)(src.value, &dst->value); 00056 } 00057 00058 #define pair_length_debug printf("[PELIB:%s:%s:%d] i = %d\n", __FILE__, __FUNCTION__, __LINE__, i); 00059 #define pair_length_pre_debug printf("[PELIB:%s:%s:%d] length = %d\n", __FILE__, __FUNCTION__, __LINE__, pelib_pair_length(PAIR_KEY_T, PAIR_VALUE_T)(&pair)); 00060 char* 00061 pelib_string(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair_t(PAIR_KEY_T, PAIR_VALUE_T) pair) 00062 { 00063 char *key = pelib_string(PAIR_KEY_T)(pair.key); 00064 char *value = pelib_string(PAIR_VALUE_T)(pair.value); 00065 00066 char *elem = malloc((strlen(key) + strlen(value) + 4) * sizeof(char*)); 00067 elem[0] = '('; 00068 strcpy(&elem[1], key); 00069 elem[1 + strlen(key)] = ','; 00070 strcpy(&elem[1 + strlen(key) + 1], value); 00071 elem[1 + strlen(key) + 1 + strlen(value)] = ')'; 00072 elem[1 + strlen(key) + 1 + strlen(value) + 1] = '\0'; 00073 free(key); 00074 free(value); 00075 00076 return elem; 00077 } 00078 00079 char* 00080 pelib_string_detail(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair_t(PAIR_KEY_T, PAIR_VALUE_T) pair, int level) 00081 { 00082 if(level == 0) 00083 { 00084 return pelib_string(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair); 00085 } 00086 else 00087 { 00088 char *key = pelib_string(PAIR_KEY_T)(pair.key); 00089 char *value = pelib_string(PAIR_VALUE_T)(pair.value); 00090 00091 char *elem = malloc((strlen(key) + strlen(value) + 4) * sizeof(char*)); 00092 elem[0] = '('; 00093 strcpy(&elem[1], key); 00094 elem[1 + strlen(key)] = ','; 00095 strcpy(&elem[1 + strlen(key) + 1], value); 00096 elem[1 + strlen(key) + 1 + strlen(value)] = ')'; 00097 elem[1 + strlen(key) + 1 + strlen(value) + 1] = '\0'; 00098 free(key); 00099 free(value); 00100 00101 return elem; 00102 } 00103 } 00104 00105 FILE* 00106 pelib_printf(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(FILE* stream, pair_t(PAIR_KEY_T, PAIR_VALUE_T) pair) 00107 { 00108 char * str; 00109 str = pelib_string(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair); 00110 00111 fprintf(stream, "%s\n", str); 00112 free(str); 00113 00114 return stream; 00115 } 00116 00117 FILE* 00118 pelib_printf_detail(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(FILE* stream, pair_t(PAIR_KEY_T, PAIR_VALUE_T) pair, int level) 00119 { 00120 char * str; 00121 str = pelib_string_detail(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair, level); 00122 00123 fprintf(stream, "%s\n", str); 00124 free(str); 00125 00126 return stream; 00127 } 00128 00129 int 00130 pelib_free(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair_t(PAIR_KEY_T, PAIR_VALUE_T)* pair) 00131 { 00132 return pelib_free_struct(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair); 00133 } 00134 00135 int 00136 pelib_free_struct(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair_t(PAIR_KEY_T, PAIR_VALUE_T)* pair) 00137 { 00138 pelib_destroy(PAIR_KEY_T)(pair->key); 00139 pelib_destroy(PAIR_VALUE_T)(pair->value); 00140 free(pair); 00141 return 0; 00142 } 00143 00144 int 00145 pelib_compare(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair_t(PAIR_KEY_T, PAIR_VALUE_T) a1, pair_t(PAIR_KEY_T, PAIR_VALUE_T) a2) 00146 { 00147 int a = pelib_compare(PAIR_KEY_T)(a1.key, a2.key); 00148 int b = pelib_compare(PAIR_VALUE_T)(a1.value, a2.value); 00149 return a == 0 ? b : a; 00150 } 00151 00152 int 00153 pelib_destroy(pair_t(PAIR_KEY_T, PAIR_VALUE_T))(pair_t(PAIR_KEY_T, PAIR_VALUE_T) set) 00154 { 00155 pelib_destroy(PAIR_KEY_T)(set.key); 00156 pelib_destroy(PAIR_VALUE_T)(set.value); 00157 return 1; 00158 }