1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +02:00
2010-01-24 09:19:39 +00:00

384 lines
8.2 KiB
C

/*
* Copyright 2008 Digital Bazaar, Inc.
*
* This file is part of librdfa.
*
* librdfa is Free Software, and can be licensed under any of the
* following three licenses:
*
* 1. GNU Lesser General Public License (LGPL) V2.1 or any
* newer version
* 2. GNU General Public License (GPL) V2 or any newer version
* 3. Apache License, V2.0 or any newer version
*
* You may not use this file except in compliance with at least one of
* the above three licenses.
*
* See LICENSE-* at the top of this software distribution for more
* information regarding the details of each license.
*
* You should have received a copy of the GNU Lesser General Public
* License along with librdfa. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#include "rdfa_utils.h"
#include "rdfa.h"
#define RDFA_WHITESPACE_CHARACTERS " \a\b\t\n\v\f\r"
char* rdfa_join_string(const char* prefix, const char* suffix)
{
char* rval = NULL;
size_t prefix_size = strlen(prefix);
size_t suffix_size = strlen(suffix);
rval = (char*)malloc(prefix_size + suffix_size + 1);
memcpy(rval, prefix, prefix_size);
memcpy(rval+prefix_size, suffix, suffix_size + 1);
return rval;
}
char* rdfa_n_append_string(
char* old_string, size_t* string_size,
const char* suffix, size_t suffix_size)
{
char* rval = NULL;
rval = (char*)realloc(old_string, *string_size + suffix_size + 1);
memcpy(rval + *string_size, suffix, suffix_size + 1);
*string_size = *string_size + suffix_size;
return rval;
}
char* rdfa_replace_string(char* old_string, const char* new_string)
{
char* rval = NULL;
if(new_string != NULL)
{
// free the memory associated with the old string if it exists.
if(old_string != NULL)
{
free(old_string);
}
// copy the new string
rval = strdup(new_string);
}
return rval;
}
char* rdfa_canonicalize_string(const char* str)
{
char* rval = (char*)malloc(sizeof(char) * (strlen(str) + 2));
char* working_string = NULL;
char* token = NULL;
char* wptr = NULL;
char* offset = rval;
working_string = rdfa_replace_string(working_string, str);
// split on any whitespace character that we may find
token = strtok_r(working_string, RDFA_WHITESPACE_CHARACTERS, &wptr);
while(token != NULL)
{
size_t token_length = strlen(token);
memcpy(offset, token, token_length);
offset += token_length;
*offset++ = ' ';
*offset = '\0';
token = strtok_r(NULL, RDFA_WHITESPACE_CHARACTERS, &wptr);
}
if(offset != rval)
{
offset--;
*offset = '\0';
}
free(working_string);
return rval;
}
rdfalist* rdfa_create_list(size_t size)
{
rdfalist* rval = (rdfalist*)malloc(sizeof(rdfalist));
rval->max_items = size;
rval->num_items = 0;
rval->items = (rdfalistitem**)malloc(sizeof(rdfalistitem) * rval->max_items);
return rval;
}
rdfalist* rdfa_copy_list(rdfalist* list)
{
rdfalist* rval = (rdfalist*)malloc(sizeof(rdfalist));
unsigned int i;
// copy the base list variables over
rval->max_items = list->max_items;
rval->num_items = list->num_items;
rval->items = NULL;
rval->items = (rdfalistitem**)realloc(rval->items, sizeof(void*) * rval->max_items);
// copy the data of every list member along with all of the flags
// for each list member.
//
// TODO: Implement the copy for context, if it is needed.
for(i = 0; i < list->max_items; i++)
{
if(i < rval->num_items)
{
if(list->items[i]->flags & RDFALIST_FLAG_TEXT)
{
rval->items[i] = (rdfalistitem*)malloc(sizeof(rdfalistitem));
rval->items[i]->data = NULL;
rval->items[i]->data = (char*)
rdfa_replace_string((char*)rval->items[i]->data, (const char*)list->items[i]->data);
rval->items[i]->flags = list->items[i]->flags;
}
}
else
{
rval->items[i] = NULL;
}
}
return rval;
}
void rdfa_print_list(rdfalist* list)
{
unsigned int i;
printf("[ ");
for(i = 0; i < list->num_items; i++)
{
if(i != 0)
{
printf(", ");
}
puts((const char*)list->items[i]->data);
}
printf(" ]\n");
}
void rdfa_free_list(rdfalist* list)
{
if(list != NULL)
{
unsigned int i;
for(i = 0; i < list->num_items; i++)
{
free(list->items[i]->data);
free(list->items[i]);
}
free(list->items);
free(list);
}
}
void rdfa_push_item(rdfalist* stack, void* data, liflag_t flags)
{
rdfa_add_item(stack, data, flags);
}
void* rdfa_pop_item(rdfalist* stack)
{
void* rval = NULL;
if(stack->num_items > 0)
{
rval = stack->items[stack->num_items - 1]->data;
free(stack->items[stack->num_items - 1]);
stack->items[stack->num_items - 1] = NULL;
stack->num_items--;
}
return rval;
}
void rdfa_add_item(rdfalist* list, void* data, liflag_t flags)
{
rdfalistitem* item = (rdfalistitem*)malloc(sizeof(rdfalistitem));
item->data = NULL;
if(flags & RDFALIST_FLAG_CONTEXT)
{
item->data = data;
}
else
{
item->data = (char*)rdfa_replace_string((char*)item->data, (const char*)data);
}
item->flags = flags;
if(list->num_items == list->max_items)
{
list->max_items = 1 + (list->max_items * 2);
list->items = (rdfalistitem**)
realloc(list->items, sizeof(rdfalistitem) * list->max_items);
}
list->items[list->num_items] = item;
list->num_items++;
}
#ifndef LIBRDFA_IN_RAPTOR
char** rdfa_create_mapping(size_t elements)
{
size_t mapping_size = sizeof(char*) * MAX_URI_MAPPINGS * 2;
char** mapping = malloc(mapping_size);
// only initialize the mapping if it is null.
if(mapping != NULL)
{
memset(mapping, 0, mapping_size);
}
return mapping;
}
char** rdfa_copy_mapping(char** mapping)
{
size_t mapping_size = sizeof(char*) * MAX_URI_MAPPINGS * 2;
char** rval = malloc(mapping_size);
char** mptr = mapping;
char** rptr = rval;
// initialize the mapping
memset(rval, 0, mapping_size);
// copy each element of the old mapping to the new mapping.
while(*mptr != NULL)
{
*rptr = rdfa_replace_string(*rptr, *mptr);
rptr++;
mptr++;
}
return rval;
}
void rdfa_update_mapping(char** mapping, const char* key, const char* value)
{
int found = 0;
char** mptr = mapping;
// search the current mapping to see if the namespace
// prefix exists in the mapping
while(*mptr != NULL)
{
if(strcmp(*mptr, key) == 0)
{
mptr++;
*mptr = rdfa_replace_string(*mptr, value);
found = 1;
}
else
{
mptr++;
}
mptr++;
}
// if we made it through the entire URI mapping and the key was not
// found, create a new key-value pair.
if(!found)
{
*mptr = rdfa_replace_string(*mptr, key);
mptr++;
*mptr = rdfa_replace_string(*mptr, value);
}
}
const char* rdfa_get_mapping(char** mapping, const char* key)
{
const char* rval = NULL;
char** mptr = mapping;
// search the current mapping to see if the key exists in the mapping.
while(*mptr != NULL)
{
if(strcmp(*mptr, key) == 0)
{
mptr++;
rval = *mptr;
}
else
{
mptr++;
}
mptr++;
}
return rval;
}
void rdfa_next_mapping(char** mapping, char** key, char** value)
{
*key = NULL;
*value = NULL;
if(*mapping != NULL)
{
*key = *mapping++;
*value = *mapping++;
}
}
void rdfa_print_mapping(char** mapping)
{
char** mptr = mapping;
printf("{\n");
while(*mptr != NULL)
{
char* key;
char* value;
key = *mptr++;
value = *mptr++;
printf(" %s : %s", key, value);
if(*mptr != NULL)
{
printf(",\n");
}
else
{
printf("\n");
}
}
printf("}\n");
}
void rdfa_free_mapping(char** mapping)
{
char** mptr = mapping;
if(mapping != NULL)
{
// free all of the memory in the mapping
while(*mptr != NULL)
{
free(*mptr);
mptr++;
}
free(mapping);
}
}
#endif