pelib  2.0.0
include/pelib/pair.c
Go to the documentation of this file.
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 }