The example below shows how to search for objects in a context with a specific attribute identifier and value.
#include <stdio.h>
#include <xfn/xfn.h>
#include <string.h>
#include <stdlib.h>
/*
This routine searchs for objects in a context
which has the specified attribute identifier and value.
*/
typedef struct fns_search_results {
char *name;
struct fns_search_results *next;
} fns_search_results;
static const char *attr_id_syntax = "fn_attr_syntax_ascii";
fns_search_results *
fns_attr_search(const char *name,
const char *attr_id,
const char *attr_value)
{
FN_status_t *status;
FN_ctx_t *initial_context;
FN_composite_name_t *context_name;
FN_searchlist_t *search_list;
FN_string_t *search_name;
FN_attribute_t *attribute;
FN_attrset_t *attrset;
FN_identifier_t identifier, syntax;
FN_attrvalue_t *values;
unsigned stat;
fns_search_results *head = 0, *current, *prev;
int no_names = 0;
context_name = fn_composite_name_from_str((unsigned char *) name);
status = fn_status_create();
initial_context = fn_ctx_handle_from_initial(0, status);
if (!fn_status_is_success(status)) {
fprintf(stderr, "Unable to obtain intial context\n");
return (0);
}
/* Construnct the attrset with attributes to be searched */
/* First, the identifier */
identifier.format = FN_ID_STRING;
identifier.length = strlen(attr_id);
identifier.contents = (void *) strdup(attr_id);
/* Second, the syntax */
syntax.format = FN_ID_STRING;
syntax.length = strlen(attr_id_syntax);
syntax.contents = (void *) strdup(attr_id_syntax);
/* Third, the attribute value */
values = (FN_attrvalue_t *) malloc(sizeof(FN_attrvalue_t));
values->length = strlen(attr_value);
values->contents = (void *) strdup(attr_value);
/* Fourth, create the attribute */
attribute = fn_attribute_create(&identifier, &syntax);
/* Fifth, add the attribute value */
fn_attribute_add(attribute, values, 0);
/* Sixth, create attrset, and add the attribute */
attrset = fn_attrset_create();
fn_attrset_add(attrset, attribute, 0);
search_list = prelim_fn_attr_search(initial_context,
context_name, attrset, 0, 0, status);
if (!fn_status_is_success(status)) {
fprintf(stderr, "Unable to list names\n");
return (0);
}
while (search_name = prelim_fn_searchlist_next(search_list,
0, 0, status)) {
no_names++;
current = (fns_search_results *)
malloc(sizeof(fns_search_results));
current->name = (char *)
malloc(strlen((char *) fn_string_str(search_name, &stat)) + 1);
strcpy(current->name, (char *) fn_string_str(search_name, &stat));
current->next = 0;
if (head) {
prev->next = current;
prev = current;
} else {
head = current;
prev = current;
}
fn_string_destroy(search_name);
}
fn_searchlist_destroy(search_list);
fn_status_destroy(status);
fn_ctx_destroy(initial_context);
fn_attrset_destroy(attrset);
fn_attribute_destroy(attribute);
free(identifier.contents);
free(syntax.contents);
free(values->contents);
free(values);
return (head);
}
|