/* <AuthorList CompleteYN="Y"> * <Author> * <LastName>Barondeau</LastName> * <ForeName>David P</ForeName> * ( or <FirstName>David P</FirstName> ) * <Initials>DP</Initials> * </Author> * <Author> * <CollectiveName>Organization</CollectiveName> * </Author> * </AuthorList> */ static int medin_author( xml *node, str *name ) { char *p; if ( xml_tag_matches( node, "LastName" ) ) { if ( str_has_value( name ) ) { str_prepend( name, "|" ); str_prepend( name, xml_value_cstr( node ) ); } else str_strcat( name, xml_value( node ) ); } else if ( xml_tag_matches( node, "ForeName" ) || xml_tag_matches( node, "FirstName" ) ) { p = xml_value_cstr( node ); while ( p && *p ) { if ( str_has_value( name ) ) str_addchar( name, '|' ); while ( *p==' ' ) p++; while ( *p && *p!=' ' ) str_addchar( name, *p++ ); } } else if ( xml_tag_matches( node, "Initials" ) && !strchr( name->data, '|' )) { p = xml_value_cstr( node ); while ( p && *p ) { if ( str_has_value( name ) ) str_addchar( name, '|' ); if ( !is_ws(*p) ) str_addchar( name, *p++ ); } } if ( node->next ) medin_author( node->next, name ); return BIBL_OK; }
char* str_enumerate_n(char *old, int jump, size_t *len) { size_t oldlen = *len; // Special case, first jump. if(!old) { old = (char*)malloc(sizeof(char) * 2); old[0] = search_lookup_forward(jump % search_space_size); old[1] = 0; oldlen = 1; for(jump /= search_space_size; (jump); jump /= search_space_size) { char cc = search_lookup_forward(jump % search_space_size); old = str_prepend(old, oldlen, cc); ++oldlen; } *len = oldlen; return old; } char *iter = old + oldlen - 1; do { jump += search_lookup_backward(*iter); int rem = jump % search_space_size; *iter = search_lookup_forward(rem); jump /= search_space_size; if(iter == old) { for(; (jump); jump /= search_space_size) { char cc = search_lookup_forward(jump % search_space_size); old = str_prepend(old, oldlen, cc); ++oldlen; } *len = oldlen; return old; } --iter; } while(jump); // No need to update len since it isn't changed. return old; }
char *str_enumerate_fn(char *old, int jump, size_t *len) { size_t oldlen = *len; char *iter = old + oldlen - 1; while(1) { int idx = search_lookup_backward(*iter) + jump; if(idx < search_space_size) { *iter = search_lookup_forward(idx); return old; } *iter = search_lookup_forward(idx - search_space_size); jump = 1; if(iter == old) { *len = oldlen + 1; return str_prepend(old, oldlen, search_lookup_forward(0)); } --iter; } }
char* str_enumerate_1(char *old, size_t *len) { // Special case, first jump. if(!old) { char *ret = (char*)malloc(sizeof(char) * 2); ret[0] = search_lookup_forward(0); ret[1] = 0; *len = 1; return ret; } size_t oldlen = *len; char *iter = old + oldlen - 1; while(1) { int idx = search_lookup_backward(*iter) + 1; if(idx < search_space_size) { *iter = search_lookup_forward(idx); return old; } *iter = search_lookup_forward(0); if(iter == old) { *len = oldlen + 1; return str_prepend(old, oldlen, search_lookup_forward(0)); } --iter; } }
void test_str_prepend(void) { str dst; str src; str_create_from_cstr(&src, "prepended_string"); str_create_from_cstr(&dst, "base_string"); str_prepend(&dst, &src); CU_ASSERT(str_size(&dst) == 27); CU_ASSERT_PTR_NOT_NULL(dst.data); CU_ASSERT_NSTRING_EQUAL(dst.data, "prepended_string", 16); CU_ASSERT_NSTRING_EQUAL(dst.data+16, "base_string", 11); CU_ASSERT(dst.data[dst.len] == 0); str_free(&src); str_free(&dst); }