00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 #include <stdlib.h>
00064 #include <stdio.h>
00065 #include <string.h>
00066 #include <ctype.h>
00067
00068 #include <osl/macros.h>
00069 #include <osl/util.h>
00070 #include <osl/strings.h>
00071 #include <osl/interface.h>
00072 #include <osl/extensions/arrays.h>
00073
00074
00075
00076
00077
00078
00079
00090 void osl_arrays_idump(FILE * file, osl_arrays_p arrays, int level) {
00091 int i, j;
00092
00093
00094 for (j = 0; j < level; j++)
00095 fprintf(file, "|\t");
00096
00097 if (arrays != NULL)
00098 fprintf(file, "+-- osl_arrays_t\n");
00099 else
00100 fprintf(file, "+-- NULL arrays\n");
00101
00102 if (arrays != NULL) {
00103
00104 for(j = 0; j <= level; j++)
00105 fprintf(file, "|\t");
00106
00107
00108 fprintf(file, "nb_names: %d\n", arrays->nb_names);
00109
00110
00111 for(i = 0; i < arrays->nb_names; i++) {
00112
00113 for(j = 0; j <= level; j++)
00114 fprintf(file, "|\t");
00115
00116 fprintf(file, "id: %2d, name: %s\n", arrays->id[i], arrays->names[i]);
00117 }
00118 }
00119
00120
00121 for (j = 0; j <= level; j++)
00122 fprintf(file, "|\t");
00123 fprintf(file, "\n");
00124 }
00125
00126
00134 void osl_arrays_dump(FILE * file, osl_arrays_p arrays) {
00135 osl_arrays_idump(file, arrays, 0);
00136 }
00137
00138
00146 char * osl_arrays_sprint(osl_arrays_p arrays) {
00147 int i;
00148 int high_water_mark = OSL_MAX_STRING;
00149 char * string = NULL;
00150 char buffer[OSL_MAX_STRING];
00151
00152 if (arrays != NULL) {
00153 OSL_malloc(string, char *, high_water_mark * sizeof(char));
00154 string[0] = '\0';
00155
00156 sprintf(buffer, "# Number of arrays\n");
00157 osl_util_safe_strcat(&string, buffer, &high_water_mark);
00158
00159 sprintf(buffer, "%d\n", arrays->nb_names);
00160 osl_util_safe_strcat(&string, buffer, &high_water_mark);
00161
00162 if (arrays->nb_names) {
00163 sprintf(buffer, "# Mapping array-identifiers/array-names\n");
00164 osl_util_safe_strcat(&string, buffer, &high_water_mark);
00165 }
00166 for (i = 0; i < arrays->nb_names; i++) {
00167 sprintf(buffer, "%d %s\n", arrays->id[i], arrays->names[i]);
00168 osl_util_safe_strcat(&string, buffer, &high_water_mark);
00169 }
00170
00171 OSL_realloc(string, char *, (strlen(string) + 1) * sizeof(char));
00172 }
00173
00174 return string;
00175 }
00176
00177
00178
00179
00180
00181
00182
00194 osl_arrays_p osl_arrays_sread(char ** input) {
00195 int i, k;
00196 int nb_names;
00197 osl_arrays_p arrays;
00198
00199 if (input == NULL) {
00200 OSL_debug("no arrays optional tag");
00201 return NULL;
00202 }
00203
00204
00205 nb_names = osl_util_read_int(NULL, input);
00206
00207
00208 arrays = osl_arrays_malloc();
00209 OSL_malloc(arrays->id, int *, nb_names * sizeof(int));
00210 OSL_malloc(arrays->names, char **, nb_names * sizeof(char *));
00211 arrays->nb_names = nb_names;
00212 for (i = 0; i < nb_names; i++)
00213 arrays->names[i] = NULL;
00214
00215
00216 for (k = 0; k < nb_names; k++) {
00217
00218 arrays->id[k] = osl_util_read_int(NULL, input);
00219
00220
00221 arrays->names[k] = osl_util_read_string(NULL, input);
00222 }
00223
00224 return arrays;
00225 }
00226
00227
00228
00229
00230
00231
00232
00241 osl_arrays_p osl_arrays_malloc() {
00242 osl_arrays_p arrays;
00243
00244 OSL_malloc(arrays, osl_arrays_p, sizeof(osl_arrays_t));
00245 arrays->nb_names = 0;
00246 arrays->id = NULL;
00247 arrays->names = NULL;
00248
00249 return arrays;
00250 }
00251
00252
00258 void osl_arrays_free(osl_arrays_p arrays) {
00259 int i;
00260
00261 if (arrays != NULL) {
00262 free(arrays->id);
00263 for (i = 0; i < arrays->nb_names; i++)
00264 free(arrays->names[i]);
00265 free(arrays->names);
00266 free(arrays);
00267 }
00268 }
00269
00270
00271
00272
00273
00274
00275
00283 osl_arrays_p osl_arrays_clone(osl_arrays_p arrays) {
00284 int i;
00285 osl_arrays_p clone;
00286
00287 if (arrays == NULL)
00288 return NULL;
00289
00290 clone = osl_arrays_malloc();
00291 clone->nb_names = arrays->nb_names;
00292 OSL_malloc(clone->id, int *, arrays->nb_names * sizeof(int));
00293 OSL_malloc(clone->names, char **, arrays->nb_names * sizeof(char*));
00294
00295 for (i = 0; i < arrays->nb_names; i++) {
00296 clone->id[i] = arrays->id[i];
00297 OSL_strdup(clone->names[i], arrays->names[i]);
00298 }
00299
00300 return clone;
00301 }
00302
00303
00314 int osl_arrays_equal(osl_arrays_p a1, osl_arrays_p a2) {
00315 int i, j, found;
00316
00317 if (a1 == a2)
00318 return 1;
00319
00320 if (((a1 == NULL) && (a2 != NULL)) || ((a1 != NULL) && (a2 == NULL)))
00321 return 0;
00322
00323
00324 if (a1->nb_names != a2->nb_names)
00325 return 0;
00326
00327
00328
00329 for (i = 0; i < a1->nb_names; i++) {
00330 found = 0;
00331 for (j = 0; j < a2->nb_names; j++) {
00332 if ((a1->id[i] == a2->id[j]) && (!strcmp(a1->names[i], a2->names[j]))) {
00333 found = 1;
00334 break;
00335 }
00336 }
00337 if (found != 1)
00338 return 0;
00339 }
00340
00341 return 1;
00342 }
00343
00344
00354 osl_strings_p osl_arrays_to_strings(osl_arrays_p arrays) {
00355 int i, max_id = 0;
00356 osl_strings_p strings = NULL;
00357
00358 if (arrays == NULL)
00359 return NULL;
00360
00361
00362 if (arrays->nb_names >= 1) {
00363 max_id = arrays->id[0];
00364 for (i = 1; i < arrays->nb_names; i++)
00365 if (arrays->id[i] > max_id)
00366 max_id = arrays->id[i];
00367 }
00368
00369
00370 strings = osl_strings_generate("Dummy", max_id);
00371 for (i = 0; i < arrays->nb_names; i++) {
00372 free(strings->string[arrays->id[i] - 1]);
00373 OSL_strdup(strings->string[arrays->id[i] - 1], arrays->names[i]);
00374 }
00375
00376 return strings;
00377 }
00378
00379
00386 osl_interface_p osl_arrays_interface() {
00387 osl_interface_p interface = osl_interface_malloc();
00388
00389 interface->URI = strdup(OSL_URI_ARRAYS);
00390 interface->idump = (osl_idump_f)osl_arrays_idump;
00391 interface->sprint = (osl_sprint_f)osl_arrays_sprint;
00392 interface->sread = (osl_sread_f)osl_arrays_sread;
00393 interface->malloc = (osl_malloc_f)osl_arrays_malloc;
00394 interface->free = (osl_free_f)osl_arrays_free;
00395 interface->clone = (osl_clone_f)osl_arrays_clone;
00396 interface->equal = (osl_equal_f)osl_arrays_equal;
00397
00398 return interface;
00399 }
00400
00401