/* This file is part of the YAZ toolkit. * Copyright (C) Index Data * See the file LICENSE for details. */ /** * \file initopt.c * \brief Implements Z39.50 Init Options Utility */ #if HAVE_CONFIG_H #include #endif #include static struct { char *name; int opt; } opt_array[] = { {"search", Z_Options_search}, {"present", Z_Options_present}, {"delSet", Z_Options_delSet}, {"resourceReport", Z_Options_resourceReport}, {"triggerResourceCtrl", Z_Options_triggerResourceCtrl}, {"resourceCtrl", Z_Options_resourceCtrl}, {"accessCtrl", Z_Options_accessCtrl}, {"scan", Z_Options_scan}, {"sort", Z_Options_sort}, {"extendedServices", Z_Options_extendedServices}, {"level_1Segmentation", Z_Options_level_1Segmentation}, {"level_2Segmentation", Z_Options_level_2Segmentation}, {"concurrentOperations", Z_Options_concurrentOperations}, {"namedResultSets", Z_Options_namedResultSets}, {"encapsulation", Z_Options_encapsulation}, {"resultCount", Z_Options_resultCount}, {"negotiationModel", Z_Options_negotiationModel}, {"duplicationDetection", Z_Options_duplicateDetection}, {"queryType104", Z_Options_queryType104}, {"pQESCorrection", Z_Options_pQESCorrection}, {"stringSchema", Z_Options_stringSchema}, {0, 0} }; int yaz_init_opt_encode(Z_Options *opt, const char *opt_str, int *error_pos) { const char *cp = opt_str; ODR_MASK_ZERO(opt); while (*cp) { char this_opt[42]; size_t i, j; if (*cp == ' ' || *cp == ',') { cp++; continue; } for (i = 0; i < (sizeof(this_opt)-1) && cp[i] && cp[i] != ' ' && cp[i] != ','; i++) this_opt[i] = cp[i]; this_opt[i] = 0; for (j = 0; opt_array[j].name; j++) { if (yaz_matchstr(this_opt, opt_array[j].name) == 0) { ODR_MASK_SET(opt, opt_array[j].opt); break; } } if (!opt_array[j].name) { if (error_pos) { *error_pos = cp - opt_str; return -1; } } cp += i; } return 0; } void yaz_init_opt_decode(Z_Options *opt, void (*pr)(const char *name, void *clientData), void *clientData) { int i; for (i = 0; opt_array[i].name; i++) if (ODR_MASK_GET(opt, opt_array[i].opt)) (*pr)(opt_array[i].name, clientData); } /* * Local variables: * c-basic-offset: 4 * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */