00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef lint
00021 static const char rcsid[] = "$Id: variant.c,v 1.2 2004-06-30 17:07:20 wingman Exp $";
00022 #endif
00023
00024 #include <stdio.h>
00025 #include <string.h>
00026
00027 #include <eggdrop/memory.h>
00028 #include <eggdrop/memutil.h>
00029 #include <eggdrop/variant.h>
00030
00031 void variant_set_str(variant_t *target, const char *value)
00032 {
00033 if (target->type == VARIANT_STRING) {
00034 str_redup(&target->value.s_val, value);
00035 return;
00036 }
00037
00038 target->value.s_val = (value) ? strdup(value) : NULL;
00039 target->type = VARIANT_STRING;
00040 }
00041
00042 const char *variant_get_str(variant_t *target, const char *nil)
00043 {
00044 switch (target->type) {
00045
00046 case (VARIANT_STRING):
00047 {
00048 return target->value.s_val;
00049 }
00050
00051 case (VARIANT_INT):
00052 {
00053 char buf[32];
00054
00055 if (target->value.i_val == MIN_INT || target->value.i_val == MAX_INT)
00056 return NULL;
00057
00058 snprintf(buf, sizeof(buf), "%d", target->value.i_val);
00059 variant_set_str(target, buf);
00060 return variant_get_str(target, buf);
00061 }
00062
00063 case (VARIANT_BOOL):
00064 {
00065 variant_set_str(target, target->value.b_val ? "yes" : "no");
00066 return variant_get_str(target, NULL);
00067 }
00068
00069 case (VARIANT_TIMESTAMP):
00070 {
00071 char buf[32];
00072
00073 if (target->value.ts_val == (time_t)0)
00074 return NULL;
00075
00076 snprintf(buf, sizeof(buf), "%li", target->value.ts_val);
00077 variant_set_str(target, buf);
00078 return variant_get_str(target, buf);
00079 }
00080
00081 }
00082
00083 return NULL;
00084 }
00085
00086 void variant_set_int(variant_t *target, int value)
00087 {
00088 if (target->type == VARIANT_INT) {
00089 target->value.i_val = value;
00090 return;
00091 }
00092
00093
00094 if (target->type == VARIANT_STRING) {
00095 if (target->value.s_val) free(target->value.s_val);
00096 }
00097
00098 target->value.i_val = value;
00099 target->type = VARIANT_INT;
00100 }
00101
00102 int variant_get_int(variant_t *target, int nil)
00103 {
00104 switch (target->type) {
00105
00106 case (VARIANT_INT):
00107 return target->value.i_val;
00108
00109 case (VARIANT_BOOL):
00110 return target->value.b_val;
00111
00112 case (VARIANT_STRING):
00113 if (target->value.s_val == NULL)
00114 return nil;
00115 return atoi(target->value.s_val);
00116
00117 case (VARIANT_TIMESTAMP):
00118 return (int)target->value.ts_val;
00119
00120 }
00121
00122 return nil;
00123 }
00124
00125 void variant_set_bool(variant_t *target, int value)
00126 {
00127 if (target->type == VARIANT_BOOL) {
00128 target->value.b_val = value;
00129 return;
00130 }
00131
00132
00133 if (target->type == VARIANT_STRING) {
00134 if (target->value.s_val) free(target->value.s_val);
00135 }
00136
00137
00138 target->value.b_val = (value) ? 0 : 1;
00139 target->type = VARIANT_BOOL;
00140 }
00141
00142 int variant_get_bool(variant_t *target, int nil)
00143 {
00144 switch (target->type) {
00145
00146 case (VARIANT_INT):
00147 return (target->value.i_val) ? 0 : 1;
00148
00149 case (VARIANT_BOOL):
00150 return target->value.b_val;
00151
00152 case (VARIANT_STRING):
00153 if (target->value.s_val == NULL)
00154 return nil;
00155 if (0 == strcmp(target->value.s_val, "yes")
00156 || 0 == strcmp(target->value.s_val, "1"))
00157 return 1;
00158 else if (0 == strcmp(target->value.s_val, "no")
00159 || 0 == strcmp(target->value.s_val, "0"))
00160 return 0;
00161 return nil;
00162
00163 case (VARIANT_TIMESTAMP):
00164 return nil;
00165
00166 }
00167
00168 return nil;
00169 }
00170
00171 void variant_set_ts(variant_t *target, time_t value)
00172 {
00173 if (target->type == VARIANT_TIMESTAMP) {
00174 target->value.ts_val = value;
00175 return;
00176 }
00177
00178
00179 if (target->type == VARIANT_STRING) {
00180 if (target->value.s_val)
00181 free(target->value.s_val);
00182 target->value.s_val = NULL;
00183 }
00184
00185 target->value.ts_val = value;
00186 target->type = VARIANT_TIMESTAMP;
00187 }
00188
00189 time_t variant_get_ts(variant_t *target, time_t nil)
00190 {
00191 switch (target->type) {
00192
00193 case (VARIANT_INT):
00194 return nil;
00195
00196 case (VARIANT_BOOL):
00197 return nil;
00198
00199 case (VARIANT_STRING):
00200 return (time_t)atof(target->value.s_val);
00201
00202 case (VARIANT_TIMESTAMP):
00203 return target->value.ts_val;
00204
00205 }
00206
00207 return nil;
00208 }