diff options
Diffstat (limited to 'sal/rtl/source')
36 files changed, 0 insertions, 17791 deletions
diff --git a/sal/rtl/source/alloc_arena.c b/sal/rtl/source/alloc_arena.c deleted file mode 100644 index 6b4403414..000000000 --- a/sal/rtl/source/alloc_arena.c +++ /dev/null @@ -1,1349 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#define _BSD_SOURCE /* sys/mman.h: MAP_ANON */ -#include "alloc_arena.h" - -#include "alloc_impl.h" -#include "internal/once.h" -#include "sal/macros.h" -#include "osl/diagnose.h" - -#include <string.h> -#include <stdio.h> - -/* ================================================================= * - * - * arena internals. - * - * ================================================================= */ - -/** g_arena_list - * @internal - */ -struct rtl_arena_list_st -{ - rtl_memory_lock_type m_lock; - rtl_arena_type m_arena_head; -}; - -static struct rtl_arena_list_st g_arena_list; - - -/** gp_arena_arena - * provided for arena_type allocations, and hash_table resizing. - * - * @internal - */ -static rtl_arena_type * gp_arena_arena = 0; - - -/** gp_machdep_arena - * - * Low level virtual memory (pseudo) arena - * (platform dependent implementation) - * - * @internal - */ -static rtl_arena_type * gp_machdep_arena = 0; - - -static void * -SAL_CALL rtl_machdep_alloc ( - rtl_arena_type * pArena, - sal_Size * pSize -); - -static void -SAL_CALL rtl_machdep_free ( - rtl_arena_type * pArena, - void * pAddr, - sal_Size nSize -); - -static sal_Size -rtl_machdep_pagesize (void); - - -/** gp_default_arena - */ -rtl_arena_type * gp_default_arena = 0; - - -/* ================================================================= */ - -/** rtl_arena_segment_constructor() - */ -static int -rtl_arena_segment_constructor (void * obj) -{ - rtl_arena_segment_type * segment = (rtl_arena_segment_type*)(obj); - - QUEUE_START_NAMED(segment, s); - QUEUE_START_NAMED(segment, f); - - return (1); -} - - -/** rtl_arena_segment_destructor() - */ -static void -rtl_arena_segment_destructor (void * obj) -{ -#if OSL_DEBUG_LEVEL == 0 - (void) obj; /* unused */ -#else /* OSL_DEBUG_LEVEL */ - rtl_arena_segment_type * segment = (rtl_arena_segment_type*)(obj); - - OSL_ASSERT(QUEUE_STARTED_NAMED(segment, s)); - OSL_ASSERT(QUEUE_STARTED_NAMED(segment, f)); -#endif /* OSL_DEBUG_LEVEL */ -} - -/* ================================================================= */ - -/** rtl_arena_segment_populate() - * - * @precond arena->m_lock acquired. - */ -static int -rtl_arena_segment_populate ( - rtl_arena_type * arena -) -{ - rtl_arena_segment_type *span; - sal_Size size = rtl_machdep_pagesize(); - - span = rtl_machdep_alloc(gp_machdep_arena, &size); - if (span != 0) - { - rtl_arena_segment_type *first, *last, *head; - sal_Size count = size / sizeof(rtl_arena_segment_type); - - /* insert onto reserve span list */ - QUEUE_INSERT_TAIL_NAMED(&(arena->m_segment_reserve_span_head), span, s); - QUEUE_START_NAMED(span, f); - span->m_addr = (sal_uIntPtr)(span); - span->m_size = size; - span->m_type = RTL_ARENA_SEGMENT_TYPE_SPAN; - - /* insert onto reserve list */ - head = &(arena->m_segment_reserve_head); - for (first = span + 1, last = span + count; first < last; ++first) - { - QUEUE_INSERT_TAIL_NAMED(head, first, s); - QUEUE_START_NAMED(first, f); - first->m_addr = 0; - first->m_size = 0; - first->m_type = 0; - } - } - return (span != 0); -} - - -/** rtl_arena_segment_get() - * - * @precond arena->m_lock acquired. - * @precond (*ppSegment == 0) - */ -static RTL_MEMORY_INLINE void -rtl_arena_segment_get ( - rtl_arena_type * arena, - rtl_arena_segment_type ** ppSegment -) -{ - rtl_arena_segment_type * head; - - OSL_ASSERT(*ppSegment == 0); - - head = &(arena->m_segment_reserve_head); - if ((head->m_snext != head) || rtl_arena_segment_populate (arena)) - { - (*ppSegment) = head->m_snext; - QUEUE_REMOVE_NAMED((*ppSegment), s); - } -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_arena_segment_get) -#endif - - -/** rtl_arena_segment_put() - * - * @precond arena->m_lock acquired. - * @postcond (*ppSegment == 0) - */ -static RTL_MEMORY_INLINE void -rtl_arena_segment_put ( - rtl_arena_type * arena, - rtl_arena_segment_type ** ppSegment -) -{ - rtl_arena_segment_type * head; - - OSL_ASSERT(QUEUE_STARTED_NAMED((*ppSegment), s)); - OSL_ASSERT(QUEUE_STARTED_NAMED((*ppSegment), f)); - - (*ppSegment)->m_addr = 0; - (*ppSegment)->m_size = 0; - - OSL_ASSERT((*ppSegment)->m_type != RTL_ARENA_SEGMENT_TYPE_HEAD); - (*ppSegment)->m_type = 0; - - /* keep as reserve */ - head = &(arena->m_segment_reserve_head); - QUEUE_INSERT_HEAD_NAMED(head, (*ppSegment), s); - - /* clear */ - (*ppSegment) = 0; -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_arena_segment_put) -#endif - -/* ================================================================= */ - -/** rtl_arena_freelist_insert() - * - * @precond arena->m_lock acquired. - */ -static RTL_MEMORY_INLINE void -rtl_arena_freelist_insert ( - rtl_arena_type * arena, - rtl_arena_segment_type * segment -) -{ - rtl_arena_segment_type * head; - - head = &(arena->m_freelist_head[highbit(segment->m_size) - 1]); - QUEUE_INSERT_TAIL_NAMED(head, segment, f); - - arena->m_freelist_bitmap |= head->m_size; -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_arena_freelist_insert) -#endif /* __SUNPRO_C */ - - -/** rtl_arena_freelist_remove() - * - * @precond arena->m_lock acquired. - */ -static RTL_MEMORY_INLINE void -rtl_arena_freelist_remove ( - rtl_arena_type * arena, - rtl_arena_segment_type * segment -) -{ - if ((segment->m_fnext->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD) && - (segment->m_fprev->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD) ) - { - rtl_arena_segment_type * head; - - head = segment->m_fprev; - OSL_ASSERT(arena->m_freelist_bitmap & head->m_size); - arena->m_freelist_bitmap ^= head->m_size; - } - QUEUE_REMOVE_NAMED(segment, f); -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_arena_freelist_remove) -#endif /* __SUNPRO_C */ - - -/* ================================================================= */ - -/** RTL_ARENA_HASH_INDEX() - */ -#define RTL_ARENA_HASH_INDEX_IMPL(a, s, q, m) \ - ((((a) + ((a) >> (s)) + ((a) >> ((s) << 1))) >> (q)) & (m)) - -#define RTL_ARENA_HASH_INDEX(arena, addr) \ - RTL_ARENA_HASH_INDEX_IMPL((addr), (arena)->m_hash_shift, (arena)->m_quantum_shift, ((arena)->m_hash_size - 1)) - -/** rtl_arena_hash_rescale() - * - * @precond arena->m_lock released. - */ -static void -rtl_arena_hash_rescale ( - rtl_arena_type * arena, - sal_Size new_size -) -{ - rtl_arena_segment_type ** new_table; - sal_Size new_bytes; - - new_bytes = new_size * sizeof(rtl_arena_segment_type*); - new_table = (rtl_arena_segment_type **)rtl_arena_alloc (gp_arena_arena, &new_bytes); - - if (new_table != 0) - { - rtl_arena_segment_type ** old_table; - sal_Size old_size, i; - - memset (new_table, 0, new_bytes); - - RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock)); - - old_table = arena->m_hash_table; - old_size = arena->m_hash_size; - - OSL_TRACE( - "rtl_arena_hash_rescale(\"%s\"): " - "nseg: %"PRIu64" (ave: %"PRIu64"), frees: %"PRIu64" " - "[old_size: %lu, new_size: %lu]", - arena->m_name, - arena->m_stats.m_alloc - arena->m_stats.m_free, - (arena->m_stats.m_alloc - arena->m_stats.m_free) >> arena->m_hash_shift, - arena->m_stats.m_free, - old_size, new_size - ); - - arena->m_hash_table = new_table; - arena->m_hash_size = new_size; - arena->m_hash_shift = highbit(arena->m_hash_size) - 1; - - for (i = 0; i < old_size; i++) - { - rtl_arena_segment_type * curr = old_table[i]; - while (curr != 0) - { - rtl_arena_segment_type * next = curr->m_fnext; - rtl_arena_segment_type ** head; - - head = &(arena->m_hash_table[RTL_ARENA_HASH_INDEX(arena, curr->m_addr)]); - curr->m_fnext = (*head); - (*head) = curr; - - curr = next; - } - old_table[i] = 0; - } - - RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock)); - - if (old_table != arena->m_hash_table_0) - { - sal_Size old_bytes = old_size * sizeof(rtl_arena_segment_type*); - rtl_arena_free (gp_arena_arena, old_table, old_bytes); - } - } -} - - -/** rtl_arena_hash_insert() - * ...and update stats. - */ -static RTL_MEMORY_INLINE void -rtl_arena_hash_insert ( - rtl_arena_type * arena, - rtl_arena_segment_type * segment -) -{ - rtl_arena_segment_type ** ppSegment; - - ppSegment = &(arena->m_hash_table[RTL_ARENA_HASH_INDEX(arena, segment->m_addr)]); - - segment->m_fnext = (*ppSegment); - (*ppSegment) = segment; - - arena->m_stats.m_alloc += 1; - arena->m_stats.m_mem_alloc += segment->m_size; -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_arena_hash_insert) -#endif /* __SUNPRO_C */ - - -/** rtl_arena_hash_remove() - * ...and update stats. - */ -static rtl_arena_segment_type * -rtl_arena_hash_remove ( - rtl_arena_type * arena, - sal_uIntPtr addr, - sal_Size size -) -{ - rtl_arena_segment_type *segment, **segpp; - sal_Size lookups = 0; - -#if OSL_DEBUG_LEVEL == 0 - (void) size; /* unused */ -#endif /* OSL_DEBUG_LEVEL */ - - segpp = &(arena->m_hash_table[RTL_ARENA_HASH_INDEX(arena, addr)]); - while ((segment = *segpp) != 0) - { - if (segment->m_addr == addr) - { - *segpp = segment->m_fnext, segment->m_fnext = segment->m_fprev = segment; - break; - } - - /* update lookup miss stats */ - lookups += 1; - segpp = &(segment->m_fnext); - } - - OSL_POSTCOND(segment != 0, "rtl_arena_hash_remove(): bad free."); - if (segment != 0) - { - OSL_POSTCOND(segment->m_size == size, "rtl_arena_hash_remove(): wrong size."); - - arena->m_stats.m_free += 1; - arena->m_stats.m_mem_alloc -= segment->m_size; - - if (lookups > 1) - { - sal_Size nseg = (sal_Size)(arena->m_stats.m_alloc - arena->m_stats.m_free); - if (nseg > 4 * arena->m_hash_size) - { - if (!(arena->m_flags & RTL_ARENA_FLAG_RESCALE)) - { - sal_Size ave = nseg >> arena->m_hash_shift; - sal_Size new_size = arena->m_hash_size << (highbit(ave) - 1); - - arena->m_flags |= RTL_ARENA_FLAG_RESCALE; - RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock)); - rtl_arena_hash_rescale (arena, new_size); - RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock)); - arena->m_flags &= ~RTL_ARENA_FLAG_RESCALE; - } - } - } - } - - return (segment); -} - -/* ================================================================= */ - -/** rtl_arena_segment_alloc() - * allocate (and remove) segment from freelist - * - * @precond arena->m_lock acquired - * @precond (*ppSegment == 0) - */ -static int -rtl_arena_segment_alloc ( - rtl_arena_type * arena, - sal_Size size, - rtl_arena_segment_type ** ppSegment -) -{ - int index = 0; - - OSL_ASSERT(*ppSegment == 0); - if (!RTL_MEMORY_ISP2(size)) - { - int msb = highbit(size); - if (RTL_ARENA_FREELIST_SIZE == SAL_INT_CAST(size_t, msb)) - { - /* highest possible freelist: fall back to first fit */ - rtl_arena_segment_type *head, *segment; - - head = &(arena->m_freelist_head[msb - 1]); - for (segment = head->m_fnext; segment != head; segment = segment->m_fnext) - { - if (segment->m_size >= size) - { - /* allocate first fit segment */ - (*ppSegment) = segment; - break; - } - } - goto dequeue_and_leave; - } - - /* roundup to next power of 2 */ - size = (1UL << msb); - } - - index = lowbit(RTL_MEMORY_P2ALIGN(arena->m_freelist_bitmap, size)); - if (index > 0) - { - /* instant fit: allocate first free segment */ - rtl_arena_segment_type *head; - - head = &(arena->m_freelist_head[index - 1]); - (*ppSegment) = head->m_fnext; - OSL_ASSERT((*ppSegment) != head); - } - -dequeue_and_leave: - if (*ppSegment != 0) - { - /* remove from freelist */ - rtl_arena_freelist_remove (arena, (*ppSegment)); - } - return (*ppSegment != 0); -} - - -/** rtl_arena_segment_create() - * import new (span) segment from source arena - * - * @precond arena->m_lock acquired - * @precond (*ppSegment == 0) - */ -static int -rtl_arena_segment_create ( - rtl_arena_type * arena, - sal_Size size, - rtl_arena_segment_type ** ppSegment -) -{ - OSL_ASSERT((*ppSegment) == 0); - if (arena->m_source_alloc != 0) - { - rtl_arena_segment_get (arena, ppSegment); - if (*ppSegment != 0) - { - rtl_arena_segment_type * span = 0; - rtl_arena_segment_get (arena, &span); - if (span != 0) - { - /* import new span from source arena */ - RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock)); - - span->m_size = size; - span->m_addr = (sal_uIntPtr)(arena->m_source_alloc)( - arena->m_source_arena, &(span->m_size)); - - RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock)); - if (span->m_addr != 0) - { - /* insert onto segment list, update stats */ - span->m_type = RTL_ARENA_SEGMENT_TYPE_SPAN; - QUEUE_INSERT_HEAD_NAMED(&(arena->m_segment_head), span, s); - arena->m_stats.m_mem_total += span->m_size; - - (*ppSegment)->m_addr = span->m_addr; - (*ppSegment)->m_size = span->m_size; - (*ppSegment)->m_type = RTL_ARENA_SEGMENT_TYPE_FREE; - QUEUE_INSERT_HEAD_NAMED(span, (*ppSegment), s); - - /* report success */ - return (1); - } - rtl_arena_segment_put (arena, &span); - } - rtl_arena_segment_put (arena, ppSegment); - } - } - return (0); -} - - -/** rtl_arena_segment_coalesce() - * mark as free and join with adjacent free segment(s) - * - * @precond arena->m_lock acquired - * @precond segment marked 'used' - */ -static void -rtl_arena_segment_coalesce ( - rtl_arena_type * arena, - rtl_arena_segment_type * segment -) -{ - rtl_arena_segment_type *next, *prev; - - /* mark segment free */ - OSL_ASSERT(segment->m_type == RTL_ARENA_SEGMENT_TYPE_USED); - segment->m_type = RTL_ARENA_SEGMENT_TYPE_FREE; - - /* try to merge w/ next segment */ - next = segment->m_snext; - if (next->m_type == RTL_ARENA_SEGMENT_TYPE_FREE) - { - OSL_ASSERT(segment->m_addr + segment->m_size == next->m_addr); - segment->m_size += next->m_size; - - /* remove from freelist */ - rtl_arena_freelist_remove (arena, next); - - /* remove from segment list */ - QUEUE_REMOVE_NAMED(next, s); - - /* release segment descriptor */ - rtl_arena_segment_put (arena, &next); - } - - /* try to merge w/ prev segment */ - prev = segment->m_sprev; - if (prev->m_type == RTL_ARENA_SEGMENT_TYPE_FREE) - { - OSL_ASSERT(prev->m_addr + prev->m_size == segment->m_addr); - segment->m_addr = prev->m_addr; - segment->m_size += prev->m_size; - - /* remove from freelist */ - rtl_arena_freelist_remove (arena, prev); - - /* remove from segment list */ - QUEUE_REMOVE_NAMED(prev, s); - - /* release segment descriptor */ - rtl_arena_segment_put (arena, &prev); - } -} - -/* ================================================================= */ - -/** rtl_arena_constructor() - */ -static void -rtl_arena_constructor (void * obj) -{ - rtl_arena_type * arena = (rtl_arena_type*)(obj); - rtl_arena_segment_type * head; - size_t i; - - memset (arena, 0, sizeof(rtl_arena_type)); - - QUEUE_START_NAMED(arena, arena_); - - (void) RTL_MEMORY_LOCK_INIT(&(arena->m_lock)); - - head = &(arena->m_segment_reserve_span_head); - rtl_arena_segment_constructor (head); - head->m_type = RTL_ARENA_SEGMENT_TYPE_HEAD; - - head = &(arena->m_segment_reserve_head); - rtl_arena_segment_constructor (head); - head->m_type = RTL_ARENA_SEGMENT_TYPE_HEAD; - - head = &(arena->m_segment_head); - rtl_arena_segment_constructor (head); - head->m_type = RTL_ARENA_SEGMENT_TYPE_HEAD; - - for (i = 0; i < RTL_ARENA_FREELIST_SIZE; i++) - { - head = &(arena->m_freelist_head[i]); - rtl_arena_segment_constructor (head); - - head->m_size = (1UL << i); - head->m_type = RTL_ARENA_SEGMENT_TYPE_HEAD; - } - - arena->m_hash_table = arena->m_hash_table_0; - arena->m_hash_size = RTL_ARENA_HASH_SIZE; - arena->m_hash_shift = highbit(arena->m_hash_size) - 1; -} - - -/** rtl_arena_destructor() - */ -static void -rtl_arena_destructor (void * obj) -{ - rtl_arena_type * arena = (rtl_arena_type*)(obj); - rtl_arena_segment_type * head; - size_t i; - - OSL_ASSERT(QUEUE_STARTED_NAMED(arena, arena_)); - - RTL_MEMORY_LOCK_DESTROY(&(arena->m_lock)); - - head = &(arena->m_segment_reserve_span_head); - OSL_ASSERT(head->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD); - rtl_arena_segment_destructor (head); - - head = &(arena->m_segment_reserve_head); - OSL_ASSERT(head->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD); - rtl_arena_segment_destructor (head); - - head = &(arena->m_segment_head); - OSL_ASSERT(head->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD); - rtl_arena_segment_destructor (head); - - for (i = 0; i < RTL_ARENA_FREELIST_SIZE; i++) - { - head = &(arena->m_freelist_head[i]); - - OSL_ASSERT(head->m_size == (1UL << i)); - OSL_ASSERT(head->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD); - - rtl_arena_segment_destructor (head); - } - - OSL_ASSERT(arena->m_hash_table == arena->m_hash_table_0); - OSL_ASSERT(arena->m_hash_size == RTL_ARENA_HASH_SIZE); - OSL_ASSERT( - arena->m_hash_shift == - SAL_INT_CAST(unsigned, highbit(arena->m_hash_size) - 1)); -} - -/* ================================================================= */ - -/** rtl_arena_activate() - */ -static rtl_arena_type * -rtl_arena_activate ( - rtl_arena_type * arena, - const char * name, - sal_Size quantum, - sal_Size quantum_cache_max, - rtl_arena_type * source_arena, - void * (SAL_CALL * source_alloc)(rtl_arena_type *, sal_Size *), - void (SAL_CALL * source_free) (rtl_arena_type *, void *, sal_Size) -) -{ - OSL_ASSERT(arena != 0); - if (arena != 0) - { - (void) snprintf (arena->m_name, sizeof(arena->m_name), "%s", name); - - if (!RTL_MEMORY_ISP2(quantum)) - { - /* roundup to next power of 2 */ - quantum = (1UL << highbit(quantum)); - } - quantum_cache_max = RTL_MEMORY_P2ROUNDUP(quantum_cache_max, quantum); - - arena->m_quantum = quantum; - arena->m_quantum_shift = highbit(arena->m_quantum) - 1; - arena->m_qcache_max = quantum_cache_max; - - arena->m_source_arena = source_arena; - arena->m_source_alloc = source_alloc; - arena->m_source_free = source_free; - - if (arena->m_qcache_max > 0) - { - char name[RTL_ARENA_NAME_LENGTH + 1]; - int i, n = (arena->m_qcache_max >> arena->m_quantum_shift); - - sal_Size size = n * sizeof(rtl_cache_type*); - arena->m_qcache_ptr = (rtl_cache_type**)rtl_arena_alloc (gp_arena_arena, &size); - if (!(arena->m_qcache_ptr)) - { - /* out of memory */ - return (0); - } - for (i = 1; i <= n; i++) - { - size = i * arena->m_quantum; - (void) snprintf (name, sizeof(name), "%s_%lu", arena->m_name, size); - arena->m_qcache_ptr[i - 1] = rtl_cache_create(name, size, 0, NULL, NULL, NULL, NULL, arena, RTL_CACHE_FLAG_QUANTUMCACHE); - } - } - - /* insert into arena list */ - RTL_MEMORY_LOCK_ACQUIRE(&(g_arena_list.m_lock)); - QUEUE_INSERT_TAIL_NAMED(&(g_arena_list.m_arena_head), arena, arena_); - RTL_MEMORY_LOCK_RELEASE(&(g_arena_list.m_lock)); - } - return (arena); -} - -/** rtl_arena_deactivate() - */ -static void -rtl_arena_deactivate ( - rtl_arena_type * arena -) -{ - rtl_arena_segment_type * head, * segment; - - /* remove from arena list */ - RTL_MEMORY_LOCK_ACQUIRE(&(g_arena_list.m_lock)); - QUEUE_REMOVE_NAMED(arena, arena_); - RTL_MEMORY_LOCK_RELEASE(&(g_arena_list.m_lock)); - - /* cleanup quantum cache(s) */ - if ((arena->m_qcache_max > 0) && (arena->m_qcache_ptr != 0)) - { - int i, n = (arena->m_qcache_max >> arena->m_quantum_shift); - for (i = 1; i <= n; i++) - { - if (arena->m_qcache_ptr[i - 1] != 0) - { - rtl_cache_destroy (arena->m_qcache_ptr[i - 1]); - arena->m_qcache_ptr[i - 1] = 0; - } - } - rtl_arena_free ( - gp_arena_arena, - arena->m_qcache_ptr, - n * sizeof(rtl_cache_type*)); - - arena->m_qcache_ptr = 0; - } - - /* check for leaked segments */ - OSL_TRACE( - "rtl_arena_deactivate(\"%s\"): " - "allocs: %"PRIu64", frees: %"PRIu64"; total: %lu, used: %lu", - arena->m_name, - arena->m_stats.m_alloc, arena->m_stats.m_free, - arena->m_stats.m_mem_total, arena->m_stats.m_mem_alloc - ); - if (arena->m_stats.m_alloc > arena->m_stats.m_free) - { - sal_Size i, n; - - OSL_TRACE( - "rtl_arena_deactivate(\"%s\"): " - "cleaning up %"PRIu64" leaked segment(s) [%lu bytes]", - arena->m_name, - arena->m_stats.m_alloc - arena->m_stats.m_free, - arena->m_stats.m_mem_alloc - ); - - /* cleanup still used segment(s) */ - for (i = 0, n = arena->m_hash_size; i < n; i++) - { - while ((segment = arena->m_hash_table[i]) != 0) - { - /* pop from hash table */ - arena->m_hash_table[i] = segment->m_fnext, segment->m_fnext = segment->m_fprev = segment; - - /* coalesce w/ adjacent free segment(s) */ - rtl_arena_segment_coalesce (arena, segment); - - /* insert onto freelist */ - rtl_arena_freelist_insert (arena, segment); - } - } - } - - /* cleanup hash table */ - if (arena->m_hash_table != arena->m_hash_table_0) - { - rtl_arena_free ( - gp_arena_arena, - arena->m_hash_table, - arena->m_hash_size * sizeof(rtl_arena_segment_type*)); - - arena->m_hash_table = arena->m_hash_table_0; - arena->m_hash_size = RTL_ARENA_HASH_SIZE; - arena->m_hash_shift = highbit(arena->m_hash_size) - 1; - } - - /* cleanup segment list */ - head = &(arena->m_segment_head); - for (segment = head->m_snext; segment != head; segment = head->m_snext) - { - if (segment->m_type == RTL_ARENA_SEGMENT_TYPE_FREE) - { - /* remove from freelist */ - rtl_arena_freelist_remove (arena, segment); - } - else - { - /* can have only free and span segments here */ - OSL_ASSERT(segment->m_type == RTL_ARENA_SEGMENT_TYPE_SPAN); - } - - /* remove from segment list */ - QUEUE_REMOVE_NAMED(segment, s); - - /* release segment descriptor */ - rtl_arena_segment_put (arena, &segment); - } - - /* cleanup segment reserve list */ - head = &(arena->m_segment_reserve_head); - for (segment = head->m_snext; segment != head; segment = head->m_snext) - { - /* remove from segment list */ - QUEUE_REMOVE_NAMED(segment, s); - } - - /* cleanup segment reserve span(s) */ - head = &(arena->m_segment_reserve_span_head); - for (segment = head->m_snext; segment != head; segment = head->m_snext) - { - /* can have only span segments here */ - OSL_ASSERT(segment->m_type == RTL_ARENA_SEGMENT_TYPE_SPAN); - - /* remove from segment list */ - QUEUE_REMOVE_NAMED(segment, s); - - /* return span to g_machdep_arena */ - rtl_machdep_free (gp_machdep_arena, (void*)(segment->m_addr), segment->m_size); - } -} - -/* ================================================================= * - * - * arena implementation. - * - * ================================================================= */ - -extern void ensureArenaSingleton(); - -/** rtl_arena_create() - */ -rtl_arena_type * -SAL_CALL rtl_arena_create ( - const char * name, - sal_Size quantum, - sal_Size quantum_cache_max, - rtl_arena_type * source_arena, - void * (SAL_CALL * source_alloc)(rtl_arena_type *, sal_Size *), - void (SAL_CALL * source_free) (rtl_arena_type *, void *, sal_Size), - int flags -) SAL_THROW_EXTERN_C() -{ - rtl_arena_type * result = 0; - sal_Size size = sizeof(rtl_arena_type); - - (void) flags; /* unused */ - -try_alloc: - result = (rtl_arena_type*)rtl_arena_alloc (gp_arena_arena, &size); - if (result != 0) - { - rtl_arena_type * arena = result; - VALGRIND_CREATE_MEMPOOL(arena, 0, 0); - rtl_arena_constructor (arena); - - if (!source_arena) - { - OSL_ASSERT(gp_default_arena != 0); - source_arena = gp_default_arena; - } - - result = rtl_arena_activate ( - arena, - name, - quantum, - quantum_cache_max, - source_arena, - source_alloc, - source_free - ); - - if (result == 0) - { - rtl_arena_deactivate (arena); - rtl_arena_destructor (arena); - VALGRIND_DESTROY_MEMPOOL(arena); - rtl_arena_free (gp_arena_arena, arena, size); - } - } - else if (gp_arena_arena == 0) - { - ensureArenaSingleton(); - if (gp_arena_arena) - { - /* try again */ - goto try_alloc; - } - } - return (result); -} - -/** rtl_arena_destroy() - */ -void -SAL_CALL rtl_arena_destroy ( - rtl_arena_type * arena -) -{ - if (arena != 0) - { - rtl_arena_deactivate (arena); - rtl_arena_destructor (arena); - VALGRIND_DESTROY_MEMPOOL(arena); - rtl_arena_free (gp_arena_arena, arena, sizeof(rtl_arena_type)); - } -} - -/** rtl_arena_alloc() - */ -void * -SAL_CALL rtl_arena_alloc ( - rtl_arena_type * arena, - sal_Size * pSize -) SAL_THROW_EXTERN_C() -{ - void * addr = 0; - - if ((arena != 0) && (pSize != 0)) - { - sal_Size size = RTL_MEMORY_ALIGN((*pSize), arena->m_quantum); - if (size > arena->m_qcache_max) - { - /* allocate from segment list */ - rtl_arena_segment_type *segment = 0; - - RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock)); - if (rtl_arena_segment_alloc (arena, size, &segment) || - rtl_arena_segment_create(arena, size, &segment) ) - { - /* shrink to fit */ - sal_Size oversize; - - /* mark segment used */ - OSL_ASSERT(segment->m_type == RTL_ARENA_SEGMENT_TYPE_FREE); - segment->m_type = RTL_ARENA_SEGMENT_TYPE_USED; - - /* resize */ - OSL_ASSERT(segment->m_size >= size); - oversize = segment->m_size - size; - if (oversize >= SAL_MAX(arena->m_quantum, arena->m_qcache_max)) - { - rtl_arena_segment_type * remainder = 0; - rtl_arena_segment_get (arena, &remainder); - if (remainder != 0) - { - segment->m_size = size; - - remainder->m_addr = segment->m_addr + segment->m_size; - remainder->m_size = oversize; - remainder->m_type = RTL_ARENA_SEGMENT_TYPE_FREE; - QUEUE_INSERT_HEAD_NAMED(segment, remainder, s); - - rtl_arena_freelist_insert (arena, remainder); - } - } - - rtl_arena_hash_insert (arena, segment); - - /* DEBUG ONLY: mark allocated, undefined */ - OSL_DEBUG_ONLY(memset((void*)(segment->m_addr), 0x77777777, segment->m_size)); - VALGRIND_MEMPOOL_ALLOC(arena, segment->m_addr, segment->m_size); - - (*pSize) = segment->m_size; - addr = (void*)(segment->m_addr); - } - RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock)); - } - else if (size > 0) - { - /* allocate from quantum cache(s) */ - int index = (size >> arena->m_quantum_shift) - 1; - OSL_ASSERT (arena->m_qcache_ptr[index] != 0); - - addr = rtl_cache_alloc (arena->m_qcache_ptr[index]); - if (addr != 0) - (*pSize) = size; - } - } - return (addr); -} - -/** rtl_arena_free() - */ -void -SAL_CALL rtl_arena_free ( - rtl_arena_type * arena, - void * addr, - sal_Size size -) SAL_THROW_EXTERN_C() -{ - if (arena != 0) - { - size = RTL_MEMORY_ALIGN(size, arena->m_quantum); - if (size > arena->m_qcache_max) - { - /* free to segment list */ - rtl_arena_segment_type * segment; - - RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock)); - - segment = rtl_arena_hash_remove (arena, (sal_uIntPtr)(addr), size); - if (segment != 0) - { - rtl_arena_segment_type *next, *prev; - - /* DEBUG ONLY: mark unallocated, undefined */ - VALGRIND_MEMPOOL_FREE(arena, segment->m_addr); - /* OSL_DEBUG_ONLY() */ VALGRIND_MAKE_MEM_UNDEFINED(segment->m_addr, segment->m_size); - OSL_DEBUG_ONLY(memset((void*)(segment->m_addr), 0x33333333, segment->m_size)); - - /* coalesce w/ adjacent free segment(s) */ - rtl_arena_segment_coalesce (arena, segment); - - /* determine (new) next and prev segment */ - next = segment->m_snext, prev = segment->m_sprev; - - /* entire span free when prev is a span, and next is either a span or a list head */ - if (((prev->m_type == RTL_ARENA_SEGMENT_TYPE_SPAN)) && - ((next->m_type == RTL_ARENA_SEGMENT_TYPE_SPAN) || - (next->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD)) ) - { - OSL_ASSERT((prev->m_addr == segment->m_addr) && - (prev->m_size == segment->m_size) ); - - if (arena->m_source_free) - { - addr = (void*)(prev->m_addr); - size = prev->m_size; - - /* remove from segment list */ - QUEUE_REMOVE_NAMED(segment, s); - - /* release segment descriptor */ - rtl_arena_segment_put (arena, &segment); - - /* remove from segment list */ - QUEUE_REMOVE_NAMED(prev, s); - - /* release (span) segment descriptor */ - rtl_arena_segment_put (arena, &prev); - - /* update stats, return span to source arena */ - arena->m_stats.m_mem_total -= size; - RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock)); - - (arena->m_source_free)(arena->m_source_arena, addr, size); - return; - } - } - - /* insert onto freelist */ - rtl_arena_freelist_insert (arena, segment); - } - - RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock)); - } - else if (size > 0) - { - /* free to quantum cache(s) */ - int index = (size >> arena->m_quantum_shift) - 1; - OSL_ASSERT (arena->m_qcache_ptr[index] != 0); - - rtl_cache_free (arena->m_qcache_ptr[index], addr); - } - } -} - -/* ================================================================= * - * - * machdep internals. - * - * ================================================================= */ - -#if defined(SAL_UNX) -#include <sys/mman.h> -#elif defined(SAL_W32) -#define MAP_FAILED 0 -#endif /* SAL_UNX || SAL_W32 */ - -/** rtl_machdep_alloc() - */ -static void * -SAL_CALL rtl_machdep_alloc ( - rtl_arena_type * pArena, - sal_Size * pSize -) -{ - void * addr; - sal_Size size = (*pSize); - - OSL_PRECOND(pArena == gp_machdep_arena, "rtl_machdep_alloc(): invalid argument"); - -#if defined(SOLARIS) && defined(SPARC) - /* see @ mmap(2) man pages */ - size += (pArena->m_quantum + pArena->m_quantum); /* "red-zone" pages */ - if (size > (4 << 20)) - size = RTL_MEMORY_P2ROUNDUP(size, (4 << 20)); - else if (size > (512 << 10)) - size = RTL_MEMORY_P2ROUNDUP(size, (512 << 10)); - else - size = RTL_MEMORY_P2ROUNDUP(size, (64 << 10)); - size -= (pArena->m_quantum + pArena->m_quantum); /* "red-zone" pages */ -#else - /* default allocation granularity */ - size = RTL_MEMORY_P2ROUNDUP(size, SAL_MAX(pArena->m_quantum, 64 << 10)); -#endif - -#if defined(SAL_UNX) - addr = mmap (NULL, (size_t)(size), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); -#elif defined(SAL_W32) - addr = VirtualAlloc (NULL, (SIZE_T)(size), MEM_COMMIT, PAGE_READWRITE); -#endif /* (SAL_UNX || SAL_W32) */ - - if (addr != MAP_FAILED) - { - pArena->m_stats.m_alloc += 1; - pArena->m_stats.m_mem_total += size; - pArena->m_stats.m_mem_alloc += size; - - (*pSize) = size; - return (addr); - } - return (NULL); -} - -/** rtl_machdep_free() - */ -static void -SAL_CALL rtl_machdep_free ( - rtl_arena_type * pArena, - void * pAddr, - sal_Size nSize -) -{ - OSL_PRECOND(pArena == gp_machdep_arena, "rtl_machdep_free(): invalid argument"); - - pArena->m_stats.m_free += 1; - pArena->m_stats.m_mem_total -= nSize; - pArena->m_stats.m_mem_alloc -= nSize; - -#if defined(SAL_UNX) - (void) munmap(pAddr, nSize); -#elif defined(SAL_W32) - (void) VirtualFree ((LPVOID)(pAddr), (SIZE_T)(0), MEM_RELEASE); -#endif /* (SAL_UNX || SAL_W32) */ -} - -/** rtl_machdep_pagesize() - */ -static sal_Size -rtl_machdep_pagesize (void) -{ -#if defined(SAL_UNX) -#if defined(FREEBSD) || defined(NETBSD) || defined(DRAGONFLY) - return ((sal_Size)getpagesize()); -#else /* POSIX */ - return ((sal_Size)sysconf(_SC_PAGESIZE)); -#endif /* xBSD || POSIX */ -#elif defined(SAL_W32) - SYSTEM_INFO info; - GetSystemInfo (&info); - return ((sal_Size)(info.dwPageSize)); -#endif /* (SAL_UNX || SAL_W32) */ -} - -/* ================================================================= * - * - * arena initialization. - * - * ================================================================= */ - -void -rtl_arena_init (void) -{ - { - /* list of arenas */ - RTL_MEMORY_LOCK_INIT(&(g_arena_list.m_lock)); - rtl_arena_constructor (&(g_arena_list.m_arena_head)); - } - { - /* machdep (pseudo) arena */ - static rtl_arena_type g_machdep_arena; - - OSL_ASSERT(gp_machdep_arena == 0); - VALGRIND_CREATE_MEMPOOL(&g_machdep_arena, 0, 0); - rtl_arena_constructor (&g_machdep_arena); - - gp_machdep_arena = rtl_arena_activate ( - &g_machdep_arena, - "rtl_machdep_arena", - rtl_machdep_pagesize(), - 0, /* no quantum caching */ - 0, 0, 0 /* no source */ - ); - OSL_ASSERT(gp_machdep_arena != 0); - } - { - /* default arena */ - static rtl_arena_type g_default_arena; - - OSL_ASSERT(gp_default_arena == 0); - VALGRIND_CREATE_MEMPOOL(&g_default_arena, 0, 0); - rtl_arena_constructor (&g_default_arena); - - gp_default_arena = rtl_arena_activate ( - &g_default_arena, - "rtl_default_arena", - rtl_machdep_pagesize(), - 0, /* no quantum caching */ - gp_machdep_arena, /* source */ - rtl_machdep_alloc, - rtl_machdep_free - ); - OSL_ASSERT(gp_default_arena != 0); - } - { - /* arena internal arena */ - static rtl_arena_type g_arena_arena; - - OSL_ASSERT(gp_arena_arena == 0); - VALGRIND_CREATE_MEMPOOL(&g_arena_arena, 0, 0); - rtl_arena_constructor (&g_arena_arena); - - gp_arena_arena = rtl_arena_activate ( - &g_arena_arena, - "rtl_arena_internal_arena", - 64, /* quantum */ - 0, /* no quantum caching */ - gp_default_arena, /* source */ - rtl_arena_alloc, - rtl_arena_free - ); - OSL_ASSERT(gp_arena_arena != 0); - } - OSL_TRACE("rtl_arena_init completed"); -} - -/* ================================================================= */ - -void -rtl_arena_fini (void) -{ - if (gp_arena_arena != 0) - { - rtl_arena_type * arena, * head; - - RTL_MEMORY_LOCK_ACQUIRE(&(g_arena_list.m_lock)); - head = &(g_arena_list.m_arena_head); - - for (arena = head->m_arena_next; arena != head; arena = arena->m_arena_next) - { - OSL_TRACE( - "rtl_arena_fini(\"%s\"): " - "allocs: %"PRIu64", frees: %"PRIu64"; total: %lu, used: %lu", - arena->m_name, - arena->m_stats.m_alloc, arena->m_stats.m_free, - arena->m_stats.m_mem_total, arena->m_stats.m_mem_alloc - ); - } - RTL_MEMORY_LOCK_RELEASE(&(g_arena_list.m_lock)); - } - OSL_TRACE("rtl_arena_fini completed"); -} - -/* ================================================================= */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/alloc_arena.h b/sal/rtl/source/alloc_arena.h deleted file mode 100644 index f06e8b5df..000000000 --- a/sal/rtl/source/alloc_arena.h +++ /dev/null @@ -1,140 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_RTL_ALLOC_ARENA_H -#define INCLUDED_RTL_ALLOC_ARENA_H - -#include "sal/types.h" -#include "rtl/alloc.h" -#include "alloc_impl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** rtl_arena_stat_type - * @internal - */ -typedef struct rtl_arena_stat_st rtl_arena_stat_type; -struct rtl_arena_stat_st -{ - sal_uInt64 m_alloc; - sal_uInt64 m_free; - - sal_Size m_mem_total; - sal_Size m_mem_alloc; -}; - - -/** rtl_arena_segment_type - * @internal - */ -#define RTL_ARENA_SEGMENT_TYPE_HEAD ((sal_Size)(0x01)) -#define RTL_ARENA_SEGMENT_TYPE_SPAN ((sal_Size)(0x02)) -#define RTL_ARENA_SEGMENT_TYPE_FREE ((sal_Size)(0x04)) -#define RTL_ARENA_SEGMENT_TYPE_USED ((sal_Size)(0x08)) - -typedef struct rtl_arena_segment_st rtl_arena_segment_type; -struct rtl_arena_segment_st -{ - /* segment list linkage */ - rtl_arena_segment_type * m_snext; - rtl_arena_segment_type * m_sprev; - - /* free/used list linkage */ - rtl_arena_segment_type * m_fnext; - rtl_arena_segment_type * m_fprev; - - /* segment description */ - sal_uIntPtr m_addr; - sal_Size m_size; - sal_Size m_type; -}; - - -/** rtl_arena_type - * @internal - */ -#define RTL_ARENA_FREELIST_SIZE (sizeof(void*) * 8) -#define RTL_ARENA_HASH_SIZE 64 - -#define RTL_ARENA_FLAG_RESCALE 1 /* within hash rescale operation */ - -struct rtl_arena_st -{ - /* linkage */ - rtl_arena_type * m_arena_next; - rtl_arena_type * m_arena_prev; - - /* properties */ - char m_name[RTL_ARENA_NAME_LENGTH + 1]; - long m_flags; - - rtl_memory_lock_type m_lock; - rtl_arena_stat_type m_stats; - - rtl_arena_type * m_source_arena; - void * (SAL_CALL * m_source_alloc)(rtl_arena_type *, sal_Size *); - void (SAL_CALL * m_source_free) (rtl_arena_type *, void *, sal_Size); - - sal_Size m_quantum; - sal_Size m_quantum_shift; /* log2(m_quantum) */ - - rtl_arena_segment_type m_segment_reserve_span_head; - rtl_arena_segment_type m_segment_reserve_head; - - rtl_arena_segment_type m_segment_head; - - rtl_arena_segment_type m_freelist_head[RTL_ARENA_FREELIST_SIZE]; - sal_Size m_freelist_bitmap; - - rtl_arena_segment_type ** m_hash_table; - rtl_arena_segment_type * m_hash_table_0[RTL_ARENA_HASH_SIZE]; - sal_Size m_hash_size; /* m_hash_mask + 1 */ - sal_Size m_hash_shift; /* log2(m_hash_size) */ - - sal_Size m_qcache_max; - rtl_cache_type ** m_qcache_ptr; -}; - - -/** gp_default_arena - * default arena with pagesize quantum - * - * @internal - */ -extern rtl_arena_type * gp_default_arena; - - -#ifdef __cplusplus -} -#endif - -#endif /* INCLUDED_RTL_ALLOC_ARENA_H */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/alloc_cache.c b/sal/rtl/source/alloc_cache.c deleted file mode 100644 index dfd86a39a..000000000 --- a/sal/rtl/source/alloc_cache.c +++ /dev/null @@ -1,1739 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "alloc_cache.h" -#include "alloc_impl.h" -#include "alloc_arena.h" -#include "internal/once.h" -#include "sal/macros.h" -#include "osl/diagnose.h" - -#ifndef INCLUDED_STRING_H -#include <string.h> -#endif - -#ifndef INCLUDED_STDIO_H -#include <stdio.h> -#endif - -/* ================================================================= * - * - * cache internals. - * - * ================================================================= */ - -/** g_cache_list - * @internal - */ -struct rtl_cache_list_st -{ - rtl_memory_lock_type m_lock; - rtl_cache_type m_cache_head; - -#if defined(SAL_UNX) - pthread_t m_update_thread; - pthread_cond_t m_update_cond; -#elif defined(SAL_W32) - HANDLE m_update_thread; - HANDLE m_update_cond; -#endif /* SAL_UNX || SAL_W32 */ - int m_update_done; -}; - -static struct rtl_cache_list_st g_cache_list; - - -/** gp_cache_arena - * provided for cache_type allocations, and hash_table resizing. - * - * @internal - */ -static rtl_arena_type * gp_cache_arena = 0; - - -/** gp_cache_magazine_cache - * @internal - */ -static rtl_cache_type * gp_cache_magazine_cache = 0; - - -/** gp_cache_slab_cache - * @internal - */ -static rtl_cache_type * gp_cache_slab_cache = 0; - - -/** gp_cache_bufctl_cache - * @internal - */ -static rtl_cache_type * gp_cache_bufctl_cache = 0; - - -/* ================================================================= */ - -/** RTL_CACHE_HASH_INDEX() - */ -#define RTL_CACHE_HASH_INDEX_IMPL(a, s, q, m) \ - ((((a) + ((a) >> (s)) + ((a) >> ((s) << 1))) >> (q)) & (m)) - -#define RTL_CACHE_HASH_INDEX(cache, addr) \ - RTL_CACHE_HASH_INDEX_IMPL((addr), (cache)->m_hash_shift, (cache)->m_type_shift, ((cache)->m_hash_size - 1)) - - -/** rtl_cache_hash_rescale() - */ -static void -rtl_cache_hash_rescale ( - rtl_cache_type * cache, - sal_Size new_size -) -{ - rtl_cache_bufctl_type ** new_table; - sal_Size new_bytes; - - new_bytes = new_size * sizeof(rtl_cache_bufctl_type*); - new_table = (rtl_cache_bufctl_type**)rtl_arena_alloc(gp_cache_arena, &new_bytes); - - if (new_table != 0) - { - rtl_cache_bufctl_type ** old_table; - sal_Size old_size, i; - - memset (new_table, 0, new_bytes); - - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock)); - - old_table = cache->m_hash_table; - old_size = cache->m_hash_size; - - OSL_TRACE( - "rtl_cache_hash_rescale(\"%s\"): " - "nbuf: % " PRIu64 " (ave: %" PRIu64 "), frees: %" PRIu64 " " - "[old_size: %lu, new_size: %lu]", - cache->m_name, - cache->m_slab_stats.m_alloc - cache->m_slab_stats.m_free, - (cache->m_slab_stats.m_alloc - cache->m_slab_stats.m_free) >> cache->m_hash_shift, - cache->m_slab_stats.m_free, - old_size, new_size); - - cache->m_hash_table = new_table; - cache->m_hash_size = new_size; - cache->m_hash_shift = highbit(cache->m_hash_size) - 1; - - for (i = 0; i < old_size; i++) - { - rtl_cache_bufctl_type * curr = old_table[i]; - while (curr != 0) - { - rtl_cache_bufctl_type * next = curr->m_next; - rtl_cache_bufctl_type ** head; - - head = &(cache->m_hash_table[RTL_CACHE_HASH_INDEX(cache, curr->m_addr)]); - curr->m_next = (*head); - (*head) = curr; - - curr = next; - } - old_table[i] = 0; - } - - RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock)); - - if (old_table != cache->m_hash_table_0) - { - sal_Size old_bytes = old_size * sizeof(rtl_cache_bufctl_type*); - rtl_arena_free (gp_cache_arena, old_table, old_bytes); - } - } -} - -/** rtl_cache_hash_insert() - */ -static RTL_MEMORY_INLINE sal_uIntPtr -rtl_cache_hash_insert ( - rtl_cache_type * cache, - rtl_cache_bufctl_type * bufctl -) -{ - rtl_cache_bufctl_type ** ppHead; - - ppHead = &(cache->m_hash_table[RTL_CACHE_HASH_INDEX(cache, bufctl->m_addr)]); - - bufctl->m_next = (*ppHead); - (*ppHead) = bufctl; - - return (bufctl->m_addr); -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_cache_hash_insert) -#endif /* __SUNPRO_C */ - - -/** rtl_cache_hash_remove() - */ -static rtl_cache_bufctl_type * -rtl_cache_hash_remove ( - rtl_cache_type * cache, - sal_uIntPtr addr -) -{ - rtl_cache_bufctl_type ** ppHead; - rtl_cache_bufctl_type * bufctl; - sal_Size lookups = 0; - - ppHead = &(cache->m_hash_table[RTL_CACHE_HASH_INDEX(cache, addr)]); - while ((bufctl = *ppHead) != 0) - { - if (bufctl->m_addr == addr) - { - *ppHead = bufctl->m_next, bufctl->m_next = 0; - break; - } - - lookups += 1; - ppHead = &(bufctl->m_next); - } - - OSL_ASSERT (bufctl != 0); /* bad free */ - - if (lookups > 1) - { - sal_Size nbuf = (sal_Size)(cache->m_slab_stats.m_alloc - cache->m_slab_stats.m_free); - if (nbuf > 4 * cache->m_hash_size) - { - if (!(cache->m_features & RTL_CACHE_FEATURE_RESCALE)) - { - sal_Size ave = nbuf >> cache->m_hash_shift; - sal_Size new_size = cache->m_hash_size << (highbit(ave) - 1); - - cache->m_features |= RTL_CACHE_FEATURE_RESCALE; - RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock)); - rtl_cache_hash_rescale (cache, new_size); - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock)); - cache->m_features &= ~RTL_CACHE_FEATURE_RESCALE; - } - } - } - - return (bufctl); -} - -/* ================================================================= */ - -/** RTL_CACHE_SLAB() - */ -#define RTL_CACHE_SLAB(addr, size) \ - (((rtl_cache_slab_type*)(RTL_MEMORY_P2END((sal_uIntPtr)(addr), (size)))) - 1) - - -/** rtl_cache_slab_constructor() - */ -static int -rtl_cache_slab_constructor (void * obj, void * arg) -{ - rtl_cache_slab_type * slab = (rtl_cache_slab_type*)(obj); - - (void) arg; /* unused */ - - QUEUE_START_NAMED(slab, slab_); - slab->m_ntypes = 0; - - return (1); -} - - -/** rtl_cache_slab_destructor() - */ -static void -rtl_cache_slab_destructor (void * obj, void * arg) -{ -#if OSL_DEBUG_LEVEL == 0 - (void) obj; /* unused */ -#else /* OSL_DEBUG_LEVEL */ - rtl_cache_slab_type * slab = (rtl_cache_slab_type*)(obj); - - /* assure removed from queue(s) */ - OSL_ASSERT(QUEUE_STARTED_NAMED(slab, slab_)); - - /* assure no longer referenced */ - OSL_ASSERT(slab->m_ntypes == 0); -#endif /* OSL_DEBUG_LEVEL */ - - (void) arg; /* unused */ -} - - -/** rtl_cache_slab_create() - * - * @precond cache->m_slab_lock released. - */ -static rtl_cache_slab_type * -rtl_cache_slab_create ( - rtl_cache_type * cache -) -{ - rtl_cache_slab_type * slab = 0; - void * addr; - sal_Size size; - - size = cache->m_slab_size; - addr = rtl_arena_alloc (cache->m_source, &size); - if (addr != 0) - { - OSL_ASSERT(size >= cache->m_slab_size); - - if (cache->m_features & RTL_CACHE_FEATURE_HASH) - { - /* allocate slab struct from slab cache */ - OSL_ASSERT (cache != gp_cache_slab_cache); - slab = (rtl_cache_slab_type*)rtl_cache_alloc (gp_cache_slab_cache); - } - else - { - /* construct embedded slab struct */ - slab = RTL_CACHE_SLAB(addr, cache->m_slab_size); - (void) rtl_cache_slab_constructor (slab, 0); - } - if (slab != 0) - { - slab->m_data = (sal_uIntPtr)(addr); - - /* dynamic freelist initialization */ - slab->m_bp = slab->m_data; - slab->m_sp = 0; - } - else - { - rtl_arena_free (cache->m_source, addr, size); - } - } - return (slab); -} - - -/** rtl_cache_slab_destroy() - * - * @precond cache->m_slab_lock released. - */ -static void -rtl_cache_slab_destroy ( - rtl_cache_type * cache, - rtl_cache_slab_type * slab -) -{ - void * addr = (void*)(slab->m_data); - sal_Size refcnt = slab->m_ntypes; slab->m_ntypes = 0; - - if (cache->m_features & RTL_CACHE_FEATURE_HASH) - { - /* cleanup bufctl(s) for free buffer(s) */ - sal_Size ntypes = (slab->m_bp - slab->m_data) / cache->m_type_size; - for (ntypes -= refcnt; slab->m_sp != 0; ntypes--) - { - rtl_cache_bufctl_type * bufctl = slab->m_sp; - - /* pop from freelist */ - slab->m_sp = bufctl->m_next, bufctl->m_next = 0; - - /* return bufctl struct to bufctl cache */ - rtl_cache_free (gp_cache_bufctl_cache, bufctl); - } - OSL_ASSERT(ntypes == 0); - - /* return slab struct to slab cache */ - rtl_cache_free (gp_cache_slab_cache, slab); - } - else - { - /* destruct embedded slab struct */ - rtl_cache_slab_destructor (slab, 0); - } - - if ((refcnt == 0) || (cache->m_features & RTL_CACHE_FEATURE_BULKDESTROY)) - { - /* free memory */ - rtl_arena_free (cache->m_source, addr, cache->m_slab_size); - } -} - - -/** rtl_cache_slab_populate() - * - * @precond cache->m_slab_lock acquired. - */ -static int -rtl_cache_slab_populate ( - rtl_cache_type * cache -) -{ - rtl_cache_slab_type * slab; - - RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock)); - slab = rtl_cache_slab_create (cache); - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock)); - if (slab != 0) - { - /* update buffer start addr w/ current color */ - slab->m_bp += cache->m_ncolor; - - /* update color for next slab */ - cache->m_ncolor += cache->m_type_align; - if (cache->m_ncolor > cache->m_ncolor_max) - cache->m_ncolor = 0; - - /* update stats */ - cache->m_slab_stats.m_mem_total += cache->m_slab_size; - - /* insert onto 'free' queue */ - QUEUE_INSERT_HEAD_NAMED(&(cache->m_free_head), slab, slab_); - } - return (slab != 0); -} - -/* ================================================================= */ - -/** rtl_cache_slab_alloc() - * - * Allocate a buffer from slab layer; used by magazine layer. - */ -static void * -rtl_cache_slab_alloc ( - rtl_cache_type * cache -) -{ - void * addr = 0; - rtl_cache_slab_type * head; - - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock)); - - head = &(cache->m_free_head); - if ((head->m_slab_next != head) || rtl_cache_slab_populate (cache)) - { - rtl_cache_slab_type * slab; - rtl_cache_bufctl_type * bufctl; - - slab = head->m_slab_next; - OSL_ASSERT(slab->m_ntypes < cache->m_ntypes); - - if (slab->m_sp == 0) - { - /* initialize bufctl w/ current 'slab->m_bp' */ - OSL_ASSERT (slab->m_bp < slab->m_data + cache->m_ntypes * cache->m_type_size + cache->m_ncolor_max); - if (cache->m_features & RTL_CACHE_FEATURE_HASH) - { - /* allocate bufctl */ - OSL_ASSERT (cache != gp_cache_bufctl_cache); - bufctl = (rtl_cache_bufctl_type*)rtl_cache_alloc (gp_cache_bufctl_cache); - if (bufctl == 0) - { - /* out of memory */ - RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock)); - return (0); - } - - bufctl->m_addr = slab->m_bp; - bufctl->m_slab = (sal_uIntPtr)(slab); - } - else - { - /* embedded bufctl */ - bufctl = (rtl_cache_bufctl_type*)(slab->m_bp); - } - bufctl->m_next = 0; - - /* update 'slab->m_bp' to next free buffer */ - slab->m_bp += cache->m_type_size; - - /* assign bufctl to freelist */ - slab->m_sp = bufctl; - } - - /* pop front */ - bufctl = slab->m_sp; - slab->m_sp = bufctl->m_next; - - /* increment usage, check for full slab */ - if ((slab->m_ntypes += 1) == cache->m_ntypes) - { - /* remove from 'free' queue */ - QUEUE_REMOVE_NAMED(slab, slab_); - - /* insert onto 'used' queue (tail) */ - QUEUE_INSERT_TAIL_NAMED(&(cache->m_used_head), slab, slab_); - } - - /* update stats */ - cache->m_slab_stats.m_alloc += 1; - cache->m_slab_stats.m_mem_alloc += cache->m_type_size; - - if (cache->m_features & RTL_CACHE_FEATURE_HASH) - addr = (void*)rtl_cache_hash_insert (cache, bufctl); - else - addr = bufctl; - - /* DEBUG ONLY: mark allocated, undefined */ - OSL_DEBUG_ONLY(memset(addr, 0x77777777, cache->m_type_size)); - VALGRIND_MEMPOOL_ALLOC(cache, addr, cache->m_type_size); - } - - RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock)); - return (addr); -} - - -/** rtl_cache_slab_free() - * - * Return a buffer to slab layer; used by magazine layer. - */ -static void -rtl_cache_slab_free ( - rtl_cache_type * cache, - void * addr -) -{ - rtl_cache_bufctl_type * bufctl; - rtl_cache_slab_type * slab; - - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock)); - - /* DEBUG ONLY: mark unallocated, undefined */ - VALGRIND_MEMPOOL_FREE(cache, addr); - /* OSL_DEBUG_ONLY() */ VALGRIND_MAKE_MEM_UNDEFINED(addr, cache->m_type_size); - OSL_DEBUG_ONLY(memset(addr, 0x33333333, cache->m_type_size)); - - /* determine slab from addr */ - if (cache->m_features & RTL_CACHE_FEATURE_HASH) - { - bufctl = rtl_cache_hash_remove (cache, (sal_uIntPtr)(addr)); - slab = (bufctl != 0) ? (rtl_cache_slab_type*)(bufctl->m_slab) : 0; - } - else - { - /* embedded slab struct */ - bufctl = (rtl_cache_bufctl_type*)(addr); - slab = RTL_CACHE_SLAB(addr, cache->m_slab_size); - } - - if (slab != 0) - { - /* check for full slab */ - if (slab->m_ntypes == cache->m_ntypes) - { - /* remove from 'used' queue */ - QUEUE_REMOVE_NAMED(slab, slab_); - - /* insert onto 'free' queue (head) */ - QUEUE_INSERT_HEAD_NAMED(&(cache->m_free_head), slab, slab_); - } - - /* push front */ - bufctl->m_next = slab->m_sp; - slab->m_sp = bufctl; - - /* update stats */ - cache->m_slab_stats.m_free += 1; - cache->m_slab_stats.m_mem_alloc -= cache->m_type_size; - - /* decrement usage, check for empty slab */ - if ((slab->m_ntypes -= 1) == 0) - { - /* remove from 'free' queue */ - QUEUE_REMOVE_NAMED(slab, slab_); - - /* update stats */ - cache->m_slab_stats.m_mem_total -= cache->m_slab_size; - - /* free 'empty' slab */ - RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock)); - rtl_cache_slab_destroy (cache, slab); - return; - } - } - - RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock)); -} - -/* ================================================================= */ - -/** rtl_cache_magazine_constructor() - */ -static int -rtl_cache_magazine_constructor (void * obj, void * arg) -{ - rtl_cache_magazine_type * mag = (rtl_cache_magazine_type*)(obj); - /* @@@ sal_Size size = (sal_Size)(arg); @@@ */ - - (void) arg; /* unused */ - - mag->m_mag_next = 0; - mag->m_mag_size = RTL_CACHE_MAGAZINE_SIZE; - mag->m_mag_used = 0; - - return (1); -} - - -/** rtl_cache_magazine_destructor() - */ -static void -rtl_cache_magazine_destructor (void * obj, void * arg) -{ -#if OSL_DEBUG_LEVEL == 0 - (void) obj; /* unused */ -#else /* OSL_DEBUG_LEVEL */ - rtl_cache_magazine_type * mag = (rtl_cache_magazine_type*)(obj); - - /* assure removed from queue(s) */ - OSL_ASSERT(mag->m_mag_next == 0); - - /* assure no longer referenced */ - OSL_ASSERT(mag->m_mag_used == 0); -#endif /* OSL_DEBUG_LEVEL */ - - (void) arg; /* unused */ -} - - -/** rtl_cache_magazine_clear() - */ -static void -rtl_cache_magazine_clear ( - rtl_cache_type * cache, - rtl_cache_magazine_type * mag -) -{ - for (; mag->m_mag_used > 0; --mag->m_mag_used) - { - void * obj = mag->m_objects[mag->m_mag_used - 1]; - mag->m_objects[mag->m_mag_used - 1] = 0; - - /* DEBUG ONLY: mark cached object allocated, undefined */ - VALGRIND_MEMPOOL_ALLOC(cache, obj, cache->m_type_size); - if (cache->m_destructor != 0) - { - /* DEBUG ONLY: keep constructed object defined */ - VALGRIND_MAKE_MEM_DEFINED(obj, cache->m_type_size); - - /* destruct object */ - (cache->m_destructor)(obj, cache->m_userarg); - } - - /* return buffer to slab layer */ - rtl_cache_slab_free (cache, obj); - } -} - -/* ================================================================= */ - -/** rtl_cache_depot_enqueue() - * - * @precond cache->m_depot_lock acquired. - */ -static RTL_MEMORY_INLINE void -rtl_cache_depot_enqueue ( - rtl_cache_depot_type * depot, - rtl_cache_magazine_type * mag -) -{ - /* enqueue empty magazine */ - mag->m_mag_next = depot->m_mag_next; - depot->m_mag_next = mag; - - /* update depot stats */ - depot->m_mag_count++; -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_cache_depot_enqueue) -#endif /* __SUNPRO_C */ - - -/** rtl_cache_depot_dequeue() - * - * @precond cache->m_depot_lock acquired. - */ -static RTL_MEMORY_INLINE rtl_cache_magazine_type * -rtl_cache_depot_dequeue ( - rtl_cache_depot_type * depot -) -{ - rtl_cache_magazine_type * mag = 0; - if (depot->m_mag_count > 0) - { - /* dequeue magazine */ - OSL_ASSERT(depot->m_mag_next != 0); - - mag = depot->m_mag_next; - depot->m_mag_next = mag->m_mag_next; - mag->m_mag_next = 0; - - /* update depot stats */ - depot->m_mag_count--; - depot->m_curr_min = SAL_MIN(depot->m_curr_min, depot->m_mag_count); - } - return (mag); -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_cache_depot_dequeue) -#endif /* __SUNPRO_C */ - - -/** rtl_cache_depot_exchange_alloc() - * - * @precond cache->m_depot_lock acquired. - */ -static RTL_MEMORY_INLINE rtl_cache_magazine_type * -rtl_cache_depot_exchange_alloc ( - rtl_cache_type * cache, - rtl_cache_magazine_type * empty -) -{ - rtl_cache_magazine_type * full; - - OSL_ASSERT((empty == 0) || (empty->m_mag_used == 0)); - - /* dequeue full magazine */ - full = rtl_cache_depot_dequeue (&(cache->m_depot_full)); - if ((full != 0) && (empty != 0)) - { - /* enqueue empty magazine */ - rtl_cache_depot_enqueue (&(cache->m_depot_empty), empty); - } - - OSL_ASSERT((full == 0) || (full->m_mag_used > 0)); - - return (full); -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_cache_depot_exchange_alloc) -#endif /* __SUNPRO_C */ - - -/** rtl_cache_depot_exchange_free() - * - * @precond cache->m_depot_lock acquired. - */ -static RTL_MEMORY_INLINE rtl_cache_magazine_type * -rtl_cache_depot_exchange_free ( - rtl_cache_type * cache, - rtl_cache_magazine_type * full -) -{ - rtl_cache_magazine_type * empty; - - OSL_ASSERT((full == 0) || (full->m_mag_used > 0)); - - /* dequeue empty magazine */ - empty = rtl_cache_depot_dequeue (&(cache->m_depot_empty)); - if ((empty != 0) && (full != 0)) - { - /* enqueue full magazine */ - rtl_cache_depot_enqueue (&(cache->m_depot_full), full); - } - - OSL_ASSERT((empty == 0) || (empty->m_mag_used == 0)); - - return (empty); -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(rtl_cache_depot_exchange_free) -#endif /* __SUNPRO_C */ - - -/** rtl_cache_depot_populate() - * - * @precond cache->m_depot_lock acquired. - */ -static int -rtl_cache_depot_populate ( - rtl_cache_type * cache -) -{ - rtl_cache_magazine_type * empty = 0; - - if (cache->m_magazine_cache != 0) - { - /* allocate new empty magazine */ - RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock)); - empty = (rtl_cache_magazine_type*)rtl_cache_alloc (cache->m_magazine_cache); - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock)); - if (empty != 0) - { - /* enqueue (new) empty magazine */ - rtl_cache_depot_enqueue (&(cache->m_depot_empty), empty); - } - } - return (empty != 0); -} - -/* ================================================================= */ - -/** rtl_cache_constructor() - */ -static int -rtl_cache_constructor (void * obj) -{ - rtl_cache_type * cache = (rtl_cache_type*)(obj); - - memset (cache, 0, sizeof(rtl_cache_type)); - - /* linkage */ - QUEUE_START_NAMED(cache, cache_); - - /* slab layer */ - (void)RTL_MEMORY_LOCK_INIT(&(cache->m_slab_lock)); - - QUEUE_START_NAMED(&(cache->m_free_head), slab_); - QUEUE_START_NAMED(&(cache->m_used_head), slab_); - - cache->m_hash_table = cache->m_hash_table_0; - cache->m_hash_size = RTL_CACHE_HASH_SIZE; - cache->m_hash_shift = highbit(cache->m_hash_size) - 1; - - /* depot layer */ - (void)RTL_MEMORY_LOCK_INIT(&(cache->m_depot_lock)); - - return (1); -} - -/** rtl_cache_destructor() - */ -static void -rtl_cache_destructor (void * obj) -{ - rtl_cache_type * cache = (rtl_cache_type*)(obj); - - /* linkage */ - OSL_ASSERT(QUEUE_STARTED_NAMED(cache, cache_)); - - /* slab layer */ - (void)RTL_MEMORY_LOCK_DESTROY(&(cache->m_slab_lock)); - - OSL_ASSERT(QUEUE_STARTED_NAMED(&(cache->m_free_head), slab_)); - OSL_ASSERT(QUEUE_STARTED_NAMED(&(cache->m_used_head), slab_)); - - OSL_ASSERT(cache->m_hash_table == cache->m_hash_table_0); - OSL_ASSERT(cache->m_hash_size == RTL_CACHE_HASH_SIZE); - OSL_ASSERT(cache->m_hash_shift == (sal_Size)(highbit(cache->m_hash_size) - 1)); - - /* depot layer */ - (void)RTL_MEMORY_LOCK_DESTROY(&(cache->m_depot_lock)); -} - -/* ================================================================= */ - -/** rtl_cache_activate() - */ -static rtl_cache_type * -rtl_cache_activate ( - rtl_cache_type * cache, - const char * name, - size_t objsize, - size_t objalign, - int (SAL_CALL * constructor)(void * obj, void * userarg), - void (SAL_CALL * destructor) (void * obj, void * userarg), - void (SAL_CALL * reclaim) (void * userarg), - void * userarg, - rtl_arena_type * source, - int flags -) -{ - OSL_ASSERT(cache != 0); - if (cache != 0) - { - sal_Size slabsize; - - snprintf (cache->m_name, sizeof(cache->m_name), "%s", name); - - /* ensure minimum size (embedded bufctl linkage) */ - objsize = SAL_MAX(objsize, sizeof(rtl_cache_bufctl_type*)); - - if (objalign == 0) - { - /* determine default alignment */ - if (objsize >= RTL_MEMORY_ALIGNMENT_8) - objalign = RTL_MEMORY_ALIGNMENT_8; - else - objalign = RTL_MEMORY_ALIGNMENT_4; - } - else - { - /* ensure minimum alignment */ - objalign = SAL_MAX(objalign, RTL_MEMORY_ALIGNMENT_4); - } - OSL_ASSERT(RTL_MEMORY_ISP2(objalign)); - - cache->m_type_size = objsize = RTL_MEMORY_P2ROUNDUP(objsize, objalign); - cache->m_type_align = objalign; - cache->m_type_shift = highbit(cache->m_type_size) - 1; - - cache->m_constructor = constructor; - cache->m_destructor = destructor; - cache->m_reclaim = reclaim; - cache->m_userarg = userarg; - - /* slab layer */ - cache->m_source = source; - - slabsize = source->m_quantum; /* minimum slab size */ - if (flags & RTL_CACHE_FLAG_QUANTUMCACHE) - { - /* next power of 2 above 3 * qcache_max */ - slabsize = SAL_MAX(slabsize, (1UL << highbit(3 * source->m_qcache_max))); - } - else - { - /* waste at most 1/8 of slab */ - slabsize = SAL_MAX(slabsize, cache->m_type_size * 8); - } - - slabsize = RTL_MEMORY_P2ROUNDUP(slabsize, source->m_quantum); - if (!RTL_MEMORY_ISP2(slabsize)) - slabsize = 1UL << highbit(slabsize); - cache->m_slab_size = slabsize; - - if (cache->m_slab_size > source->m_quantum) - { - OSL_ASSERT(gp_cache_slab_cache != 0); - OSL_ASSERT(gp_cache_bufctl_cache != 0); - - cache->m_features |= RTL_CACHE_FEATURE_HASH; - cache->m_ntypes = cache->m_slab_size / cache->m_type_size; - cache->m_ncolor_max = cache->m_slab_size % cache->m_type_size; - } - else - { - /* embedded slab struct */ - cache->m_ntypes = (cache->m_slab_size - sizeof(rtl_cache_slab_type)) / cache->m_type_size; - cache->m_ncolor_max = (cache->m_slab_size - sizeof(rtl_cache_slab_type)) % cache->m_type_size; - } - - OSL_ASSERT(cache->m_ntypes > 0); - cache->m_ncolor = 0; - - if (flags & RTL_CACHE_FLAG_BULKDESTROY) - { - /* allow bulk slab delete upon cache deactivation */ - cache->m_features |= RTL_CACHE_FEATURE_BULKDESTROY; - } - - /* magazine layer */ - if (!(flags & RTL_CACHE_FLAG_NOMAGAZINE)) - { - OSL_ASSERT(gp_cache_magazine_cache != 0); - cache->m_magazine_cache = gp_cache_magazine_cache; - } - - /* insert into cache list */ - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - QUEUE_INSERT_TAIL_NAMED(&(g_cache_list.m_cache_head), cache, cache_); - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); - } - return (cache); -} - -/** rtl_cache_deactivate() - */ -static void -rtl_cache_deactivate ( - rtl_cache_type * cache -) -{ - int active = 1; - - /* remove from cache list */ - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - active = QUEUE_STARTED_NAMED(cache, cache_) == 0; - QUEUE_REMOVE_NAMED(cache, cache_); - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); - - OSL_PRECOND(active, "rtl_cache_deactivate(): orphaned cache."); - (void)active; - - /* cleanup magazine layer */ - if (cache->m_magazine_cache != 0) - { - rtl_cache_type * mag_cache; - rtl_cache_magazine_type * mag; - - /* prevent recursion */ - mag_cache = cache->m_magazine_cache, cache->m_magazine_cache = 0; - - /* cleanup cpu layer */ - if ((mag = cache->m_cpu_curr) != 0) - { - cache->m_cpu_curr = 0; - rtl_cache_magazine_clear (cache, mag); - rtl_cache_free (mag_cache, mag); - } - if ((mag = cache->m_cpu_prev) != 0) - { - cache->m_cpu_prev = 0; - rtl_cache_magazine_clear (cache, mag); - rtl_cache_free (mag_cache, mag); - } - - /* cleanup depot layer */ - while ((mag = rtl_cache_depot_dequeue(&(cache->m_depot_full))) != 0) - { - rtl_cache_magazine_clear (cache, mag); - rtl_cache_free (mag_cache, mag); - } - while ((mag = rtl_cache_depot_dequeue(&(cache->m_depot_empty))) != 0) - { - rtl_cache_magazine_clear (cache, mag); - rtl_cache_free (mag_cache, mag); - } - } - - OSL_TRACE( - "rtl_cache_deactivate(\"%s\"): " - "[slab]: allocs: %"PRIu64", frees: %"PRIu64"; total: %lu, used: %lu; " - "[cpu]: allocs: %"PRIu64", frees: %"PRIu64"; " - "[total]: allocs: %"PRIu64", frees: %"PRIu64"", - cache->m_name, - cache->m_slab_stats.m_alloc, cache->m_slab_stats.m_free, - cache->m_slab_stats.m_mem_total, cache->m_slab_stats.m_mem_alloc, - cache->m_cpu_stats.m_alloc, cache->m_cpu_stats.m_free, - cache->m_slab_stats.m_alloc + cache->m_cpu_stats.m_alloc, - cache->m_slab_stats.m_free + cache->m_cpu_stats.m_free - ); - - /* cleanup slab layer */ - if (cache->m_slab_stats.m_alloc > cache->m_slab_stats.m_free) - { - OSL_TRACE( - "rtl_cache_deactivate(\"%s\"): " - "cleaning up %"PRIu64" leaked buffer(s) [%lu bytes] [%lu total]", - cache->m_name, - cache->m_slab_stats.m_alloc - cache->m_slab_stats.m_free, - cache->m_slab_stats.m_mem_alloc, cache->m_slab_stats.m_mem_total - ); - - if (cache->m_features & RTL_CACHE_FEATURE_HASH) - { - /* cleanup bufctl(s) for leaking buffer(s) */ - sal_Size i, n = cache->m_hash_size; - for (i = 0; i < n; i++) - { - rtl_cache_bufctl_type * bufctl; - while ((bufctl = cache->m_hash_table[i]) != 0) - { - /* pop from hash table */ - cache->m_hash_table[i] = bufctl->m_next, bufctl->m_next = 0; - - /* return to bufctl cache */ - rtl_cache_free (gp_cache_bufctl_cache, bufctl); - } - } - } - { - /* force cleanup of remaining slabs */ - rtl_cache_slab_type *head, *slab; - - head = &(cache->m_used_head); - for (slab = head->m_slab_next; slab != head; slab = head->m_slab_next) - { - /* remove from 'used' queue */ - QUEUE_REMOVE_NAMED(slab, slab_); - - /* update stats */ - cache->m_slab_stats.m_mem_total -= cache->m_slab_size; - - /* free slab */ - rtl_cache_slab_destroy (cache, slab); - } - - head = &(cache->m_free_head); - for (slab = head->m_slab_next; slab != head; slab = head->m_slab_next) - { - /* remove from 'free' queue */ - QUEUE_REMOVE_NAMED(slab, slab_); - - /* update stats */ - cache->m_slab_stats.m_mem_total -= cache->m_slab_size; - - /* free slab */ - rtl_cache_slab_destroy (cache, slab); - } - } - } - - if (cache->m_hash_table != cache->m_hash_table_0) - { - rtl_arena_free ( - gp_cache_arena, - cache->m_hash_table, - cache->m_hash_size * sizeof(rtl_cache_bufctl_type*)); - - cache->m_hash_table = cache->m_hash_table_0; - cache->m_hash_size = RTL_CACHE_HASH_SIZE; - cache->m_hash_shift = highbit(cache->m_hash_size) - 1; - } -} - -/* ================================================================= * - * - * cache implementation. - * - * ================================================================= */ - -extern void ensureCacheSingleton(); - -/** rtl_cache_create() - */ -rtl_cache_type * -SAL_CALL rtl_cache_create ( - const char * name, - sal_Size objsize, - sal_Size objalign, - int (SAL_CALL * constructor)(void * obj, void * userarg), - void (SAL_CALL * destructor) (void * obj, void * userarg), - void (SAL_CALL * reclaim) (void * userarg), - void * userarg, - rtl_arena_type * source, - int flags -) SAL_THROW_EXTERN_C() -{ - rtl_cache_type * result = 0; - sal_Size size = sizeof(rtl_cache_type); - -try_alloc: - result = (rtl_cache_type*)rtl_arena_alloc (gp_cache_arena, &size); - if (result != 0) - { - rtl_cache_type * cache = result; - VALGRIND_CREATE_MEMPOOL(cache, 0, 0); - (void) rtl_cache_constructor (cache); - - if (!source) - { - /* use default arena */ - OSL_ASSERT(gp_default_arena != 0); - source = gp_default_arena; - } - - result = rtl_cache_activate ( - cache, - name, - objsize, - objalign, - constructor, - destructor, - reclaim, - userarg, - source, - flags - ); - - if (result == 0) - { - /* activation failed */ - rtl_cache_deactivate (cache); - rtl_cache_destructor (cache); - VALGRIND_DESTROY_MEMPOOL(cache); - rtl_arena_free (gp_cache_arena, cache, size); - } - } - else if (gp_cache_arena == 0) - { - ensureCacheSingleton(); - if (gp_cache_arena) - { - /* try again */ - goto try_alloc; - } - } - return (result); -} - -/** rtl_cache_destroy() - */ -void SAL_CALL rtl_cache_destroy ( - rtl_cache_type * cache -) SAL_THROW_EXTERN_C() -{ - if (cache != 0) - { - rtl_cache_deactivate (cache); - rtl_cache_destructor (cache); - VALGRIND_DESTROY_MEMPOOL(cache); - rtl_arena_free (gp_cache_arena, cache, sizeof(rtl_cache_type)); - } -} - -/** rtl_cache_alloc() - */ -void * -SAL_CALL rtl_cache_alloc ( - rtl_cache_type * cache -) SAL_THROW_EXTERN_C() -{ - void * obj = 0; - - if (cache == 0) - return (0); - - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock)); - if (cache->m_cpu_curr != 0) - { - for (;;) - { - /* take object from magazine layer */ - rtl_cache_magazine_type *curr, *prev, *temp; - - curr = cache->m_cpu_curr; - if ((curr != 0) && (curr->m_mag_used > 0)) - { - obj = curr->m_objects[--curr->m_mag_used]; -#if defined(HAVE_VALGRIND_MEMCHECK_H) - VALGRIND_MEMPOOL_ALLOC(cache, obj, cache->m_type_size); - if (cache->m_constructor != 0) - { - /* keep constructed object defined */ - VALGRIND_MAKE_MEM_DEFINED(obj, cache->m_type_size); - } -#endif /* HAVE_VALGRIND_MEMCHECK_H */ - cache->m_cpu_stats.m_alloc += 1; - RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock)); - - return (obj); - } - - prev = cache->m_cpu_prev; - if ((prev != 0) && (prev->m_mag_used > 0)) - { - temp = cache->m_cpu_curr; - cache->m_cpu_curr = cache->m_cpu_prev; - cache->m_cpu_prev = temp; - - continue; - } - - temp = rtl_cache_depot_exchange_alloc (cache, prev); - if (temp != 0) - { - cache->m_cpu_prev = cache->m_cpu_curr; - cache->m_cpu_curr = temp; - - continue; - } - - /* no full magazine: fall through to slab layer */ - break; - } - } - RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock)); - - /* alloc buffer from slab layer */ - obj = rtl_cache_slab_alloc (cache); - if ((obj != 0) && (cache->m_constructor != 0)) - { - /* construct object */ - if (!((cache->m_constructor)(obj, cache->m_userarg))) - { - /* construction failure */ - rtl_cache_slab_free (cache, obj), obj = 0; - } - } - return (obj); -} - -/** rtl_cache_free() - */ -void -SAL_CALL rtl_cache_free ( - rtl_cache_type * cache, - void * obj -) SAL_THROW_EXTERN_C() -{ - if ((obj != 0) && (cache != 0)) - { - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock)); - - for (;;) - { - /* return object to magazine layer */ - rtl_cache_magazine_type *curr, *prev, *temp; - - curr = cache->m_cpu_curr; - if ((curr != 0) && (curr->m_mag_used < curr->m_mag_size)) - { - curr->m_objects[curr->m_mag_used++] = obj; -#if defined(HAVE_VALGRIND_MEMCHECK_H) - VALGRIND_MEMPOOL_FREE(cache, obj); -#endif /* HAVE_VALGRIND_MEMCHECK_H */ - cache->m_cpu_stats.m_free += 1; - RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock)); - - return; - } - - prev = cache->m_cpu_prev; - if ((prev != 0) && (prev->m_mag_used == 0)) - { - temp = cache->m_cpu_curr; - cache->m_cpu_curr = cache->m_cpu_prev; - cache->m_cpu_prev = temp; - - continue; - } - - temp = rtl_cache_depot_exchange_free (cache, prev); - if (temp != 0) - { - cache->m_cpu_prev = cache->m_cpu_curr; - cache->m_cpu_curr = temp; - - continue; - } - - if (rtl_cache_depot_populate(cache) != 0) - { - continue; - } - - /* no empty magazine: fall through to slab layer */ - break; - } - - RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock)); - - /* no space for constructed object in magazine layer */ - if (cache->m_destructor != 0) - { - /* destruct object */ - (cache->m_destructor)(obj, cache->m_userarg); - } - - /* return buffer to slab layer */ - rtl_cache_slab_free (cache, obj); - } -} - -/* ================================================================= * - * - * cache wsupdate (machdep) internals. - * - * ================================================================= */ - -/** rtl_cache_wsupdate_init() - * - * @precond g_cache_list.m_lock initialized - */ -static void -rtl_cache_wsupdate_init (void); - - -/** rtl_cache_wsupdate_wait() - * - * @precond g_cache_list.m_lock acquired - */ -static void -rtl_cache_wsupdate_wait ( - unsigned int seconds -); - -/** rtl_cache_wsupdate_fini() - * - */ -static void -rtl_cache_wsupdate_fini (void); - -/* ================================================================= */ - -#if defined(SAL_UNX) - -#include <sys/time.h> - -static void * -rtl_cache_wsupdate_all (void * arg); - -static void -rtl_cache_wsupdate_init (void) -{ - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - g_cache_list.m_update_done = 0; - (void) pthread_cond_init (&(g_cache_list.m_update_cond), NULL); - if (pthread_create ( - &(g_cache_list.m_update_thread), NULL, rtl_cache_wsupdate_all, (void*)(10)) != 0) - { - /* failure */ - g_cache_list.m_update_thread = (pthread_t)(0); - } - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); -} - -static void -rtl_cache_wsupdate_wait (unsigned int seconds) -{ - if (seconds > 0) - { - struct timeval now; - struct timespec wakeup; - - gettimeofday(&now, 0); - wakeup.tv_sec = now.tv_sec + (seconds); - wakeup.tv_nsec = now.tv_usec * 1000; - - (void) pthread_cond_timedwait ( - &(g_cache_list.m_update_cond), - &(g_cache_list.m_lock), - &wakeup); - } -} - -static void -rtl_cache_wsupdate_fini (void) -{ - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - g_cache_list.m_update_done = 1; - pthread_cond_signal (&(g_cache_list.m_update_cond)); - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); - - if (g_cache_list.m_update_thread != (pthread_t)(0)) - pthread_join (g_cache_list.m_update_thread, NULL); -} - -/* ================================================================= */ - -#elif defined(SAL_W32) - -static DWORD WINAPI -rtl_cache_wsupdate_all (void * arg); - -static void -rtl_cache_wsupdate_init (void) -{ - DWORD dwThreadId; - - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - g_cache_list.m_update_done = 0; - g_cache_list.m_update_cond = CreateEvent (0, TRUE, FALSE, 0); - - g_cache_list.m_update_thread = - CreateThread (NULL, 0, rtl_cache_wsupdate_all, (LPVOID)(10), 0, &dwThreadId); - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); -} - -static void -rtl_cache_wsupdate_wait (unsigned int seconds) -{ - if (seconds > 0) - { - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); - WaitForSingleObject (g_cache_list.m_update_cond, (DWORD)(seconds * 1000)); - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - } -} - -static void -rtl_cache_wsupdate_fini (void) -{ - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - g_cache_list.m_update_done = 1; - SetEvent (g_cache_list.m_update_cond); - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); - - WaitForSingleObject (g_cache_list.m_update_thread, INFINITE); -} - -#endif /* SAL_UNX || SAL_W32 */ - -/* ================================================================= */ - -/** rtl_cache_depot_wsupdate() - * update depot stats and purge excess magazines. - * - * @precond cache->m_depot_lock acquired - */ -static void -rtl_cache_depot_wsupdate ( - rtl_cache_type * cache, - rtl_cache_depot_type * depot -) -{ - sal_Size npurge; - - depot->m_prev_min = depot->m_curr_min; - depot->m_curr_min = depot->m_mag_count; - - npurge = SAL_MIN(depot->m_curr_min, depot->m_prev_min); - for (; npurge > 0; npurge--) - { - rtl_cache_magazine_type * mag = rtl_cache_depot_dequeue (depot); - if (mag != 0) - { - RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock)); - rtl_cache_magazine_clear (cache, mag); - rtl_cache_free (cache->m_magazine_cache, mag); - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock)); - } - } -} - -/** rtl_cache_wsupdate() - * - * @precond cache->m_depot_lock released - */ -static void -rtl_cache_wsupdate ( - rtl_cache_type * cache -) -{ - if (cache->m_magazine_cache != 0) - { - RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock)); - - OSL_TRACE( - "rtl_cache_wsupdate(\"%s\") " - "[depot: count, curr_min, prev_min] " - "full: %lu, %lu, %lu; empty: %lu, %lu, %lu", - cache->m_name, - cache->m_depot_full.m_mag_count, - cache->m_depot_full.m_curr_min, - cache->m_depot_full.m_prev_min, - cache->m_depot_empty.m_mag_count, - cache->m_depot_empty.m_curr_min, - cache->m_depot_empty.m_prev_min - ); - - rtl_cache_depot_wsupdate (cache, &(cache->m_depot_full)); - rtl_cache_depot_wsupdate (cache, &(cache->m_depot_empty)); - - RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock)); - } -} - -/** rtl_cache_wsupdate_all() - * - */ -#if defined(SAL_UNX) -static void * -#elif defined(SAL_W32) -static DWORD WINAPI -#endif /* SAL_UNX || SAL_W32 */ -rtl_cache_wsupdate_all (void * arg) -{ - unsigned int seconds = (unsigned int)SAL_INT_CAST(sal_uIntPtr, arg); - - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - while (!g_cache_list.m_update_done) - { - rtl_cache_wsupdate_wait (seconds); - if (!g_cache_list.m_update_done) - { - rtl_cache_type * head, * cache; - - head = &(g_cache_list.m_cache_head); - for (cache = head->m_cache_next; - cache != head; - cache = cache->m_cache_next) - { - rtl_cache_wsupdate (cache); - } - } - } - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); - - return (0); -} - -/* ================================================================= * - * - * cache initialization. - * - * ================================================================= */ - -void -rtl_cache_init (void) -{ - { - /* list of caches */ - RTL_MEMORY_LOCK_INIT(&(g_cache_list.m_lock)); - (void) rtl_cache_constructor (&(g_cache_list.m_cache_head)); - } - { - /* cache: internal arena */ - OSL_ASSERT(gp_cache_arena == 0); - - gp_cache_arena = rtl_arena_create ( - "rtl_cache_internal_arena", - 64, /* quantum */ - 0, /* no quantum caching */ - NULL, /* default source */ - rtl_arena_alloc, - rtl_arena_free, - 0 /* flags */ - ); - OSL_ASSERT(gp_cache_arena != 0); - - /* check 'gp_default_arena' initialization */ - OSL_ASSERT(gp_default_arena != 0); - } - { - /* cache: magazine cache */ - static rtl_cache_type g_cache_magazine_cache; - - OSL_ASSERT(gp_cache_magazine_cache == 0); - VALGRIND_CREATE_MEMPOOL(&g_cache_magazine_cache, 0, 0); - (void) rtl_cache_constructor (&g_cache_magazine_cache); - - gp_cache_magazine_cache = rtl_cache_activate ( - &g_cache_magazine_cache, - "rtl_cache_magazine_cache", - sizeof(rtl_cache_magazine_type), /* objsize */ - 0, /* objalign */ - rtl_cache_magazine_constructor, - rtl_cache_magazine_destructor, - 0, /* reclaim */ - 0, /* userarg: NYI */ - gp_default_arena, /* source */ - RTL_CACHE_FLAG_NOMAGAZINE /* during bootstrap; activated below */ - ); - OSL_ASSERT(gp_cache_magazine_cache != 0); - - /* activate magazine layer */ - g_cache_magazine_cache.m_magazine_cache = gp_cache_magazine_cache; - } - { - /* cache: slab (struct) cache */ - static rtl_cache_type g_cache_slab_cache; - - OSL_ASSERT(gp_cache_slab_cache == 0); - VALGRIND_CREATE_MEMPOOL(&g_cache_slab_cache, 0, 0); - (void) rtl_cache_constructor (&g_cache_slab_cache); - - gp_cache_slab_cache = rtl_cache_activate ( - &g_cache_slab_cache, - "rtl_cache_slab_cache", - sizeof(rtl_cache_slab_type), /* objsize */ - 0, /* objalign */ - rtl_cache_slab_constructor, - rtl_cache_slab_destructor, - 0, /* reclaim */ - 0, /* userarg: none */ - gp_default_arena, /* source */ - 0 /* flags: none */ - ); - OSL_ASSERT(gp_cache_slab_cache != 0); - } - { - /* cache: bufctl cache */ - static rtl_cache_type g_cache_bufctl_cache; - - OSL_ASSERT(gp_cache_bufctl_cache == 0); - VALGRIND_CREATE_MEMPOOL(&g_cache_bufctl_cache, 0, 0); - (void) rtl_cache_constructor (&g_cache_bufctl_cache); - - gp_cache_bufctl_cache = rtl_cache_activate ( - &g_cache_bufctl_cache, - "rtl_cache_bufctl_cache", - sizeof(rtl_cache_bufctl_type), /* objsize */ - 0, /* objalign */ - 0, /* constructor */ - 0, /* destructor */ - 0, /* reclaim */ - 0, /* userarg */ - gp_default_arena, /* source */ - 0 /* flags: none */ - ); - OSL_ASSERT(gp_cache_bufctl_cache != 0); - } - - rtl_cache_wsupdate_init(); - OSL_TRACE("rtl_cache_init completed"); -} - -/* ================================================================= */ - -void -rtl_cache_fini (void) -{ - if (gp_cache_arena != 0) - { - rtl_cache_type * cache, * head; - - rtl_cache_wsupdate_fini(); - - if (gp_cache_bufctl_cache != 0) - { - cache = gp_cache_bufctl_cache, gp_cache_bufctl_cache = 0; - rtl_cache_deactivate (cache); - rtl_cache_destructor (cache); - VALGRIND_DESTROY_MEMPOOL(cache); - } - if (gp_cache_slab_cache != 0) - { - cache = gp_cache_slab_cache, gp_cache_slab_cache = 0; - rtl_cache_deactivate (cache); - rtl_cache_destructor (cache); - VALGRIND_DESTROY_MEMPOOL(cache); - } - if (gp_cache_magazine_cache != 0) - { - cache = gp_cache_magazine_cache, gp_cache_magazine_cache = 0; - rtl_cache_deactivate (cache); - rtl_cache_destructor (cache); - VALGRIND_DESTROY_MEMPOOL(cache); - } - if (gp_cache_arena != 0) - { - rtl_arena_destroy (gp_cache_arena); - gp_cache_arena = 0; - } - - RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock)); - head = &(g_cache_list.m_cache_head); - for (cache = head->m_cache_next; cache != head; cache = cache->m_cache_next) - { - OSL_TRACE( - "rtl_cache_fini(\"%s\") " - "[slab]: allocs: %"PRIu64", frees: %"PRIu64"; total: %lu, used: %lu; " - "[cpu]: allocs: %"PRIu64", frees: %"PRIu64"; " - "[total]: allocs: %"PRIu64", frees: %"PRIu64"", - cache->m_name, - cache->m_slab_stats.m_alloc, cache->m_slab_stats.m_free, - cache->m_slab_stats.m_mem_total, cache->m_slab_stats.m_mem_alloc, - cache->m_cpu_stats.m_alloc, cache->m_cpu_stats.m_free, - cache->m_slab_stats.m_alloc + cache->m_cpu_stats.m_alloc, - cache->m_slab_stats.m_free + cache->m_cpu_stats.m_free - ); - } - RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock)); - } - OSL_TRACE("rtl_cache_fini completed"); -} - -/* ================================================================= */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/alloc_cache.h b/sal/rtl/source/alloc_cache.h deleted file mode 100644 index 29d4fa7be..000000000 --- a/sal/rtl/source/alloc_cache.h +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_RTL_ALLOC_CACHE_H -#define INCLUDED_RTL_ALLOC_CACHE_H - -#include "sal/types.h" -#include "rtl/alloc.h" -#include "alloc_impl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** rtl_cache_stat_type - * @internal - */ -typedef struct rtl_cache_stat_st rtl_cache_stat_type; -struct rtl_cache_stat_st -{ - sal_uInt64 m_alloc; - sal_uInt64 m_free; - - sal_Size m_mem_total; - sal_Size m_mem_alloc; -}; - - -/** rtl_cache_bufctl_type - * @internal - */ -typedef struct rtl_cache_bufctl_st rtl_cache_bufctl_type; -struct rtl_cache_bufctl_st -{ - rtl_cache_bufctl_type * m_next; /* linkage */ - - sal_uIntPtr m_addr; /* buffer address */ - sal_uIntPtr m_slab; /* parent slab address */ -}; - - -/** rtl_cache_slab_type - * @internal - */ -typedef struct rtl_cache_slab_st rtl_cache_slab_type; -struct rtl_cache_slab_st -{ - rtl_cache_slab_type * m_slab_next; /* slab linkage */ - rtl_cache_slab_type * m_slab_prev; /* slab linkage */ - - sal_Size m_ntypes; /* number of buffers used */ - sal_uIntPtr m_data; /* buffer start addr */ - - sal_uIntPtr m_bp; /* free buffer linkage 'base pointer' */ - rtl_cache_bufctl_type * m_sp; /* free buffer linkage 'stack pointer' */ -}; - - -/** rtl_cache_magazine_type - * @internal - */ -#define RTL_CACHE_MAGAZINE_SIZE 61 - -typedef struct rtl_cache_magazine_st rtl_cache_magazine_type; -struct rtl_cache_magazine_st -{ - rtl_cache_magazine_type * m_mag_next; /* depot linkage */ - - sal_Size m_mag_size; - sal_Size m_mag_used; - - void * m_objects[RTL_CACHE_MAGAZINE_SIZE]; -}; - - -/** rtl_cache_depot_type - * @internal - */ -typedef struct rtl_cache_depot_st rtl_cache_depot_type; -struct rtl_cache_depot_st -{ - /* magazine list */ - rtl_cache_magazine_type * m_mag_next; /* linkage */ - sal_Size m_mag_count; /* count */ - - /* working set parameters */ - sal_Size m_curr_min; - sal_Size m_prev_min; -}; - - -/** rtl_cache_type - * @internal - */ -#define RTL_CACHE_HASH_SIZE 8 - -#define RTL_CACHE_FEATURE_HASH 1 -#define RTL_CACHE_FEATURE_BULKDESTROY 2 -#define RTL_CACHE_FEATURE_RESCALE 4 /* within hash rescale operation */ - -struct rtl_cache_st -{ - /* linkage */ - rtl_cache_type * m_cache_next; - rtl_cache_type * m_cache_prev; - - /* properties */ - char m_name[RTL_CACHE_NAME_LENGTH + 1]; - long m_features; - - sal_Size m_type_size; /* const */ - sal_Size m_type_align; /* const */ - sal_Size m_type_shift; /* log2(m_type_size); const */ - - int (SAL_CALL * m_constructor)(void * obj, void * userarg); /* const */ - void (SAL_CALL * m_destructor) (void * obj, void * userarg); /* const */ - void (SAL_CALL * m_reclaim) (void * userarg); /* const */ - void * m_userarg; - - /* slab layer */ - rtl_memory_lock_type m_slab_lock; - rtl_cache_stat_type m_slab_stats; - - rtl_arena_type * m_source; /* slab supplier; const */ - sal_Size m_slab_size; /* const */ - sal_Size m_ntypes; /* number of buffers per slab; const */ - sal_Size m_ncolor; /* next slab color */ - sal_Size m_ncolor_max; /* max. slab color */ - - rtl_cache_slab_type m_free_head; - rtl_cache_slab_type m_used_head; - - rtl_cache_bufctl_type ** m_hash_table; - rtl_cache_bufctl_type * m_hash_table_0[RTL_CACHE_HASH_SIZE]; - sal_Size m_hash_size; /* m_hash_mask + 1 */ - sal_Size m_hash_shift; /* log2(m_hash_size) */ - - /* depot layer */ - rtl_memory_lock_type m_depot_lock; - - rtl_cache_depot_type m_depot_empty; - rtl_cache_depot_type m_depot_full; - - rtl_cache_type * m_magazine_cache; /* magazine supplier; const */ - - /* cpu layer */ - rtl_cache_magazine_type * m_cpu_curr; - rtl_cache_magazine_type * m_cpu_prev; - - rtl_cache_stat_type m_cpu_stats; -}; - - -#ifdef __cplusplus -} -#endif - -#endif /* INCLUDED_RTL_ALLOC_CACHE_H */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/alloc_fini.cxx b/sal/rtl/source/alloc_fini.cxx deleted file mode 100644 index dfd359953..000000000 --- a/sal/rtl/source/alloc_fini.cxx +++ /dev/null @@ -1,123 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <rtl/instance.hxx> - -extern "C" void rtl_memory_fini (void); -extern "C" void rtl_memory_init (void); -namespace -{ - struct rtlMemorySingleton - { - rtlMemorySingleton() - { - rtl_memory_init(); - } - ~rtlMemorySingleton() - { - rtl_memory_fini(); - } - }; - class theMemorySingleton - : public rtl::Static<rtlMemorySingleton, theMemorySingleton>{}; -} -extern "C" void ensureMemorySingleton() -{ - theMemorySingleton::get(); -} - -extern "C" void rtl_cache_fini (void); -extern "C" void rtl_cache_init (void); -namespace -{ - struct rtlCacheSingleton - { - rtlCacheSingleton() - { - rtl_cache_init(); - } - ~rtlCacheSingleton() - { - rtl_cache_fini(); - } - }; - class theCacheSingleton - : public rtl::Static<rtlCacheSingleton, theCacheSingleton>{}; -} -extern "C" void ensureCacheSingleton() -{ - theCacheSingleton::get(); -} - -extern "C" void rtl_arena_fini (void); -extern "C" void rtl_arena_init (void); -namespace -{ - struct rtlArenaSingleton - { - rtlArenaSingleton() - { - rtl_arena_init(); - } - ~rtlArenaSingleton() - { - rtl_arena_fini(); - } - }; - class theArenaSingleton - : public rtl::Static<rtlArenaSingleton, theArenaSingleton>{}; -} -extern "C" void ensureArenaSingleton() -{ - theArenaSingleton::get(); -} - -extern "C" void rtl_locale_fini (void); -extern "C" void rtl_locale_init (void); -namespace -{ - struct rtlLocaleSingleton - { - rtlLocaleSingleton() - { - rtl_locale_init(); - } - ~rtlLocaleSingleton() - { - rtl_locale_fini(); - } - }; - class theLocaleSingleton - : public rtl::Static<rtlLocaleSingleton, theLocaleSingleton>{}; -} -extern "C" void ensureLocaleSingleton() -{ - theLocaleSingleton::get(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/alloc_global.c b/sal/rtl/source/alloc_global.c deleted file mode 100644 index fb95e83dc..000000000 --- a/sal/rtl/source/alloc_global.c +++ /dev/null @@ -1,402 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "alloc_impl.h" -#include "rtl/alloc.h" -#include <sal/macros.h> -#include <osl/diagnose.h> - -#include <string.h> -#include <stdio.h> - -#if !defined(FORCE_SYSALLOC) - -typedef enum { AMode_CUSTOM, AMode_SYSTEM, AMode_UNSET } AllocMode; - -static AllocMode alloc_mode = AMode_UNSET; - -static void determine_alloc_mode(void) -{ - /* This shouldn't happen, but still ... */ - if (alloc_mode != AMode_UNSET) - return; - - if (getenv("G_SLICE") != NULL) - { - alloc_mode = AMode_SYSTEM; - fprintf(stderr, "LibreOffice: Using system memory allocator.\n"); - fprintf(stderr, "LibreOffice: This is for debugging only. To disable,\n"); - fprintf(stderr, "LibreOffice: unset the environment variable G_SLICE.\n"); - } - else - { - alloc_mode = AMode_CUSTOM; - } -} - -/* ================================================================= * - * - * custom allocator includes. - * - * ================================================================= */ - -#include "internal/once.h" -#include "sal/macros.h" - -/* ================================================================= * - * - * custom allocator internals. - * - * ================================================================= */ - -static const sal_Size g_alloc_sizes[] = -{ - /* powers of 2**(1/4) */ - 4 * 4, 6 * 4, - 4 * 8, 5 * 8, 6 * 8, 7 * 8, - 4 * 16, 5 * 16, 6 * 16, 7 * 16, - 4 * 32, 5 * 32, 6 * 32, 7 * 32, - 4 * 64, 5 * 64, 6 * 64, 7 * 64, - 4 * 128, 5 * 128, 6 * 128, 7 * 128, - 4 * 256, 5 * 256, 6 * 256, 7 * 256, - 4 * 512, 5 * 512, 6 * 512, 7 * 512, - 4 * 1024, 5 * 1024, 6 * 1024, 7 * 1024, - 4 * 2048, 5 * 2048, 6 * 2048, 7 * 2048, - 4 * 4096 -}; - -#define RTL_MEMORY_CACHED_LIMIT 4 * 4096 -#define RTL_MEMORY_CACHED_SIZES (SAL_N_ELEMENTS(g_alloc_sizes)) - -static rtl_cache_type * g_alloc_caches[RTL_MEMORY_CACHED_SIZES] = -{ - 0, -}; - -#define RTL_MEMALIGN 8 -#define RTL_MEMALIGN_SHIFT 3 - -static rtl_cache_type * g_alloc_table[RTL_MEMORY_CACHED_LIMIT >> RTL_MEMALIGN_SHIFT] = -{ - 0, -}; - -static rtl_arena_type * gp_alloc_arena = 0; - -extern void ensureMemorySingleton(); - -/* ================================================================= * - * - * custom allocator implemenation. - * - * ================================================================= */ - -void * -SAL_CALL rtl_allocateMemory_CUSTOM (sal_Size n) SAL_THROW_EXTERN_C() -{ - void * p = 0; - if (n > 0) - { - char * addr; - sal_Size size = RTL_MEMORY_ALIGN(n + RTL_MEMALIGN, RTL_MEMALIGN); - - OSL_ASSERT(RTL_MEMALIGN >= sizeof(sal_Size)); - if (n >= SAL_MAX_SIZE - (RTL_MEMALIGN + RTL_MEMALIGN - 1)) - { - /* requested size too large for roundup alignment */ - return 0; - } - -try_alloc: - if (size <= RTL_MEMORY_CACHED_LIMIT) - addr = (char*)rtl_cache_alloc(g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT]); - else - addr = (char*)rtl_arena_alloc (gp_alloc_arena, &size); - - if (addr != 0) - { - ((sal_Size*)(addr))[0] = size; - p = addr + RTL_MEMALIGN; - } - else if (gp_alloc_arena == 0) - { - ensureMemorySingleton(); - if (gp_alloc_arena) - { - /* try again */ - goto try_alloc; - } - } - } - return (p); -} - -/* ================================================================= */ - -void SAL_CALL rtl_freeMemory_CUSTOM (void * p) SAL_THROW_EXTERN_C() -{ - if (p != 0) - { - char * addr = (char*)(p) - RTL_MEMALIGN; - sal_Size size = ((sal_Size*)(addr))[0]; - - if (size <= RTL_MEMORY_CACHED_LIMIT) - rtl_cache_free(g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT], addr); - else - rtl_arena_free (gp_alloc_arena, addr, size); - } -} - -/* ================================================================= */ - -void * SAL_CALL rtl_reallocateMemory_CUSTOM (void * p, sal_Size n) SAL_THROW_EXTERN_C() -{ - if (n > 0) - { - if (p != 0) - { - void * p_old = p; - sal_Size n_old = ((sal_Size*)( (char*)(p) - RTL_MEMALIGN ))[0] - RTL_MEMALIGN; - - p = rtl_allocateMemory (n); - if (p != 0) - { - memcpy (p, p_old, SAL_MIN(n, n_old)); - rtl_freeMemory (p_old); - } - } - else - { - p = rtl_allocateMemory (n); - } - } - else if (p != 0) - { - rtl_freeMemory (p), p = 0; - } - return (p); -} - -#endif - -/* ================================================================= * - * - * custom allocator initialization / finalization. - * - * ================================================================= */ - -void rtl_memory_init (void) -{ -#if !defined(FORCE_SYSALLOC) - { - /* global memory arena */ - OSL_ASSERT(gp_alloc_arena == 0); - - gp_alloc_arena = rtl_arena_create ( - "rtl_alloc_arena", - 2048, /* quantum */ - 0, /* w/o quantum caching */ - 0, /* default source */ - rtl_arena_alloc, - rtl_arena_free, - 0 /* flags */ - ); - OSL_ASSERT(gp_alloc_arena != 0); - } - { - sal_Size size; - int i, n = RTL_MEMORY_CACHED_SIZES; - - for (i = 0; i < n; i++) - { - char name[RTL_CACHE_NAME_LENGTH + 1]; - (void) snprintf (name, sizeof(name), "rtl_alloc_%lu", g_alloc_sizes[i]); - g_alloc_caches[i] = rtl_cache_create (name, g_alloc_sizes[i], 0, NULL, NULL, NULL, NULL, NULL, 0); - } - - size = RTL_MEMALIGN; - for (i = 0; i < n; i++) - { - while (size <= g_alloc_sizes[i]) - { - g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT] = g_alloc_caches[i]; - size += RTL_MEMALIGN; - } - } - } -#endif - OSL_TRACE("rtl_memory_init completed"); -} - -/* ================================================================= */ - -void rtl_memory_fini (void) -{ -#if !defined(FORCE_SYSALLOC) - int i, n; - - /* clear g_alloc_table */ - memset (g_alloc_table, 0, sizeof(g_alloc_table)); - - /* cleanup g_alloc_caches */ - for (i = 0, n = RTL_MEMORY_CACHED_SIZES; i < n; i++) - { - if (g_alloc_caches[i] != 0) - { - rtl_cache_destroy (g_alloc_caches[i]); - g_alloc_caches[i] = 0; - } - } - - /* cleanup gp_alloc_arena */ - if (gp_alloc_arena != 0) - { - rtl_arena_destroy (gp_alloc_arena); - gp_alloc_arena = 0; - } -#endif - OSL_TRACE("rtl_memory_fini completed"); -} - -/* ================================================================= * - * - * system allocator implemenation. - * - * ================================================================= */ - -void * SAL_CALL rtl_allocateMemory_SYSTEM (sal_Size n) -{ - return malloc (n); -} - -/* ================================================================= */ - -void SAL_CALL rtl_freeMemory_SYSTEM (void * p) -{ - free (p); -} - -/* ================================================================= */ - -void * SAL_CALL rtl_reallocateMemory_SYSTEM (void * p, sal_Size n) -{ - return realloc (p, n); -} - -/* ================================================================= */ - -void* SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C() -{ -#if !defined(FORCE_SYSALLOC) - while (1) - { - if (alloc_mode == AMode_CUSTOM) - { - return rtl_allocateMemory_CUSTOM(n); - } - if (alloc_mode == AMode_SYSTEM) - { - return rtl_allocateMemory_SYSTEM(n); - } - determine_alloc_mode(); - } -#else - return rtl_allocateMemory_SYSTEM(n); -#endif -} - -void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C() -{ -#if !defined(FORCE_SYSALLOC) - while (1) - { - if (alloc_mode == AMode_CUSTOM) - { - return rtl_reallocateMemory_CUSTOM(p,n); - } - if (alloc_mode == AMode_SYSTEM) - { - return rtl_reallocateMemory_SYSTEM(p,n); - } - determine_alloc_mode(); - } -#else - return rtl_reallocateMemory_SYSTEM(p,n); -#endif -} - -void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C() -{ -#if !defined(FORCE_SYSALLOC) - while (1) - { - if (alloc_mode == AMode_CUSTOM) - { - rtl_freeMemory_CUSTOM(p); - return; - } - if (alloc_mode == AMode_SYSTEM) - { - rtl_freeMemory_SYSTEM(p); - return; - } - determine_alloc_mode(); - } -#else - rtl_freeMemory_SYSTEM(p); -#endif -} - -/* ================================================================= * - * - * rtl_(allocate|free)ZeroMemory() implemenation. - * - * ================================================================= */ - -void * SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C() -{ - void * p = rtl_allocateMemory (n); - if (p != 0) - memset (p, 0, n); - return (p); -} - -/* ================================================================= */ - -void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C() -{ - if (p != 0) - { - memset (p, 0, n); - rtl_freeMemory (p); - } -} - -/* ================================================================= */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/alloc_impl.h b/sal/rtl/source/alloc_impl.h deleted file mode 100644 index 490120a3a..000000000 --- a/sal/rtl/source/alloc_impl.h +++ /dev/null @@ -1,274 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_RTL_ALLOC_IMPL_H -#define INCLUDED_RTL_ALLOC_IMPL_H - -#include "sal/types.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** Alignment macros - */ -#if SAL_TYPES_ALIGNMENT4 > 1 -#define RTL_MEMORY_ALIGNMENT_4 SAL_TYPES_ALIGNMENT4 -#else -#define RTL_MEMORY_ALIGNMENT_4 sizeof(int) -#endif /* SAL_TYPES_ALIGNMENT4 */ - -#if SAL_TYPES_ALIGNMENT8 > 1 -#define RTL_MEMORY_ALIGNMENT_8 SAL_TYPES_ALIGNMENT8 -#else -#define RTL_MEMORY_ALIGNMENT_8 sizeof(void*) -#endif /* SAL_TYPES_ALIGNMENT8 */ - -#if 0 /* @@@ */ -#define RTL_MEMORY_ALIGNMENT_1 8 -#define RTL_MEMORY_ALIGNMENT_2 (sizeof(void*) * 2) -#endif /* @@@ */ - -#define RTL_MEMORY_ALIGN(value, align) (((value) + ((align) - 1)) & ~((align) - 1)) - -#define RTL_MEMORY_ISP2(value) (((value) & ((value) - 1)) == 0) -#define RTL_MEMORY_P2ALIGN(value, align) ((value) & -(sal_IntPtr)(align)) - -#define RTL_MEMORY_P2ROUNDUP(value, align) \ - (-(-(sal_IntPtr)(value) & -(sal_IntPtr)(align))) -#define RTL_MEMORY_P2END(value, align) \ - (-(~(sal_IntPtr)(value) & -(sal_IntPtr)(align))) - - -/** Function inlining macros - * (compiler dependent) - */ -#ifndef RTL_MEMORY_INLINE -#if defined(__GNUC__) -#define RTL_MEMORY_INLINE __inline__ -#elif defined(_MSC_VER) -#define RTL_MEMORY_INLINE __inline -#else -#define RTL_MEMORY_INLINE -#endif /* __GNUC__ || _MSC_VER */ -#endif /* RTL_MEMORY_INLINE */ - - -/** printf() format specifier(s) - * (from C90 <sys/int_fmtio.h>) - */ -#ifndef PRIu64 -#if defined(_MSC_VER) -#define PRIu64 "I64u" -#else /* !_MSC_VER */ -#define PRIu64 "llu" -#endif /* !_MSC_VER */ -#endif /* PRIu64 */ - - -/** highbit(): log2() + 1 - * (complexity O(1)) - */ -static RTL_MEMORY_INLINE int -highbit(sal_Size n) -{ - register int k = 1; - - if (n == 0) - return (0); -#if SAL_TYPES_SIZEOFLONG == 8 - if (n & 0xffffffff00000000ul) - k |= 32, n >>= 32; -#endif - if (n & 0xffff0000) - k |= 16, n >>= 16; - if (n & 0xff00) - k |= 8, n >>= 8; - if (n & 0xf0) - k |= 4, n >>= 4; - if (n & 0x0c) - k |= 2, n >>= 2; - if (n & 0x02) - k++; - - return (k); -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(highbit) -#endif /* __SUNPRO_C */ - - -/** lowbit(): find first bit set - * (complexity O(1)) - */ -static RTL_MEMORY_INLINE int -lowbit(sal_Size n) -{ - register int k = 1; - - if (n == 0) - return (0); -#if SAL_TYPES_SIZEOFLONG == 8 - if (!(n & 0xffffffff)) - k |= 32, n >>= 32; -#endif - if (!(n & 0xffff)) - k |= 16, n >>= 16; - if (!(n & 0xff)) - k |= 8, n >>= 8; - if (!(n & 0xf)) - k |= 4, n >>= 4; - if (!(n & 0x3)) - k |= 2, n >>= 2; - if (!(n & 0x1)) - k++; - return (k); -} - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma inline(lowbit) -#endif /* __SUNPRO_C */ - - -/** Queue manipulation macros - * (doubly linked circular list) - * (complexity O(1)) - */ -#define QUEUE_STARTED_NAMED(entry, name) \ - (((entry)->m_##name##next == (entry)) && ((entry)->m_##name##prev == (entry))) - -#define QUEUE_START_NAMED(entry, name) \ -{ \ - (entry)->m_##name##next = (entry); \ - (entry)->m_##name##prev = (entry); \ -} - -#define QUEUE_REMOVE_NAMED(entry, name) \ -{ \ - (entry)->m_##name##prev->m_##name##next = (entry)->m_##name##next; \ - (entry)->m_##name##next->m_##name##prev = (entry)->m_##name##prev; \ - QUEUE_START_NAMED(entry, name); \ -} - -#define QUEUE_INSERT_HEAD_NAMED(head, entry, name) \ -{ \ - (entry)->m_##name##prev = (head); \ - (entry)->m_##name##next = (head)->m_##name##next; \ - (head)->m_##name##next = (entry); \ - (entry)->m_##name##next->m_##name##prev = (entry); \ -} - -#define QUEUE_INSERT_TAIL_NAMED(head, entry, name) \ -{ \ - (entry)->m_##name##next = (head); \ - (entry)->m_##name##prev = (head)->m_##name##prev; \ - (head)->m_##name##prev = (entry); \ - (entry)->m_##name##prev->m_##name##next = (entry); \ -} - - -/** rtl_memory_lock_type - * (platform dependent) - */ -#if defined(SAL_UNX) - -#include <unistd.h> -#include <pthread.h> - -typedef pthread_mutex_t rtl_memory_lock_type; - -#define RTL_MEMORY_LOCK_INIT(lock) pthread_mutex_init((lock), NULL) -#define RTL_MEMORY_LOCK_DESTROY(lock) pthread_mutex_destroy((lock)) - -#define RTL_MEMORY_LOCK_ACQUIRE(lock) pthread_mutex_lock((lock)) -#define RTL_MEMORY_LOCK_RELEASE(lock) pthread_mutex_unlock((lock)) - -#elif defined(SAL_W32) - -#define WIN32_LEAN_AND_MEAN -#ifdef _MSC_VER -#pragma warning(push,1) /* disable warnings within system headers */ -#endif -#include <windows.h> -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -typedef CRITICAL_SECTION rtl_memory_lock_type; - -#define RTL_MEMORY_LOCK_INIT(lock) InitializeCriticalSection((lock)) -#define RTL_MEMORY_LOCK_DESTROY(lock) DeleteCriticalSection((lock)) - -#define RTL_MEMORY_LOCK_ACQUIRE(lock) EnterCriticalSection((lock)) -#define RTL_MEMORY_LOCK_RELEASE(lock) LeaveCriticalSection((lock)) - -#else -#error Unknown platform -#endif /* SAL_UNX | SAL_W32 */ - - -/** Cache creation flags. - * @internal - */ -#define RTL_CACHE_FLAG_NOMAGAZINE (1 << 13) /* w/o magazine layer */ -#define RTL_CACHE_FLAG_QUANTUMCACHE (2 << 13) /* used as arena quantum cache */ - - -/** Valgrind support macros. - */ -#if !defined(HAVE_MEMCHECK_H) || (OSL_DEBUG_LEVEL == 0) -#if !defined(NVALGRIND) -#define NVALGRIND 1 -#endif /* ! NVALGRIND */ -#endif /* ! HAVE_MEMCHECK_H || (OSL_DEBUG_LEVEL == 0) */ - -#if defined(NVALGRIND) -#define VALGRIND_MAKE_MEM_UNDEFINED(addr, size) -#define VALGRIND_MAKE_MEM_DEFINED(addr, size) -#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) -#define VALGRIND_FREELIKE_BLOCK(addr, rzB) -#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) -#define VALGRIND_DESTROY_MEMPOOL(pool) -#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) -#define VALGRIND_MEMPOOL_FREE(pool, addr) -#elif defined(HAVE_MEMCHECK_H) -#include <memcheck.h> -#if !defined(FORCE_SYSALLOC) -#define FORCE_SYSALLOC 1 -#endif /* !FORCE_SYSALLOC */ -#endif /* NVALGRIND || HAVE_MEMCHECK_H */ - -#ifdef __cplusplus -} -#endif - -#endif /* INCLUDED_RTL_ALLOC_IMPL_H */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/bootstrap.cxx b/sal/rtl/source/bootstrap.cxx deleted file mode 100644 index a58dd0e1d..000000000 --- a/sal/rtl/source/bootstrap.cxx +++ /dev/null @@ -1,1054 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include "rtl/bootstrap.h" -#include "rtl/bootstrap.hxx" -#include <osl/diagnose.h> -#include <osl/module.h> -#include <osl/process.h> -#include <osl/file.hxx> -#include <osl/mutex.hxx> -#include <osl/profile.hxx> -#include <osl/security.hxx> -#include <rtl/alloc.h> -#include <rtl/string.hxx> -#include <rtl/ustrbuf.hxx> -#include <rtl/ustring.hxx> -#include <rtl/byteseq.hxx> -#include <rtl/instance.hxx> -#include <rtl/malformeduriexception.hxx> -#include <rtl/uri.hxx> -#include "rtl/allocator.hxx" - -#include "macro.hxx" - -#include <boost/unordered_map.hpp> -#include <list> - -#define MY_STRING_(x) # x -#define MY_STRING(x) MY_STRING_(x) - -//---------------------------------------------------------------------------- - -using osl::DirectoryItem; -using osl::FileStatus; - -using rtl::OString; -using rtl::OUString; -using rtl::OUStringToOString; - -struct Bootstrap_Impl; - -namespace { - -static char const VND_SUN_STAR_PATHNAME[] = "vnd.sun.star.pathname:"; - -bool isPathnameUrl(rtl::OUString const & url) { - return url.matchIgnoreAsciiCaseAsciiL( - RTL_CONSTASCII_STRINGPARAM(VND_SUN_STAR_PATHNAME)); -} - -bool resolvePathnameUrl(rtl::OUString * url) { - OSL_ASSERT(url != NULL); - if (!isPathnameUrl(*url) || - (osl::FileBase::getFileURLFromSystemPath( - url->copy(RTL_CONSTASCII_LENGTH(VND_SUN_STAR_PATHNAME)), *url) == - osl::FileBase::E_None)) - { - return true; - } else { - *url = rtl::OUString(); - return false; - } -} - -enum LookupMode { - LOOKUP_MODE_NORMAL, LOOKUP_MODE_URE_BOOTSTRAP, - LOOKUP_MODE_URE_BOOTSTRAP_EXPANSION }; - -struct ExpandRequestLink { - ExpandRequestLink const * next; - Bootstrap_Impl const * file; - rtl::OUString key; -}; - -rtl::OUString expandMacros( - Bootstrap_Impl const * file, rtl::OUString const & text, LookupMode mode, - ExpandRequestLink const * requestStack); - -rtl::OUString recursivelyExpandMacros( - Bootstrap_Impl const * file, rtl::OUString const & text, LookupMode mode, - Bootstrap_Impl const * requestFile, rtl::OUString const & requestKey, - ExpandRequestLink const * requestStack) -{ - for (; requestStack != NULL; requestStack = requestStack->next) { - if (requestStack->file == requestFile && - requestStack->key == requestKey) - { - return rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM("***RECURSION DETECTED***")); - } - } - ExpandRequestLink link = { requestStack, requestFile, requestKey }; - return expandMacros(file, text, mode, &link); -} - -} - -//---------------------------------------------------------------------------- - -struct rtl_bootstrap_NameValue -{ - OUString sName; - OUString sValue; - - inline rtl_bootstrap_NameValue() SAL_THROW( () ) - {} - inline rtl_bootstrap_NameValue( - OUString const & name, OUString const & value ) SAL_THROW( () ) - : sName( name ), - sValue( value ) - {} -}; - -typedef std::list< - rtl_bootstrap_NameValue, - rtl::Allocator< rtl_bootstrap_NameValue > -> NameValueList; - -bool find( - NameValueList const & list, rtl::OUString const & key, - rtl::OUString * value) -{ - OSL_ASSERT(value != NULL); - for (NameValueList::const_iterator i(list.begin()); i != list.end(); ++i) { - if (i->sName == key) { - *value = i->sValue; - return true; - } - } - return false; -} - -namespace { - struct rtl_bootstrap_set_list : - public rtl::Static< NameValueList, rtl_bootstrap_set_list > {}; -} - -//---------------------------------------------------------------------------- - -static sal_Bool getFromCommandLineArgs( - rtl::OUString const & key, rtl::OUString * value ) -{ - OSL_ASSERT(value != NULL); - static NameValueList *pNameValueList = 0; - if( ! pNameValueList ) - { - static NameValueList nameValueList; - - sal_Int32 nArgCount = osl_getCommandArgCount(); - for(sal_Int32 i = 0; i < nArgCount; ++ i) - { - rtl_uString *pArg = 0; - osl_getCommandArg( i, &pArg ); - if( ('-' == pArg->buffer[0] || '/' == pArg->buffer[0] ) && - 'e' == pArg->buffer[1] && - 'n' == pArg->buffer[2] && - 'v' == pArg->buffer[3] && - ':' == pArg->buffer[4] ) - { - sal_Int32 nIndex = rtl_ustr_indexOfChar( pArg->buffer, '=' ); - if( nIndex >= 0 ) - { - - rtl_bootstrap_NameValue nameValue; - nameValue.sName = OUString( &(pArg->buffer[5]), nIndex - 5 ); - nameValue.sValue = OUString( &(pArg->buffer[nIndex+1]) ); - if( i == nArgCount-1 && - nameValue.sValue.getLength() && - nameValue.sValue[nameValue.sValue.getLength()-1] == 13 ) - { - // avoid the 13 linefeed for the last argument, - // when the executable is started from a script, - // that was edited on windows - nameValue.sValue = nameValue.sValue.copy(0,nameValue.sValue.getLength()-1); - } - nameValueList.push_back( nameValue ); - } - } - rtl_uString_release( pArg ); - } - pNameValueList = &nameValueList; - } - - sal_Bool found = sal_False; - - for( NameValueList::iterator ii = pNameValueList->begin() ; - ii != pNameValueList->end() ; - ++ii ) - { - if( (*ii).sName.equals(key) ) - { - *value = (*ii).sValue; - found = sal_True; - break; - } - } - - return found; -} - -//---------------------------------------------------------------------------- - -extern "C" oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl ( - rtl_uString ** ppFileURL) SAL_THROW_EXTERN_C(); - -inline void getExecutableFile_Impl (rtl_uString ** ppFileURL) -{ - osl_bootstrap_getExecutableFile_Impl (ppFileURL); -} - -//---------------------------------------------------------------------------- - -static void getExecutableDirectory_Impl (rtl_uString ** ppDirURL) -{ - OUString fileName; - getExecutableFile_Impl (&(fileName.pData)); - - sal_Int32 nDirEnd = fileName.lastIndexOf('/'); - OSL_ENSURE(nDirEnd >= 0, "Cannot locate executable directory"); - - rtl_uString_newFromStr_WithLength(ppDirURL,fileName.getStr(),nDirEnd); -} - -//---------------------------------------------------------------------------- - -static OUString & getIniFileName_Impl() -{ - static OUString *pStaticName = 0; - if( ! pStaticName ) - { - OUString fileName; - - if(getFromCommandLineArgs( - OUString(RTL_CONSTASCII_USTRINGPARAM("INIFILENAME")), &fileName)) - { - resolvePathnameUrl(&fileName); - } - else - { - getExecutableFile_Impl (&(fileName.pData)); - - // get rid of a potential executable extension - OUString progExt (RTL_CONSTASCII_USTRINGPARAM(".bin")); - if(fileName.getLength() > progExt.getLength() - && fileName.copy(fileName.getLength() - progExt.getLength()).equalsIgnoreAsciiCase(progExt)) - fileName = fileName.copy(0, fileName.getLength() - progExt.getLength()); - - progExt = OUString(RTL_CONSTASCII_USTRINGPARAM(".exe")); - if(fileName.getLength() > progExt.getLength() - && fileName.copy(fileName.getLength() - progExt.getLength()).equalsIgnoreAsciiCase(progExt)) - fileName = fileName.copy(0, fileName.getLength() - progExt.getLength()); - - // append config file suffix - fileName += OUString(RTL_CONSTASCII_USTRINGPARAM(SAL_CONFIGFILE(""))); - } - - static OUString theFileName; - if(fileName.getLength()) - theFileName = fileName; - - pStaticName = &theFileName; - } - - return *pStaticName; -} - -//---------------------------------------------------------------------------- - -static inline bool path_exists( OUString const & path ) -{ - DirectoryItem dirItem; - return (DirectoryItem::E_None == DirectoryItem::get( path, dirItem )); -} - -//---------------------------------------------------------------------------- -// #111772# -// ensure the given file url has no final slash - -inline void EnsureNoFinalSlash (rtl::OUString & url) -{ - sal_Int32 i = url.getLength(); - if (i > 0 && url[i - 1] == '/') { - url = url.copy(0, i - 1); - } -} - -struct Bootstrap_Impl -{ - sal_Int32 _nRefCount; - Bootstrap_Impl * _base_ini; - - NameValueList _nameValueList; - OUString _iniName; - - explicit Bootstrap_Impl (OUString const & rIniName); - ~Bootstrap_Impl(); - - static void * operator new (std::size_t n) SAL_THROW(()) - { return rtl_allocateMemory (sal_uInt32(n)); } - static void operator delete (void * p , std::size_t) SAL_THROW(()) - { rtl_freeMemory (p); } - - bool getValue( - rtl::OUString const & key, rtl_uString ** value, - rtl_uString * defaultValue, LookupMode mode, bool override, - ExpandRequestLink const * requestStack) const; - bool getDirectValue( - rtl::OUString const & key, rtl_uString ** value, LookupMode mode, - ExpandRequestLink const * requestStack) const; - bool getAmbienceValue( - rtl::OUString const & key, rtl_uString ** value, LookupMode mode, - ExpandRequestLink const * requestStack) const; - void expandValue( - rtl_uString ** value, rtl::OUString const & text, LookupMode mode, - Bootstrap_Impl const * requestFile, rtl::OUString const & requestKey, - ExpandRequestLink const * requestStack) const; -}; - -//---------------------------------------------------------------------------- - -Bootstrap_Impl::Bootstrap_Impl( OUString const & rIniName ) - : _nRefCount( 0 ), - _base_ini( 0 ), - _iniName (rIniName) -{ - OUString base_ini( getIniFileName_Impl() ); - // normalize path - FileStatus status( osl_FileStatus_Mask_FileURL ); - DirectoryItem dirItem; - if (DirectoryItem::E_None == DirectoryItem::get( base_ini, dirItem ) && - DirectoryItem::E_None == dirItem.getFileStatus( status )) - { - base_ini = status.getFileURL(); - if (! rIniName.equals( base_ini )) - { - _base_ini = static_cast< Bootstrap_Impl * >( - rtl_bootstrap_args_open( base_ini.pData ) ); - } - } - -#if OSL_DEBUG_LEVEL > 1 - OString sFile = OUStringToOString(_iniName, RTL_TEXTENCODING_ASCII_US); - OSL_TRACE(__FILE__" -- Bootstrap_Impl() - %s\n", sFile.getStr()); -#endif /* OSL_DEBUG_LEVEL > 1 */ - - oslFileHandle handle; - if (_iniName.getLength() && - osl_File_E_None == osl_openFile(_iniName.pData, &handle, osl_File_OpenFlag_Read)) - { - rtl::ByteSequence seq; - - while (osl_File_E_None == osl_readLine(handle , (sal_Sequence **)&seq)) - { - OString line( (const sal_Char *) seq.getConstArray(), seq.getLength() ); - sal_Int32 nIndex = line.indexOf('='); - if (nIndex >= 1) - { - struct rtl_bootstrap_NameValue nameValue; - nameValue.sName = OStringToOUString( - line.copy(0,nIndex).trim(), RTL_TEXTENCODING_ASCII_US ); - nameValue.sValue = OStringToOUString( - line.copy(nIndex+1).trim(), RTL_TEXTENCODING_UTF8 ); - -#if OSL_DEBUG_LEVEL > 1 - OString name_tmp = OUStringToOString(nameValue.sName, RTL_TEXTENCODING_ASCII_US); - OString value_tmp = OUStringToOString(nameValue.sValue, RTL_TEXTENCODING_UTF8); - OSL_TRACE( - __FILE__" -- pushing: name=%s value=%s\n", - name_tmp.getStr(), value_tmp.getStr() ); -#endif /* OSL_DEBUG_LEVEL > 1 */ - - _nameValueList.push_back(nameValue); - } - } - osl_closeFile(handle); - } -#if OSL_DEBUG_LEVEL > 1 - else - { - OString file_tmp = OUStringToOString(_iniName, RTL_TEXTENCODING_ASCII_US); - OSL_TRACE( __FILE__" -- couldn't open file: %s", file_tmp.getStr() ); - } -#endif /* OSL_DEBUG_LEVEL > 1 */ -} - -//---------------------------------------------------------------------------- - -Bootstrap_Impl::~Bootstrap_Impl() -{ - if (_base_ini != 0) - rtl_bootstrap_args_close( _base_ini ); -} - -//---------------------------------------------------------------------------- - -namespace { - -Bootstrap_Impl * get_static_bootstrap_handle() SAL_THROW(()) -{ - osl::MutexGuard guard( osl::Mutex::getGlobalMutex() ); - static Bootstrap_Impl * s_handle = 0; - if (s_handle == 0) - { - OUString iniName (getIniFileName_Impl()); - s_handle = static_cast< Bootstrap_Impl * >( - rtl_bootstrap_args_open( iniName.pData ) ); - if (s_handle == 0) - { - Bootstrap_Impl * that = new Bootstrap_Impl( iniName ); - ++that->_nRefCount; - s_handle = that; - } - } - return s_handle; -} - -struct FundamentalIniData { - rtlBootstrapHandle ini; - - FundamentalIniData() { - OUString uri; - ini = - ((static_cast< Bootstrap_Impl * >(get_static_bootstrap_handle())-> - getValue( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM("URE_BOOTSTRAP")), - &uri.pData, 0, LOOKUP_MODE_NORMAL, false, 0)) && - resolvePathnameUrl(&uri)) - ? rtl_bootstrap_args_open(uri.pData) : NULL; - } - - ~FundamentalIniData() { rtl_bootstrap_args_close(ini); } - -private: - FundamentalIniData(FundamentalIniData &); // not defined - void operator =(FundamentalIniData &); // not defined -}; - -struct FundamentalIni: public rtl::Static< FundamentalIniData, FundamentalIni > -{}; - -} - -bool Bootstrap_Impl::getValue( - rtl::OUString const & key, rtl_uString ** value, rtl_uString * defaultValue, - LookupMode mode, bool override, ExpandRequestLink const * requestStack) - const -{ - if (mode == LOOKUP_MODE_NORMAL && - key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("URE_BOOTSTRAP"))) - { - mode = LOOKUP_MODE_URE_BOOTSTRAP; - } - if (override && getDirectValue(key, value, mode, requestStack)) { - return true; - } - if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("_OS"))) { - rtl_uString_assign( - value, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(THIS_OS)).pData); - return true; - } - if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("_ARCH"))) { - rtl_uString_assign( - value, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(THIS_ARCH)).pData); - return true; - } - if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("_CPPU_ENV"))) { - rtl_uString_assign( - value, - (rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(MY_STRING(CPPU_ENV))). - pData)); - return true; - } - if (key.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ORIGIN"))) { - rtl_uString_assign( - value, - _iniName.copy( - 0, std::max<sal_Int32>(0, _iniName.lastIndexOf('/'))).pData); - return true; - } - if (getAmbienceValue(key, value, mode, requestStack)) { - return true; - } - if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("SYSUSERCONFIG"))) { - rtl::OUString v; - bool b = osl::Security().getConfigDir(v); - EnsureNoFinalSlash(v); - rtl_uString_assign(value, v.pData); - return b; - } - if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("SYSUSERHOME"))) { - rtl::OUString v; - bool b = osl::Security().getHomeDir(v); - EnsureNoFinalSlash(v); - rtl_uString_assign(value, v.pData); - return b; - } - if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("SYSBINDIR"))) { - getExecutableDirectory_Impl(value); - return true; - } - if (_base_ini != NULL && - _base_ini->getDirectValue(key, value, mode, requestStack)) - { - return true; - } - if (!override && getDirectValue(key, value, mode, requestStack)) { - return true; - } - if (mode == LOOKUP_MODE_NORMAL) { - FundamentalIniData const & d = FundamentalIni::get(); - Bootstrap_Impl const * b = static_cast<Bootstrap_Impl const *>(d.ini); - if (b != NULL && b != this && - b->getDirectValue(key, value, mode, requestStack)) - { - return true; - } - } - if (defaultValue != NULL) { - rtl_uString_assign(value, defaultValue); - return true; - } - rtl_uString_new(value); - return false; -} - -bool Bootstrap_Impl::getDirectValue( - rtl::OUString const & key, rtl_uString ** value, LookupMode mode, - ExpandRequestLink const * requestStack) const -{ - rtl::OUString v; - if (find(_nameValueList, key, &v)) { - expandValue(value, v, mode, this, key, requestStack); - return true; - } else { - return false; - } -} - -bool Bootstrap_Impl::getAmbienceValue( - rtl::OUString const & key, rtl_uString ** value, LookupMode mode, - ExpandRequestLink const * requestStack) const -{ - rtl::OUString v; - bool f; - { - osl::MutexGuard g(osl::Mutex::getGlobalMutex()); - f = find(rtl_bootstrap_set_list::get(), key, &v); - } - if (f || getFromCommandLineArgs(key, &v) || - osl_getEnvironment(key.pData, &v.pData) == osl_Process_E_None) - { - expandValue(value, v, mode, NULL, key, requestStack); - return true; - } else { - return false; - } -} - -void Bootstrap_Impl::expandValue( - rtl_uString ** value, rtl::OUString const & text, LookupMode mode, - Bootstrap_Impl const * requestFile, rtl::OUString const & requestKey, - ExpandRequestLink const * requestStack) const -{ - rtl_uString_assign( - value, - (mode == LOOKUP_MODE_URE_BOOTSTRAP && isPathnameUrl(text) ? - text : - recursivelyExpandMacros( - this, text, - (mode == LOOKUP_MODE_URE_BOOTSTRAP ? - LOOKUP_MODE_URE_BOOTSTRAP_EXPANSION : mode), - requestFile, requestKey, requestStack)).pData); -} - -namespace { - -struct bootstrap_map { - typedef boost::unordered_map< - rtl::OUString, Bootstrap_Impl *, - rtl::OUStringHash, std::equal_to< rtl::OUString >, - rtl::Allocator< OUString > > t; - - // get and release must only be called properly synchronized via some mutex - // (e.g., osl::Mutex::getGlobalMutex()): - - static t * get() { - if (m_map == NULL) { - m_map = new t; - } - return m_map; - } - - static void release() { - if (m_map != NULL && m_map->empty()) { - delete m_map; - m_map = NULL; - } - } - -private: - bootstrap_map(); // not defined - - static t * m_map; -}; - -bootstrap_map::t * bootstrap_map::m_map = NULL; - -} - -//---------------------------------------------------------------------------- - -rtlBootstrapHandle SAL_CALL rtl_bootstrap_args_open ( - rtl_uString * pIniName -) SAL_THROW_EXTERN_C() -{ - OUString iniName( pIniName ); - - // normalize path - FileStatus status( osl_FileStatus_Mask_FileURL ); - DirectoryItem dirItem; - if (DirectoryItem::E_None != DirectoryItem::get( iniName, dirItem ) || - DirectoryItem::E_None != dirItem.getFileStatus( status )) - { - return 0; - } - iniName = status.getFileURL(); - - Bootstrap_Impl * that; - osl::ResettableMutexGuard guard( osl::Mutex::getGlobalMutex() ); - bootstrap_map::t* p_bootstrap_map = bootstrap_map::get(); - bootstrap_map::t::const_iterator iFind( p_bootstrap_map->find( iniName ) ); - if (iFind == p_bootstrap_map->end()) - { - bootstrap_map::release(); - guard.clear(); - that = new Bootstrap_Impl( iniName ); - guard.reset(); - p_bootstrap_map = bootstrap_map::get(); - iFind = p_bootstrap_map->find( iniName ); - if (iFind == p_bootstrap_map->end()) - { - ++that->_nRefCount; - ::std::pair< bootstrap_map::t::iterator, bool > insertion( - p_bootstrap_map->insert( - bootstrap_map::t::value_type( iniName, that ) ) ); - OSL_ASSERT( insertion.second ); - } - else - { - Bootstrap_Impl * obsolete = that; - that = iFind->second; - ++that->_nRefCount; - guard.clear(); - delete obsolete; - } - } - else - { - that = iFind->second; - ++that->_nRefCount; - } - return static_cast< rtlBootstrapHandle >( that ); -} - -//---------------------------------------------------------------------------- - -void SAL_CALL rtl_bootstrap_args_close ( - rtlBootstrapHandle handle -) SAL_THROW_EXTERN_C() -{ - if (handle == 0) - return; - Bootstrap_Impl * that = static_cast< Bootstrap_Impl * >( handle ); - - osl::MutexGuard guard( osl::Mutex::getGlobalMutex() ); - bootstrap_map::t* p_bootstrap_map = bootstrap_map::get(); - OSL_ASSERT( - p_bootstrap_map->find( that->_iniName )->second == that ); - --that->_nRefCount; - if (that->_nRefCount == 0) - { - ::std::size_t nLeaking = 8; // only hold up to 8 files statically - -#if OSL_DEBUG_LEVEL == 1 // nonpro - nLeaking = 0; -#elif OSL_DEBUG_LEVEL > 1 // debug - nLeaking = 1; -#endif /* OSL_DEBUG_LEVEL */ - - if (p_bootstrap_map->size() > nLeaking) - { - ::std::size_t erased = p_bootstrap_map->erase( that->_iniName ); - if (erased != 1) { - OSL_ASSERT( false ); - } - delete that; - } - bootstrap_map::release(); - } -} - -//---------------------------------------------------------------------------- - -sal_Bool SAL_CALL rtl_bootstrap_get_from_handle( - rtlBootstrapHandle handle, - rtl_uString * pName, - rtl_uString ** ppValue, - rtl_uString * pDefault -) SAL_THROW_EXTERN_C() -{ - osl::MutexGuard guard( osl::Mutex::getGlobalMutex() ); - - sal_Bool found = sal_False; - if(ppValue && pName) - { - if (handle == 0) - handle = get_static_bootstrap_handle(); - found = static_cast< Bootstrap_Impl * >( handle )->getValue( - pName, ppValue, pDefault, LOOKUP_MODE_NORMAL, false, NULL ); - } - - return found; -} - -//---------------------------------------------------------------------------- - -void SAL_CALL rtl_bootstrap_get_iniName_from_handle ( - rtlBootstrapHandle handle, - rtl_uString ** ppIniName -) SAL_THROW_EXTERN_C() -{ - if(ppIniName) - { - if(handle) - { - Bootstrap_Impl * pImpl = static_cast<Bootstrap_Impl*>(handle); - rtl_uString_assign(ppIniName, pImpl->_iniName.pData); - } - else - { - const OUString & iniName = getIniFileName_Impl(); - rtl_uString_assign(ppIniName, iniName.pData); - } - } -} - -//---------------------------------------------------------------------------- - -void SAL_CALL rtl_bootstrap_setIniFileName ( - rtl_uString * pName -) SAL_THROW_EXTERN_C() -{ - osl::MutexGuard guard( osl::Mutex::getGlobalMutex() ); - OUString & file = getIniFileName_Impl(); - file = pName; -} - -//---------------------------------------------------------------------------- - -sal_Bool SAL_CALL rtl_bootstrap_get ( - rtl_uString * pName, - rtl_uString ** ppValue, - rtl_uString * pDefault -) SAL_THROW_EXTERN_C() -{ - return rtl_bootstrap_get_from_handle(0, pName, ppValue, pDefault); -} - -//---------------------------------------------------------------------------- - -void SAL_CALL rtl_bootstrap_set ( - rtl_uString * pName, - rtl_uString * pValue -) SAL_THROW_EXTERN_C() -{ - const OUString name( pName ); - const OUString value( pValue ); - - osl::MutexGuard guard( osl::Mutex::getGlobalMutex() ); - - NameValueList& r_rtl_bootstrap_set_list = rtl_bootstrap_set_list::get(); - NameValueList::iterator iPos( r_rtl_bootstrap_set_list.begin() ); - NameValueList::iterator iEnd( r_rtl_bootstrap_set_list.end() ); - for ( ; iPos != iEnd; ++iPos ) - { - if (iPos->sName.equals( name )) - { - iPos->sValue = value; - return; - } - } - -#if OSL_DEBUG_LEVEL > 1 - OString cstr_name( OUStringToOString( name, RTL_TEXTENCODING_ASCII_US ) ); - OString cstr_value( OUStringToOString( value, RTL_TEXTENCODING_ASCII_US ) ); - OSL_TRACE( - "bootstrap.cxx: explicitly setting: name=%s value=%s\n", - cstr_name.getStr(), cstr_value.getStr() ); -#endif /* OSL_DEBUG_LEVEL > 1 */ - - r_rtl_bootstrap_set_list.push_back( rtl_bootstrap_NameValue( name, value ) ); -} - -//---------------------------------------------------------------------------- - -void SAL_CALL rtl_bootstrap_expandMacros_from_handle ( - rtlBootstrapHandle handle, - rtl_uString ** macro -) SAL_THROW_EXTERN_C() -{ - if (handle == NULL) { - handle = get_static_bootstrap_handle(); - } - OUString expanded( expandMacros( static_cast< Bootstrap_Impl * >( handle ), - * reinterpret_cast< OUString const * >( macro ), - LOOKUP_MODE_NORMAL, NULL ) ); - rtl_uString_assign( macro, expanded.pData ); -} - -//---------------------------------------------------------------------------- - -void SAL_CALL rtl_bootstrap_expandMacros( - rtl_uString ** macro ) - SAL_THROW_EXTERN_C() -{ - rtl_bootstrap_expandMacros_from_handle(NULL, macro); -} - -void rtl_bootstrap_encode( rtl_uString const * value, rtl_uString ** encoded ) - SAL_THROW_EXTERN_C() -{ - OSL_ASSERT(value != NULL); - rtl::OUStringBuffer b; - for (sal_Int32 i = 0; i < value->length; ++i) { - sal_Unicode c = value->buffer[i]; - if (c == '$' || c == '\\') { - b.append(sal_Unicode('\\')); - } - b.append(c); - } - rtl_uString_assign(encoded, b.makeStringAndClear().pData); -} - -namespace { - -int hex(sal_Unicode c) { - return - c >= '0' && c <= '9' ? c - '0' : - c >= 'A' && c <= 'F' ? c - 'A' + 10 : - c >= 'a' && c <= 'f' ? c - 'a' + 10 : -1; -} - -sal_Unicode read(rtl::OUString const & text, sal_Int32 * pos, bool * escaped) { - OSL_ASSERT( - pos != NULL && *pos >= 0 && *pos < text.getLength() && escaped != NULL); - sal_Unicode c = text[(*pos)++]; - if (c == '\\') { - int n1, n2, n3, n4; - if (*pos < text.getLength() - 4 && text[*pos] == 'u' && - ((n1 = hex(text[*pos + 1])) >= 0) && - ((n2 = hex(text[*pos + 2])) >= 0) && - ((n3 = hex(text[*pos + 3])) >= 0) && - ((n4 = hex(text[*pos + 4])) >= 0)) - { - *pos += 5; - *escaped = true; - return static_cast< sal_Unicode >( - (n1 << 12) | (n2 << 8) | (n3 << 4) | n4); - } else if (*pos < text.getLength()) { - *escaped = true; - return text[(*pos)++]; - } - } - *escaped = false; - return c; -} - -rtl::OUString lookup( - Bootstrap_Impl const * file, LookupMode mode, bool override, - rtl::OUString const & key, ExpandRequestLink const * requestStack) -{ - rtl::OUString v; - (file == NULL ? get_static_bootstrap_handle() : file)->getValue( - key, &v.pData, NULL, mode, override, requestStack); - return v; -} - -rtl::OUString expandMacros( - Bootstrap_Impl const * file, rtl::OUString const & text, LookupMode mode, - ExpandRequestLink const * requestStack) -{ - rtl::OUStringBuffer buf; - for (sal_Int32 i = 0; i < text.getLength();) { - bool escaped; - sal_Unicode c = read(text, &i, &escaped); - if (escaped || c != '$') { - buf.append(c); - } else { - if (i < text.getLength() && text[i] == '{') { - ++i; - sal_Int32 p = i; - sal_Int32 nesting = 0; - rtl::OUString seg[3]; - int n = 0; - while (i < text.getLength()) { - sal_Int32 j = i; - c = read(text, &i, &escaped); - if (!escaped) { - switch (c) { - case '{': - ++nesting; - break; - case '}': - if (nesting == 0) { - seg[n++] = text.copy(p, j - p); - goto done; - } else { - --nesting; - } - break; - case ':': - if (nesting == 0 && n < 2) { - seg[n++] = text.copy(p, j - p); - p = i; - } - break; - } - } - } - done: - for (int j = 0; j < n; ++j) { - seg[j] = expandMacros(file, seg[j], mode, requestStack); - } - if (n == 3 && seg[1].getLength() == 0) { - // For backward compatibility, treat ${file::key} the same - // as just ${file:key}: - seg[1] = seg[2]; - n = 2; - } - if (n == 1) { - buf.append(lookup(file, mode, false, seg[0], requestStack)); - } else if (n == 2) { - if (seg[0].equalsAsciiL( - RTL_CONSTASCII_STRINGPARAM(".link"))) - { - osl::File f(seg[1]); - rtl::ByteSequence seq; - rtl::OUString line; - rtl::OUString url; - // Silently ignore any errors (is that good?): - if (f.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None && - f.readLine(seq) == osl::FileBase::E_None && - rtl_convertStringToUString( - &line.pData, - reinterpret_cast< char const * >( - seq.getConstArray()), - seq.getLength(), RTL_TEXTENCODING_UTF8, - (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR | - RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR | - RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)) && - (osl::File::getFileURLFromSystemPath(line, url) == - osl::FileBase::E_None)) - { - try { - buf.append( - rtl::Uri::convertRelToAbs(seg[1], url)); - } catch (const rtl::MalformedUriException &) {} - } - } else { - buf.append( - lookup( - static_cast< Bootstrap_Impl * >( - rtl::Bootstrap(seg[0]).getHandle()), - mode, false, seg[1], requestStack)); - } - } else if (seg[0].equalsAsciiL( - RTL_CONSTASCII_STRINGPARAM(".override"))) - { - rtl::Bootstrap b(seg[1]); - Bootstrap_Impl * f = static_cast< Bootstrap_Impl * >( - b.getHandle()); - buf.append( - lookup(f, mode, f != NULL, seg[2], requestStack)); - } else { - // Going through osl::Profile, this code erroneously does - // not recursively expand macros in the resulting - // replacement text (and if it did, it would fail to detect - // cycles that pass through here): - buf.append( - rtl::OStringToOUString( - osl::Profile(seg[0]).readString( - rtl::OUStringToOString( - seg[1], RTL_TEXTENCODING_UTF8), - rtl::OUStringToOString( - seg[2], RTL_TEXTENCODING_UTF8), - rtl::OString()), - RTL_TEXTENCODING_UTF8)); - } - } else { - rtl::OUStringBuffer kbuf; - for (; i < text.getLength();) { - sal_Int32 j = i; - c = read(text, &j, &escaped); - if (!escaped && - (c == ' ' || c == '$' || c == '-' || c == '/' || - c == ';' || c == '\\')) - { - break; - } - kbuf.append(c); - i = j; - } - buf.append( - lookup( - file, mode, false, kbuf.makeStringAndClear(), - requestStack)); - } - } - } - return buf.makeStringAndClear(); -} - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/byteseq.c b/sal/rtl/source/byteseq.c deleted file mode 100644 index 5d72497ec..000000000 --- a/sal/rtl/source/byteseq.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <osl/diagnose.h> -#include <osl/interlck.h> - -#include <rtl/byteseq.h> -#include <rtl/alloc.h> -#include <rtl/memory.h> - -/* static data to be referenced by all empty strings - * the refCount is predefined to 1 and must never become 0 ! - */ -static sal_Sequence aEmpty_rtl_ByteSeq = -{ - 1, /* sal_Int32 refCount; */ - 0, /* sal_Int32 length; */ - { 0 } /* sal_Unicode buffer[1]; */ -}; - -//================================================================================================== -void SAL_CALL rtl_byte_sequence_reference2One( - sal_Sequence ** ppSequence ) -{ - sal_Sequence * pSequence, * pNew; - sal_Int32 nElements; - - OSL_ENSURE( ppSequence, "### null ptr!" ); - pSequence = *ppSequence; - - if (pSequence->nRefCount > 1) - { - nElements = pSequence->nElements; - if (nElements) - { - pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nElements ); - - if ( pNew != 0 ) - rtl_copyMemory( pNew->elements, pSequence->elements, nElements ); - - if (! osl_decrementInterlockedCount( &pSequence->nRefCount )) - rtl_freeMemory( pSequence ); - } - else - { - pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE ); - } - - if ( pNew != 0 ) - { - pNew->nRefCount = 1; - pNew->nElements = nElements; - } - - *ppSequence = pNew; - } -} - -//================================================================================================== -void SAL_CALL rtl_byte_sequence_realloc( - sal_Sequence ** ppSequence, sal_Int32 nSize ) -{ - sal_Sequence * pSequence, * pNew; - sal_Int32 nElements; - - OSL_ENSURE( ppSequence, "### null ptr!" ); - pSequence = *ppSequence; - nElements = pSequence->nElements; - - if (nElements == nSize) - return; - - if (pSequence->nRefCount > 1) // split - { - pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nSize ); - - if ( pNew != 0 ) - { - if (nSize > nElements) - { - rtl_copyMemory( pNew->elements, pSequence->elements, nElements ); - rtl_zeroMemory( pNew->elements + nElements, nSize - nElements ); - } - else - { - rtl_copyMemory( pNew->elements, pSequence->elements, nSize ); - } - } - - if (! osl_decrementInterlockedCount( &pSequence->nRefCount )) - rtl_freeMemory( pSequence ); - pSequence = pNew; - } - else - { - pSequence = (sal_Sequence *)rtl_reallocateMemory( - pSequence, SAL_SEQUENCE_HEADER_SIZE + nSize ); - } - - if ( pSequence != 0 ) - { - pSequence->nRefCount = 1; - pSequence->nElements = nSize; - } - - *ppSequence = pSequence; -} - -//================================================================================================== -void SAL_CALL rtl_byte_sequence_acquire( sal_Sequence *pSequence ) -{ - OSL_ASSERT( pSequence ); - osl_incrementInterlockedCount( &(pSequence->nRefCount) ); -} - -//================================================================================================== -void SAL_CALL rtl_byte_sequence_release( sal_Sequence *pSequence ) -{ - if ( pSequence != 0 ) - { - if (! osl_decrementInterlockedCount( &(pSequence->nRefCount )) ) - { - rtl_freeMemory( pSequence ); - } - } -} - -//================================================================================================== -void SAL_CALL rtl_byte_sequence_construct( sal_Sequence **ppSequence , sal_Int32 nLength ) -{ - OSL_ASSERT( ppSequence ); - if( *ppSequence ) - { - rtl_byte_sequence_release( *ppSequence ); - *ppSequence = 0; - } - - if( nLength ) - { - *ppSequence = (sal_Sequence *) rtl_allocateZeroMemory( SAL_SEQUENCE_HEADER_SIZE + nLength ); - - if ( *ppSequence != 0 ) - { - (*ppSequence)->nRefCount = 1; - (*ppSequence)->nElements = nLength; - } - } - else - { - *ppSequence = &aEmpty_rtl_ByteSeq; - rtl_byte_sequence_acquire( *ppSequence ); - } -} - -//================================================================================================== -void SAL_CALL rtl_byte_sequence_constructNoDefault( sal_Sequence **ppSequence , sal_Int32 nLength ) -{ - OSL_ASSERT( ppSequence ); - if( *ppSequence ) - { - rtl_byte_sequence_release( *ppSequence ); - *ppSequence = 0; - } - - *ppSequence = (sal_Sequence *) rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nLength ); - - if ( *ppSequence != 0 ) - { - (*ppSequence)->nRefCount = 1; - (*ppSequence)->nElements = nLength; - } -} - -//================================================================================================== -void SAL_CALL rtl_byte_sequence_constructFromArray( - sal_Sequence **ppSequence, const sal_Int8 *pData , sal_Int32 nLength ) -{ - rtl_byte_sequence_constructNoDefault( ppSequence , nLength ); - if ( *ppSequence != 0 ) - rtl_copyMemory( (*ppSequence)->elements, pData, nLength ); -} - -//================================================================================================== -void SAL_CALL rtl_byte_sequence_assign( sal_Sequence **ppSequence , sal_Sequence *pSequence ) -{ - if ( *ppSequence != pSequence) - { - if( *ppSequence ) - { - rtl_byte_sequence_release( *ppSequence ); - } - *ppSequence = pSequence; - rtl_byte_sequence_acquire( *ppSequence ); - } -// else -// nothing to do - -} - -//================================================================================================== -sal_Bool SAL_CALL rtl_byte_sequence_equals( sal_Sequence *pSequence1 , sal_Sequence *pSequence2 ) -{ - OSL_ASSERT( pSequence1 ); - OSL_ASSERT( pSequence2 ); - if (pSequence1 == pSequence2) - { - return sal_True; - } - if (pSequence1->nElements != pSequence2->nElements) - { - return sal_False; - } - return (sal_Bool) - (rtl_compareMemory( - pSequence1->elements, pSequence2->elements, pSequence1->nElements ) - == 0); -} - - -//================================================================================================== -const sal_Int8 *SAL_CALL rtl_byte_sequence_getConstArray( sal_Sequence *pSequence ) -{ - return ((const sal_Int8*)(pSequence->elements)); -} - -//================================================================================================== -sal_Int32 SAL_CALL rtl_byte_sequence_getLength( sal_Sequence *pSequence ) -{ - return pSequence->nElements; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/cipher.c b/sal/rtl/source/cipher.c deleted file mode 100644 index 1b750b0a8..000000000 --- a/sal/rtl/source/cipher.c +++ /dev/null @@ -1,1365 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#define _RTL_CIPHER_C_ - -#include <sal/types.h> -#include <rtl/alloc.h> -#include <rtl/memory.h> -#include <rtl/cipher.h> - -/*======================================================================== - * - * rtlCipher internals. - * - *======================================================================*/ -#define RTL_CIPHER_NTOHL(c, l) \ - ((l) = ((sal_uInt32)(*((c)++))) << 24L, \ - (l) |= ((sal_uInt32)(*((c)++))) << 16L, \ - (l) |= ((sal_uInt32)(*((c)++))) << 8L, \ - (l) |= ((sal_uInt32)(*((c)++)))) - -#define RTL_CIPHER_HTONL(l, c) \ - (*((c)++) = (sal_uInt8)(((l) >> 24L) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) >> 16L) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) >> 8L) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) ) & 0xff)) - -#define RTL_CIPHER_NTOHL64(c, xl, xr, n) \ -{ \ - (xl) = (xr) = 0; \ - (c) += (n); \ - switch ((n)) \ - { \ - case 8: (xr) = ((sal_uInt32)(*(--(c)))); \ - case 7: (xr) |= ((sal_uInt32)(*(--(c)))) << 8L; \ - case 6: (xr) |= ((sal_uInt32)(*(--(c)))) << 16L; \ - case 5: (xr) |= ((sal_uInt32)(*(--(c)))) << 24L; \ - case 4: (xl) = ((sal_uInt32)(*(--(c)))); \ - case 3: (xl) |= ((sal_uInt32)(*(--(c)))) << 8L; \ - case 2: (xl) |= ((sal_uInt32)(*(--(c)))) << 16L; \ - case 1: (xl) |= ((sal_uInt32)(*(--(c)))) << 24L; \ - } \ -} - -#define RTL_CIPHER_HTONL64(xl, xr, c, n) \ -{ \ - (c) += (n); \ - switch ((n)) \ - { \ - case 8: *(--(c)) = (sal_uInt8)(((xr) ) & 0xff); \ - case 7: *(--(c)) = (sal_uInt8)(((xr) >> 8L) & 0xff); \ - case 6: *(--(c)) = (sal_uInt8)(((xr) >> 16L) & 0xff); \ - case 5: *(--(c)) = (sal_uInt8)(((xr) >> 24L) & 0xff); \ - case 4: *(--(c)) = (sal_uInt8)(((xl) ) & 0xff); \ - case 3: *(--(c)) = (sal_uInt8)(((xl) >> 8L) & 0xff); \ - case 2: *(--(c)) = (sal_uInt8)(((xl) >> 16L) & 0xff); \ - case 1: *(--(c)) = (sal_uInt8)(((xl) >> 24L) & 0xff); \ - } \ -} - -typedef rtlCipherError (SAL_CALL cipher_init_t) ( - rtlCipher Cipher, - rtlCipherDirection Direction, - const sal_uInt8 *pKeyData, sal_Size nKeyLen, - const sal_uInt8 *pArgData, sal_Size nArgLen); - -typedef rtlCipherError (SAL_CALL cipher_update_t) ( - rtlCipher Cipher, - const void *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen); - -typedef void (SAL_CALL cipher_delete_t) (rtlCipher Cipher); - -/** Cipher_Impl. - */ -typedef struct cipher_impl_st -{ - rtlCipherAlgorithm m_algorithm; - rtlCipherDirection m_direction; - rtlCipherMode m_mode; - - cipher_init_t *m_init; - cipher_update_t *m_encode; - cipher_update_t *m_decode; - cipher_delete_t *m_delete; -} Cipher_Impl; - -/*======================================================================== - * - * rtlCipher implementation. - * - *======================================================================*/ -/* - * rtl_cipher_create. - */ -rtlCipher SAL_CALL rtl_cipher_create ( - rtlCipherAlgorithm Algorithm, - rtlCipherMode Mode) -{ - rtlCipher Cipher = (rtlCipher)NULL; - switch (Algorithm) - { - case rtl_Cipher_AlgorithmBF: - Cipher = rtl_cipher_createBF (Mode); - break; - - case rtl_Cipher_AlgorithmARCFOUR: - Cipher = rtl_cipher_createARCFOUR (Mode); - break; - - default: /* rtl_Cipher_AlgorithmInvalid */ - break; - } - return Cipher; -} - -/* - * rtl_cipher_init. - */ -rtlCipherError SAL_CALL rtl_cipher_init ( - rtlCipher Cipher, - rtlCipherDirection Direction, - const sal_uInt8 *pKeyData, sal_Size nKeyLen, - const sal_uInt8 *pArgData, sal_Size nArgLen) -{ - Cipher_Impl *pImpl = (Cipher_Impl*)Cipher; - if (pImpl == NULL) - return rtl_Cipher_E_Argument; - if (pImpl->m_init == NULL) - return rtl_Cipher_E_Unknown; - - return (pImpl->m_init)( - Cipher, Direction, pKeyData, nKeyLen, pArgData, nArgLen); -} - -/* - * rtl_cipher_encode. - */ -rtlCipherError SAL_CALL rtl_cipher_encode ( - rtlCipher Cipher, - const void *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - Cipher_Impl *pImpl = (Cipher_Impl*)Cipher; - if (pImpl == NULL) - return rtl_Cipher_E_Argument; - if (pImpl->m_encode == NULL) - return rtl_Cipher_E_Unknown; - - return (pImpl->m_encode)(Cipher, pData, nDatLen, pBuffer, nBufLen); -} - -/* - * rtl_cipher_decode. - */ -rtlCipherError SAL_CALL rtl_cipher_decode ( - rtlCipher Cipher, - const void *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - Cipher_Impl *pImpl = (Cipher_Impl*)Cipher; - if (pImpl == NULL) - return rtl_Cipher_E_Argument; - if (pImpl->m_decode == NULL) - return rtl_Cipher_E_Unknown; - - return (pImpl->m_decode)(Cipher, pData, nDatLen, pBuffer, nBufLen); -} - -/* - * rtl_cipher_destroy. - */ -void SAL_CALL rtl_cipher_destroy (rtlCipher Cipher) -{ - Cipher_Impl *pImpl = (Cipher_Impl*)Cipher; - if (pImpl && pImpl->m_delete) - pImpl->m_delete (Cipher); -} - -/*======================================================================== - * - * rtl_cipherBF (Blowfish) internals. - * - *======================================================================*/ -#define CIPHER_ROUNDS_BF 16 - -typedef struct cipherBF_key_st -{ - sal_uInt32 m_S[4][256]; - sal_uInt32 m_P[CIPHER_ROUNDS_BF + 2]; -} CipherKeyBF; - -typedef struct cipherBF_context_st -{ - CipherKeyBF m_key; - union - { - sal_uInt32 m_long[2]; - sal_uInt8 m_byte[8]; - } m_iv; - sal_uInt32 m_offset; -} CipherContextBF; - -typedef struct cipherBF_impl_st -{ - Cipher_Impl m_cipher; - CipherContextBF m_context; -} CipherBF_Impl; - -/** __rtl_cipherBF_init. - */ -static rtlCipherError __rtl_cipherBF_init ( - CipherContextBF *ctx, - rtlCipherMode eMode, - const sal_uInt8 *pKeyData, sal_Size nKeyLen, - const sal_uInt8 *pArgData, sal_Size nArgLen); - -/** __rtl_cipherBF_update. - */ -static rtlCipherError __rtl_cipherBF_update ( - CipherContextBF *ctx, - rtlCipherMode eMode, - rtlCipherDirection eDirection, - const sal_uInt8 *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen); - -/** __rtl_cipherBF_updateECB. - */ -static void __rtl_cipherBF_updateECB ( - CipherContextBF *ctx, - rtlCipherDirection direction, - const sal_uInt8 *pData, - sal_uInt8 *pBuffer, - sal_Size nLength); - -/** __rtl_cipherBF_updateCBC. - */ -static void __rtl_cipherBF_updateCBC ( - CipherContextBF *ctx, - rtlCipherDirection direction, - const sal_uInt8 *pData, - sal_uInt8 *pBuffer, - sal_Size nLength); - -/** __rtl_cipherBF_updateCFB. - */ -static void __rtl_cipherBF_updateCFB ( - CipherContextBF *ctx, - rtlCipherDirection direction, - const sal_uInt8 *pData, - sal_uInt8 *pBuffer); - -/** __rtl_cipher_encode. - */ -static void __rtl_cipherBF_encode ( - CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr); - -/** __rtl_cipherBF_decode. - */ -static void __rtl_cipherBF_decode ( - CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr); - -/** __rtl_cipherBF. - */ -static sal_uInt32 __rtl_cipherBF ( - CipherKeyBF *key, sal_uInt32 x); - -/** __rtl_cipherBF_key. - */ -static const CipherKeyBF __rtl_cipherBF_key = -{ - /* S */ - { - /* S[0] */ - { - /* 0 */ - 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, - 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, - 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L, - 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL, - - /* 1 */ - 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, - 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, - 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, - 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL, - - /* 2 */ - 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L, - 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, - 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, - 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, - - /* 3 */ - 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL, - 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L, - 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, - 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, - - /* 4 */ - 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L, - 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L, - 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL, - 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, - - /* 5 */ - 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, - 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, - 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L, - 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL, - - /* 6 */ - 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, - 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, - 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, - 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L, - - /* 7 */ - 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL, - 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, - 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, - 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, - - /* 8 */ - 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L, - 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL, - 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, - 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, - - /* 9 */ - 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, - 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L, - 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL, - 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, - - /* A */ - 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, - 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, - 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L, - 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L, - - /* B */ - 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, - 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, - 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, - 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL, - - /* C */ - 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL, - 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, - 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, - 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, - - /* D */ - 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L, - 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL, - 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, - 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, - - /* E */ - 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, - 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L, - 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L, - 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, - - /* F */ - 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, - 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, - 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L, - 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL - }, - - /* S[1] */ - { - 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L, - 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L, - 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, - 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL, - - 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L, - 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, - 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL, - 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L, - - 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L, - 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L, - 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL, - 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, - - 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L, - 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L, - 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, - 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L, - - 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL, - 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, - 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL, - 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L, - - 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, - 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L, - 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L, - 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL, - - 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL, - 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L, - 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, - 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L, - - 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL, - 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, - 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L, - 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L, - - 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, - 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L, - 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L, - 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, - - 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L, - 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL, - 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, - 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL, - - 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L, - 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, - 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L, - 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L, - - 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, - 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L, - 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L, - 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, - - 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L, - 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L, - 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, - 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L, - - 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L, - 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L, - 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L, - 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L, - - 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, - 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL, - 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L, - 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, - - 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L, - 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L, - 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, - 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L - }, - - /* S[2] */ - { - 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L, - 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L, - 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL, - 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L, - - 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L, - 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L, - 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL, - 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL, - - 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL, - 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L, - 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L, - 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL, - - 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L, - 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL, - 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L, - 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL, - - 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L, - 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL, - 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L, - 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL, - - 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L, - 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L, - 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL, - 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L, - - 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L, - 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L, - 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L, - 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL, - - 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L, - 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL, - 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L, - 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL, - - 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L, - 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL, - 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL, - 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL, - - 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L, - 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L, - 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL, - 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL, - - 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL, - 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL, - 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL, - 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L, - - 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L, - 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L, - 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L, - 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL, - - 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL, - 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L, - 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L, - 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L, - - 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L, - 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L, - 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L, - 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L, - - 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L, - 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L, - 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L, - 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL, - - 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L, - 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL, - 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L, - 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L - }, - - /* S[3] */ - { - 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, - 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, - 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL, - 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L, - - 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, - 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, - 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, - 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L, - - 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L, - 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, - 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, - 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, - - 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L, - 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L, - 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, - 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, - - 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, - 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L, - 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL, - 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, - - 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, - 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, - 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL, - 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL, - - 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, - 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, - 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L, - 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L, - - 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL, - 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, - 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, - 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, - - 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L, - 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL, - 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, - 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, - - 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, - 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL, - 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L, - 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, - - 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, - 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, - 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL, - 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L, - - 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, - 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, - 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, - 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL, - - 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L, - 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, - 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, - 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, - - 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L, - 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL, - 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, - 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, - - 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, - 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL, - 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L, - 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, - - 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, - 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, - 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL, - 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L - } - }, - - /* P */ - { - 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, - 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, - 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL, - 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, - 0x9216D5D9L, 0x8979FB1BL - } -}; - -/* - * __rtl_cipherBF_init. - */ -static rtlCipherError __rtl_cipherBF_init ( - CipherContextBF *ctx, - rtlCipherMode eMode, - const sal_uInt8 *pKeyData, sal_Size nKeyLen, - const sal_uInt8 *pArgData, sal_Size nArgLen) -{ - CipherKeyBF *key; - sal_uInt32 D, DL, DR; - sal_uInt16 i, j, k; - - key = &(ctx->m_key); - - rtl_copyMemory (key, &__rtl_cipherBF_key, sizeof (CipherKeyBF)); - rtl_zeroMemory (&(ctx->m_iv), sizeof(ctx->m_iv)); - ctx->m_offset = 0; - - for (i = 0, k = 0; i < CIPHER_ROUNDS_BF + 2; ++i) - { - D = 0; - for (j = 0; j < 4; ++j) - { - D = ((D << 8) | pKeyData[k]); - k++; - if (k >= nKeyLen) - k = 0; - } - key->m_P[i] ^= D; - } - - DL = 0; - DR = 0; - - for (i = 0; i < CIPHER_ROUNDS_BF + 2; i += 2) - { - __rtl_cipherBF_encode (key, &DL, &DR); - key->m_P[i ] = DL; - key->m_P[i + 1] = DR; - } - - for (i = 0; i < 4; ++i) - { - for (k = 0; k < 256; k += 2) - { - __rtl_cipherBF_encode (key, &DL, &DR); - key->m_S[i][k ] = DL; - key->m_S[i][k + 1] = DR; - } - } - - if (pArgData && nArgLen) - { - nArgLen = ((nArgLen < 8) ? nArgLen : 8); - if (eMode == rtl_Cipher_ModeStream) - { - rtl_copyMemory (ctx->m_iv.m_byte, pArgData, nArgLen); - } - else - { - RTL_CIPHER_NTOHL64 (pArgData, DL, DR, nArgLen); - ctx->m_iv.m_long[0] = DL; - ctx->m_iv.m_long[1] = DR; - } - } - - D = DL = DR = 0; - return rtl_Cipher_E_None; -} - -/* - * __rtl_cipherBF_update. - */ -static rtlCipherError __rtl_cipherBF_update ( - CipherContextBF *ctx, - rtlCipherMode eMode, - rtlCipherDirection eDirection, - const sal_uInt8 *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - /* Check arguments. */ - if ((pData == NULL) || (pBuffer == NULL)) - return rtl_Cipher_E_Argument; - - if (!((0 < nDatLen) && (nDatLen <= nBufLen))) - return rtl_Cipher_E_BufferSize; - - /* Update. */ - if (eMode == rtl_Cipher_ModeECB) - { - /* Block mode. */ - while (nDatLen > 8) - { - __rtl_cipherBF_updateECB (ctx, eDirection, pData, pBuffer, 8); - nDatLen -= 8; - pData += 8; - pBuffer += 8; - } - __rtl_cipherBF_updateECB (ctx, eDirection, pData, pBuffer, nDatLen); - } - else if (eMode == rtl_Cipher_ModeCBC) - { - /* Block mode. */ - while (nDatLen > 8) - { - __rtl_cipherBF_updateCBC (ctx, eDirection, pData, pBuffer, 8); - nDatLen -= 8; - pData += 8; - pBuffer += 8; - } - __rtl_cipherBF_updateCBC (ctx, eDirection, pData, pBuffer, nDatLen); - } - else - { - /* Stream mode. */ - while (nDatLen > 0) - { - __rtl_cipherBF_updateCFB (ctx, eDirection, pData, pBuffer); - nDatLen -= 1; - pData += 1; - pBuffer += 1; - } - } - return rtl_Cipher_E_None; -} - -/* - * __rtl_cipherBF_updateECB. - */ -static void __rtl_cipherBF_updateECB ( - CipherContextBF *ctx, - rtlCipherDirection direction, - const sal_uInt8 *pData, - sal_uInt8 *pBuffer, - sal_Size nLength) -{ - CipherKeyBF *key; - sal_uInt32 DL, DR; - - key = &(ctx->m_key); - if (direction == rtl_Cipher_DirectionEncode) - { - RTL_CIPHER_NTOHL64(pData, DL, DR, nLength); - - __rtl_cipherBF_encode (key, &DL, &DR); - - RTL_CIPHER_HTONL(DL, pBuffer); - RTL_CIPHER_HTONL(DR, pBuffer); - } - else - { - RTL_CIPHER_NTOHL(pData, DL); - RTL_CIPHER_NTOHL(pData, DR); - - __rtl_cipherBF_decode (key, &DL, &DR); - - RTL_CIPHER_HTONL64(DL, DR, pBuffer, nLength); - } - DL = DR = 0; -} - -/* - * __rtl_cipherBF_updateCBC. - */ -static void __rtl_cipherBF_updateCBC ( - CipherContextBF *ctx, - rtlCipherDirection direction, - const sal_uInt8 *pData, - sal_uInt8 *pBuffer, - sal_Size nLength) -{ - CipherKeyBF *key; - sal_uInt32 DL, DR; - - key = &(ctx->m_key); - if (direction == rtl_Cipher_DirectionEncode) - { - RTL_CIPHER_NTOHL64(pData, DL, DR, nLength); - - DL ^= ctx->m_iv.m_long[0]; - DR ^= ctx->m_iv.m_long[1]; - - __rtl_cipherBF_encode (key, &DL, &DR); - - ctx->m_iv.m_long[0] = DL; - ctx->m_iv.m_long[1] = DR; - - RTL_CIPHER_HTONL(DL, pBuffer); - RTL_CIPHER_HTONL(DR, pBuffer); - } - else - { - sal_uInt32 IVL, IVR; - - RTL_CIPHER_NTOHL(pData, DL); - RTL_CIPHER_NTOHL(pData, DR); - - IVL = DL; - IVR = DR; - - __rtl_cipherBF_decode (key, &DL, &DR); - - DL ^= ctx->m_iv.m_long[0]; - DR ^= ctx->m_iv.m_long[1]; - - ctx->m_iv.m_long[0] = IVL; - ctx->m_iv.m_long[1] = IVR; - - RTL_CIPHER_HTONL64(DL, DR, pBuffer, nLength); - IVL = IVR = 0; - } - DL = DR = 0; -} - -/* - * __rtl_cipherBF_updateCFB. - */ -static void __rtl_cipherBF_updateCFB ( - CipherContextBF *ctx, - rtlCipherDirection direction, - const sal_uInt8 *pData, - sal_uInt8 *pBuffer) -{ - sal_uInt8 *iv; - sal_uInt32 k; - - iv = ctx->m_iv.m_byte; - k = ctx->m_offset; - - if (k == 0) - { - sal_uInt32 IVL, IVR; - - RTL_CIPHER_NTOHL64(iv, IVL, IVR, 8); - __rtl_cipherBF_encode (&(ctx->m_key), &IVL, &IVR); - RTL_CIPHER_HTONL64(IVL, IVR, iv, 8); - - IVL = IVR = 0; - } - - if (direction == rtl_Cipher_DirectionEncode) - { - iv[k] ^= *pData; - *pBuffer = iv[k]; - } - else - { - sal_uInt8 c = iv[k]; - iv[k] = *pData; - *pBuffer = *pData ^ c; - } - - ctx->m_offset = ((k + 1) & 0x07); - iv = NULL; -} - -/* - * __rtl_cipherBF_encode. - */ -static void __rtl_cipherBF_encode ( - CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr) -{ - sal_uInt32 t, XL, XR; - sal_uInt16 i; - - XL = *xl; - XR = *xr; - - for (i = 0; i < CIPHER_ROUNDS_BF; ++i) - { - XL ^= key->m_P[i]; - XR ^= __rtl_cipherBF (key, XL); - - t = XL; - XL = XR; - XR = t; - } - - t = XL; - XL = XR; - XR = t; - - XR ^= key->m_P[CIPHER_ROUNDS_BF ]; - XL ^= key->m_P[CIPHER_ROUNDS_BF + 1]; - - *xl = XL; - *xr = XR; - - t = XL = XR = 0; -} - -/* - * __rtl_cipherBF_decode. - */ -static void __rtl_cipherBF_decode ( - CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr) -{ - sal_uInt32 t, XL, XR; - sal_uInt16 i; - - XL = *xl; - XR = *xr; - - for (i = CIPHER_ROUNDS_BF + 1; i > 1; --i) - { - XL ^= key->m_P[i]; - XR ^= __rtl_cipherBF (key, XL); - - t = XL; - XL = XR; - XR = t; - } - - t = XL; - XL = XR; - XR = t; - - XR ^= key->m_P[1]; - XL ^= key->m_P[0]; - - *xl = XL; - *xr = XR; - - t = XL = XR = 0; -} - -/* - * __rtl_cipherBF. - */ -static sal_uInt32 __rtl_cipherBF (CipherKeyBF *key, sal_uInt32 x) -{ - sal_uInt16 a, b, c, d; - sal_uInt32 y; - - d = (sal_uInt16)(x & 0x00ff); - x >>= 8; - c = (sal_uInt16)(x & 0x00ff); - x >>= 8; - b = (sal_uInt16)(x & 0x00ff); - x >>= 8; - a = (sal_uInt16)(x & 0x00ff); - - y = key->m_S[0][a]; - y += key->m_S[1][b]; - y ^= key->m_S[2][c]; - y += key->m_S[3][d]; - - return y; -} - -/*======================================================================== - * - * rtl_cipherBF (Blowfish) implementation. - * - * Reference: - * Bruce Schneier: Applied Cryptography, 2nd edition, ch. 14.3 - * - *======================================================================*/ -/* - * rtl_cipher_createBF. - */ -rtlCipher SAL_CALL rtl_cipher_createBF (rtlCipherMode Mode) -{ - CipherBF_Impl *pImpl = (CipherBF_Impl*)NULL; - - if (Mode == rtl_Cipher_ModeInvalid) - return ((rtlCipher)NULL); - - pImpl = ((CipherBF_Impl*)rtl_allocateZeroMemory (sizeof (CipherBF_Impl))); - if (pImpl) - { - pImpl->m_cipher.m_algorithm = rtl_Cipher_AlgorithmBF; - pImpl->m_cipher.m_direction = rtl_Cipher_DirectionInvalid; - pImpl->m_cipher.m_mode = Mode; - - pImpl->m_cipher.m_init = rtl_cipher_initBF; - pImpl->m_cipher.m_encode = rtl_cipher_encodeBF; - pImpl->m_cipher.m_decode = rtl_cipher_decodeBF; - pImpl->m_cipher.m_delete = rtl_cipher_destroyBF; - } - return ((rtlCipher)pImpl); -} - -/* - * rtl_cipher_initBF. - */ -rtlCipherError SAL_CALL rtl_cipher_initBF ( - rtlCipher Cipher, - rtlCipherDirection Direction, - const sal_uInt8 *pKeyData, sal_Size nKeyLen, - const sal_uInt8 *pArgData, sal_Size nArgLen) -{ - CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher; - - if ((pImpl == NULL) || (pKeyData == NULL)) - return rtl_Cipher_E_Argument; - - if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF)) - return rtl_Cipher_E_Algorithm; - - if (!(Direction == rtl_Cipher_DirectionInvalid)) - pImpl->m_cipher.m_direction = Direction; - else - return rtl_Cipher_E_Direction; - - return __rtl_cipherBF_init ( - &(pImpl->m_context), pImpl->m_cipher.m_mode, - pKeyData, nKeyLen, pArgData, nArgLen); -} - -/* - * rtl_cipher_encodeBF. - */ -rtlCipherError SAL_CALL rtl_cipher_encodeBF ( - rtlCipher Cipher, - const void *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher; - if (pImpl == NULL) - return rtl_Cipher_E_Argument; - - if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF)) - return rtl_Cipher_E_Algorithm; - - if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid) - return rtl_Cipher_E_Direction; - if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionDecode) - return rtl_Cipher_E_Direction; - - return __rtl_cipherBF_update ( - &(pImpl->m_context), pImpl->m_cipher.m_mode, - rtl_Cipher_DirectionEncode, - (const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen); -} - -/* - * rtl_cipher_decodeBF. - */ -rtlCipherError SAL_CALL rtl_cipher_decodeBF ( - rtlCipher Cipher, - const void *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher; - if (pImpl == NULL) - return rtl_Cipher_E_Argument; - - if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF)) - return rtl_Cipher_E_Algorithm; - - if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid) - return rtl_Cipher_E_Direction; - if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionEncode) - return rtl_Cipher_E_Direction; - - return __rtl_cipherBF_update ( - &(pImpl->m_context), pImpl->m_cipher.m_mode, - rtl_Cipher_DirectionDecode, - (const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen); -} - -/* - * rtl_cipher_destroyBF. - */ -void SAL_CALL rtl_cipher_destroyBF (rtlCipher Cipher) -{ - CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher; - if (pImpl) - { - if (pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF) - rtl_freeZeroMemory (pImpl, sizeof (CipherBF_Impl)); - else - rtl_freeMemory (pImpl); - } -} - -/*======================================================================== - * - * rtl_cipher_ARCFOUR (RC4) internals. - * - *======================================================================*/ -#define CIPHER_CBLOCK_ARCFOUR 256 - -typedef struct cipherARCFOUR_context_st -{ - unsigned int m_S[CIPHER_CBLOCK_ARCFOUR]; - unsigned int m_X, m_Y; -} ContextARCFOUR_Impl; - -typedef struct cipherARCFOUR_impl_st -{ - Cipher_Impl m_cipher; - ContextARCFOUR_Impl m_context; -} CipherARCFOUR_Impl; - -/** rtl_cipherARCFOUR_update_Impl. - */ -static rtlCipherError rtl_cipherARCFOUR_update_Impl ( - ContextARCFOUR_Impl *ctx, - const sal_uInt8 *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen); - -/* - * rtl_cipherARCFOUR_init_Impl. - */ -static rtlCipherError rtl_cipherARCFOUR_init_Impl ( - ContextARCFOUR_Impl *ctx, - const sal_uInt8 *pKeyData, sal_Size nKeyLen) -{ - unsigned int K[CIPHER_CBLOCK_ARCFOUR]; - unsigned int *L, *S; - unsigned int x, y, t; - sal_Size n, k; - - S = &(ctx->m_S[0]); - - /* Initialize S linearly. */ - for (x = 0; x < CIPHER_CBLOCK_ARCFOUR; x++) - S[x] = x; - - /* Initialize K with key, repeat key as necessary. */ - for (L = K, n = CIPHER_CBLOCK_ARCFOUR; n > nKeyLen; n -= nKeyLen) - { - for (k = 0; k < nKeyLen; k++) L[k] = pKeyData[k]; - L += nKeyLen; - } - for (k = 0; k < n; k++) L[k] = pKeyData[k]; - - /* Initialize S with K. */ - for (x = 0, y = 0; x < CIPHER_CBLOCK_ARCFOUR; x++) - { - y = (y + S[x] + K[x]) % CIPHER_CBLOCK_ARCFOUR; - t = S[x], S[x] = S[y], S[y] = t; /* swap S[x] and S[y] */ - } - - /* Initialize counters X and Y. */ - ctx->m_X = 0; - ctx->m_Y = 0; - - return rtl_Cipher_E_None; -} - -/* - * rtl_cipherARCFOUR_update_Impl. - */ -static rtlCipherError rtl_cipherARCFOUR_update_Impl ( - ContextARCFOUR_Impl *ctx, - const sal_uInt8 *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - register unsigned int *S; - register unsigned int x, y, t; - sal_Size k; - - /* Check arguments. */ - if ((pData == NULL) || (pBuffer == NULL)) - return rtl_Cipher_E_Argument; - - if (!((0 < nDatLen) && (nDatLen <= nBufLen))) - return rtl_Cipher_E_BufferSize; - - /* Update. */ - S = &(ctx->m_S[0]); - for (k = 0; k < nDatLen; k++) - { - /* Update counters X and Y. */ - x = ctx->m_X; - y = ctx->m_Y; - x = (x + 1 ) % CIPHER_CBLOCK_ARCFOUR; - y = (y + S[x]) % CIPHER_CBLOCK_ARCFOUR; - ctx->m_X = x; - ctx->m_Y = y; - - /* Swap S[x] and S[y]. */ - t = S[x], S[x] = S[y], S[y] = t; - - /* Evaluate next key byte S[t]. */ - t = (S[x] + S[y]) % CIPHER_CBLOCK_ARCFOUR; - pBuffer[k] = pData[k] ^ ((sal_uInt8)(S[t] & 0xff)); - } - - return rtl_Cipher_E_None; -} - -/*======================================================================== - * - * rtl_cipher_ARCFOUR (RC4) implementation. - * - * Reference: - * Bruce Schneier: Applied Cryptography, 2nd edition, ch. 17.1 - * - *======================================================================*/ -/* - * rtl_cipher_createARCFOUR. - */ -rtlCipher SAL_CALL rtl_cipher_createARCFOUR (rtlCipherMode Mode) -{ - CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)NULL; - - if (!(Mode == rtl_Cipher_ModeStream)) - return ((rtlCipher)NULL); - - pImpl = ((CipherARCFOUR_Impl*)rtl_allocateZeroMemory (sizeof (CipherARCFOUR_Impl))); - if (pImpl) - { - pImpl->m_cipher.m_algorithm = rtl_Cipher_AlgorithmARCFOUR; - pImpl->m_cipher.m_direction = rtl_Cipher_DirectionInvalid; - pImpl->m_cipher.m_mode = rtl_Cipher_ModeStream; - - pImpl->m_cipher.m_init = rtl_cipher_initARCFOUR; - pImpl->m_cipher.m_encode = rtl_cipher_encodeARCFOUR; - pImpl->m_cipher.m_decode = rtl_cipher_decodeARCFOUR; - pImpl->m_cipher.m_delete = rtl_cipher_destroyARCFOUR; - } - return ((rtlCipher)pImpl); -} - -/* - * rtl_cipher_initARCFOUR. - */ -rtlCipherError SAL_CALL rtl_cipher_initARCFOUR ( - rtlCipher Cipher, - rtlCipherDirection Direction, - const sal_uInt8 *pKeyData, sal_Size nKeyLen, - const sal_uInt8 *pArgData, sal_Size nArgLen) -{ - CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher; - (void) pArgData; // avoid warning - (void) nArgLen; // avoid warning - - if ((pImpl == NULL) || (pKeyData == NULL)) - return rtl_Cipher_E_Argument; - - if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR)) - return rtl_Cipher_E_Algorithm; - - if (!(Direction == rtl_Cipher_DirectionInvalid)) - pImpl->m_cipher.m_direction = Direction; - else - return rtl_Cipher_E_Direction; - - return rtl_cipherARCFOUR_init_Impl (&(pImpl->m_context), pKeyData, nKeyLen); -} - -/* - * rtl_cipher_encodeARCFOUR. - */ -rtlCipherError SAL_CALL rtl_cipher_encodeARCFOUR ( - rtlCipher Cipher, - const void *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher; - if (pImpl == NULL) - return rtl_Cipher_E_Argument; - - if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR)) - return rtl_Cipher_E_Algorithm; - - if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid) - return rtl_Cipher_E_Direction; - - return rtl_cipherARCFOUR_update_Impl ( - &(pImpl->m_context), - (const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen); -} - -/* - * rtl_cipher_decodeARCFOUR. - */ -rtlCipherError SAL_CALL rtl_cipher_decodeARCFOUR ( - rtlCipher Cipher, - const void *pData, sal_Size nDatLen, - sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher; - if (pImpl == NULL) - return rtl_Cipher_E_Argument; - - if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR)) - return rtl_Cipher_E_Algorithm; - - if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid) - return rtl_Cipher_E_Direction; - - return rtl_cipherARCFOUR_update_Impl ( - &(pImpl->m_context), - (const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen); -} - -/* - * rtl_cipher_destroyARCFOUR. - */ -void SAL_CALL rtl_cipher_destroyARCFOUR (rtlCipher Cipher) -{ - CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher; - if (pImpl) - { - if (pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR) - rtl_freeZeroMemory (pImpl, sizeof (CipherARCFOUR_Impl)); - else - rtl_freeMemory (pImpl); - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/cmdargs.cxx b/sal/rtl/source/cmdargs.cxx deleted file mode 100644 index 108a0316f..000000000 --- a/sal/rtl/source/cmdargs.cxx +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include <osl/mutex.hxx> -#include <rtl/process.h> -#include <rtl/ustring.hxx> - -namespace { - -rtl_uString ** g_ppCommandArgs = 0; -sal_uInt32 g_nCommandArgCount = 0; - -struct ArgHolder -{ - ~ArgHolder(); -}; - -ArgHolder::~ArgHolder() -{ - while (g_nCommandArgCount > 0) - rtl_uString_release (g_ppCommandArgs[--g_nCommandArgCount]); - - rtl_freeMemory (g_ppCommandArgs); - g_ppCommandArgs = 0; -} - -// The destructor of this static ArgHolder is "activated" by the assignments to -// g_ppCommandArgs and g_nCommandArgCount in init(): -ArgHolder argHolder; - -void init() -{ - osl::MutexGuard guard( osl::Mutex::getGlobalMutex() ); - if (!g_ppCommandArgs) - { - sal_Int32 i, n = osl_getCommandArgCount(); - - g_ppCommandArgs = - (rtl_uString**)rtl_allocateZeroMemory (n * sizeof(rtl_uString*)); - for (i = 0; i < n; i++) - { - rtl_uString * pArg = 0; - osl_getCommandArg (i, &pArg); - if (('-' == pArg->buffer[0] || '/' == pArg->buffer[0]) && - 'e' == pArg->buffer[1] && - 'n' == pArg->buffer[2] && - 'v' == pArg->buffer[3] && - ':' == pArg->buffer[4] && - rtl_ustr_indexOfChar (&(pArg->buffer[5]), '=') >= 0 ) - { - // ignore. - rtl_uString_release (pArg); - } - else - { - // assign. - g_ppCommandArgs[g_nCommandArgCount++] = pArg; - } - } - } -} - -} - -oslProcessError SAL_CALL rtl_getAppCommandArg ( - sal_uInt32 nArg, rtl_uString **ppCommandArg) -{ - init(); - oslProcessError result = osl_Process_E_NotFound; - if( nArg < g_nCommandArgCount ) - { - rtl_uString_assign( ppCommandArg, g_ppCommandArgs[nArg] ); - result = osl_Process_E_None; - } - return (result); -} - -sal_uInt32 SAL_CALL rtl_getAppCommandArgCount (void) -{ - init(); - return g_nCommandArgCount; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/crc.c b/sal/rtl/source/crc.c deleted file mode 100644 index 03e72de69..000000000 --- a/sal/rtl/source/crc.c +++ /dev/null @@ -1,166 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#define _RTL_CRC_C_ - -#include <sal/types.h> -#include <rtl/crc.h> - -/*======================================================================== - * - * rtl_crc32Table (CRC polynomial 0xEDB88320). - * - *======================================================================*/ -static const sal_uInt32 rtl_crc32Table[256] = -{ - /* 0 */ - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - - /* 1 */ - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - - /* 2 */ - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - - /* 3 */ - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - - /* 4 */ - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - - /* 5 */ - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - - /* 6 */ - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - - /* 7 */ - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - - /* 8 */ - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - - /* 9 */ - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - - /* A */ - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - - /* B */ - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - - /* C */ - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - - /* D */ - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - - /* E */ - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - - /* F */ - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D -}; - -/*======================================================================== - * - * rtl_crc32 implementation. - * - *======================================================================*/ -#define UPDCRC32(crc, octet) \ - (rtl_crc32Table[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8)) - -/* - * rtl_crc32. - */ -sal_uInt32 SAL_CALL rtl_crc32 ( - sal_uInt32 Crc, - const void *Data, sal_uInt32 DatLen) -{ - if (Data) - { - register const sal_uInt8 *p = (const sal_uInt8 *)Data; - register const sal_uInt8 *q = p + DatLen; - - Crc = ~Crc; - while (p < q) - Crc = UPDCRC32(Crc, *(p++)); - Crc = ~Crc; - } - return Crc; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/debugprint.cxx b/sal/rtl/source/debugprint.cxx deleted file mode 100644 index 38d4cb587..000000000 --- a/sal/rtl/source/debugprint.cxx +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include <rtl/string.hxx> -#include <rtl/strbuf.hxx> -#include <rtl/ustring.hxx> -#include <rtl/ustrbuf.hxx> - -const sal_Char *dbg_dump(const rtl::OString &rStr) -{ - return rStr.getStr(); -} - -const sal_Char *dbg_dump(const rtl::OStringBuffer &rStrBuf) -{ - return rStrBuf.getStr(); -} - -const sal_Char *dbg_dump(rtl_String *pStr) -{ - return rtl_string_getStr(pStr); -} - -const sal_Char *dbg_dump(const rtl::OUString &rStr) -{ - return dbg_dump(rtl::OUStringToOString(rStr, RTL_TEXTENCODING_UTF8)); -} - -const sal_Char *dbg_dump(const rtl::OUStringBuffer &rStrBuf) -{ - return dbg_dump(rtl::OUString(rStrBuf.getStr())); -} - -const sal_Char *dbg_dump(rtl_uString *pStr) -{ - return dbg_dump(rtl::OUString(pStr)); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/digest.c b/sal/rtl/source/digest.c deleted file mode 100644 index 1d43fc8ba..000000000 --- a/sal/rtl/source/digest.c +++ /dev/null @@ -1,2121 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#define _RTL_DIGEST_C_ - -#include <sal/types.h> -#include <sal/macros.h> -#include <osl/endian.h> -#include <rtl/alloc.h> -#include <rtl/memory.h> -#include <rtl/digest.h> - -/*======================================================================== - * - * rtlDigest internals. - * - *======================================================================*/ -#define RTL_DIGEST_CREATE(T) ((T*)(rtl_allocateZeroMemory(sizeof(T)))) - -#define RTL_DIGEST_ROTL(a,n) (((a) << (n)) | ((a) >> (32 - (n)))) - -#define RTL_DIGEST_HTONL(l,c) \ - (*((c)++) = (sal_uInt8)(((l) >> 24L) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) >> 16L) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) >> 8L) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) ) & 0xff)) - -#define RTL_DIGEST_LTOC(l,c) \ - (*((c)++) = (sal_uInt8)(((l) ) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) >> 8L) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) >> 16L) & 0xff), \ - *((c)++) = (sal_uInt8)(((l) >> 24L) & 0xff)) - -typedef rtlDigestError (SAL_CALL Digest_init_t) ( - void *ctx, const sal_uInt8 *Data, sal_uInt32 DatLen); - -typedef void (SAL_CALL Digest_delete_t) (void *ctx); - -typedef rtlDigestError (SAL_CALL Digest_update_t) ( - void *ctx, const void *Data, sal_uInt32 DatLen); - -typedef rtlDigestError (SAL_CALL Digest_get_t) ( - void *ctx, sal_uInt8 *Buffer, sal_uInt32 BufLen); - -typedef struct digest_impl_st -{ - rtlDigestAlgorithm m_algorithm; - sal_uInt32 m_length; - - Digest_init_t *m_init; - Digest_delete_t *m_delete; - Digest_update_t *m_update; - Digest_get_t *m_get; -} Digest_Impl; - -/* - * __rtl_digest_swapLong. - */ -static void __rtl_digest_swapLong (sal_uInt32 *pData, sal_uInt32 nDatLen) -{ - register sal_uInt32 *X; - register int i, n; - - X = pData; - n = nDatLen; - - for (i = 0; i < n; i++) - X[i] = OSL_SWAPDWORD(X[i]); -} - -/*======================================================================== - * - * rtlDigest implementation. - * - *======================================================================*/ -/* - * rtl_digest_create. - */ -rtlDigest SAL_CALL rtl_digest_create (rtlDigestAlgorithm Algorithm) -{ - rtlDigest Digest = (rtlDigest)NULL; - switch (Algorithm) - { - case rtl_Digest_AlgorithmMD2: - Digest = rtl_digest_createMD2(); - break; - - case rtl_Digest_AlgorithmMD5: - Digest = rtl_digest_createMD5(); - break; - - case rtl_Digest_AlgorithmSHA: - Digest = rtl_digest_createSHA(); - break; - - case rtl_Digest_AlgorithmSHA1: - Digest = rtl_digest_createSHA1(); - break; - - case rtl_Digest_AlgorithmHMAC_MD5: - Digest = rtl_digest_createHMAC_MD5(); - break; - - case rtl_Digest_AlgorithmHMAC_SHA1: - Digest = rtl_digest_createHMAC_SHA1(); - break; - - default: /* rtl_Digest_AlgorithmInvalid */ - break; - } - return Digest; -} - -/* - * rtl_digest_queryAlgorithm. - */ -rtlDigestAlgorithm SAL_CALL rtl_digest_queryAlgorithm (rtlDigest Digest) -{ - Digest_Impl *pImpl = (Digest_Impl *)Digest; - if (pImpl) - return pImpl->m_algorithm; - else - return rtl_Digest_AlgorithmInvalid; -} - -/* - * rtl_digest_queryLength. - */ -sal_uInt32 SAL_CALL rtl_digest_queryLength (rtlDigest Digest) -{ - Digest_Impl *pImpl = (Digest_Impl *)Digest; - if (pImpl) - return pImpl->m_length; - else - return 0; -} - -/* - * rtl_digest_init. - */ -rtlDigestError SAL_CALL rtl_digest_init ( - rtlDigest Digest, const sal_uInt8 *pData, sal_uInt32 nDatLen) -{ - Digest_Impl *pImpl = (Digest_Impl *)Digest; - if (pImpl) - { - if (pImpl->m_init) - return pImpl->m_init (Digest, pData, nDatLen); - else - return rtl_Digest_E_None; - } - return rtl_Digest_E_Argument; -} - -/* - * rtl_digest_update. - */ -rtlDigestError SAL_CALL rtl_digest_update ( - rtlDigest Digest, const void *pData, sal_uInt32 nDatLen) -{ - Digest_Impl *pImpl = (Digest_Impl *)Digest; - if (pImpl && pImpl->m_update) - return pImpl->m_update (Digest, pData, nDatLen); - else - return rtl_Digest_E_Argument; -} - -/* - * rtl_digest_get. - */ -rtlDigestError SAL_CALL rtl_digest_get ( - rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - Digest_Impl *pImpl = (Digest_Impl *)Digest; - if (pImpl && pImpl->m_get) - return pImpl->m_get (Digest, pBuffer, nBufLen); - else - return rtl_Digest_E_Argument; -} - -/* - * rtl_digest_destroy. - */ -void SAL_CALL rtl_digest_destroy (rtlDigest Digest) -{ - Digest_Impl *pImpl = (Digest_Impl *)Digest; - if (pImpl && pImpl->m_delete) - pImpl->m_delete (Digest); -} - -/*======================================================================== - * - * rtl_digest_MD2 internals. - * - *======================================================================*/ -#define DIGEST_CBLOCK_MD2 16 -#define DIGEST_LBLOCK_MD2 16 - -typedef struct digestMD2_context_st -{ - sal_uInt32 m_nDatLen; - sal_uInt8 m_pData[DIGEST_CBLOCK_MD2]; - sal_uInt32 m_state[DIGEST_LBLOCK_MD2]; - sal_uInt32 m_chksum[DIGEST_LBLOCK_MD2]; -} DigestContextMD2; - -typedef struct digestMD2_impl_st -{ - Digest_Impl m_digest; - DigestContextMD2 m_context; -} DigestMD2_Impl; - -static void __rtl_digest_initMD2 (DigestContextMD2 *ctx); -static void __rtl_digest_updateMD2 (DigestContextMD2 *ctx); -static void __rtl_digest_endMD2 (DigestContextMD2 *ctx); - -static const sal_uInt32 S[256] = -{ - 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, - 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, - 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, - 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA, - 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, - 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, - 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, - 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A, - 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, - 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, - 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, - 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, - 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, - 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6, - 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, - 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, - 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, - 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02, - 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, - 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F, - 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, - 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, - 0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09, - 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52, - 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, - 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, - 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, - 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39, - 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4, - 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A, - 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, - 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14, -}; - -/* - * __rtl_digest_MD2. - */ -static const Digest_Impl __rtl_digest_MD2 = -{ - rtl_Digest_AlgorithmMD2, - RTL_DIGEST_LENGTH_MD2, - - NULL, - rtl_digest_destroyMD2, - rtl_digest_updateMD2, - rtl_digest_getMD2 -}; - -/* - * __rtl_digest_initMD2. - */ -static void __rtl_digest_initMD2 (DigestContextMD2 *ctx) -{ - rtl_zeroMemory (ctx, sizeof (DigestContextMD2)); -} - -/* - * __rtl_digest_updateMD2. - */ -static void __rtl_digest_updateMD2 (DigestContextMD2 *ctx) -{ - register sal_uInt8 *X; - register sal_uInt32 *sp1, *sp2; - register sal_uInt32 i, k, t; - - sal_uInt32 state[48]; - - X = ctx->m_pData; - sp1 = ctx->m_state; - sp2 = ctx->m_chksum; - - k = sp2[DIGEST_LBLOCK_MD2 - 1]; - for (i = 0; i < 16; i++) - { - state[i + 0] = sp1[i]; - state[i + 16] = t = X[i]; - state[i + 32] = t ^ sp1[i]; - k = sp2[i] ^= S[t^k]; - } - - t = 0; - for (i = 0; i < 18; i++) - { - for (k = 0; k < 48; k += 8) - { - t = state[k + 0] ^= S[t]; - t = state[k + 1] ^= S[t]; - t = state[k + 2] ^= S[t]; - t = state[k + 3] ^= S[t]; - t = state[k + 4] ^= S[t]; - t = state[k + 5] ^= S[t]; - t = state[k + 6] ^= S[t]; - t = state[k + 7] ^= S[t]; - } - t = ((t + i) & 0xff); - } - - rtl_copyMemory (sp1, state, 16 * sizeof(sal_uInt32)); - rtl_zeroMemory (state, 48 * sizeof(sal_uInt32)); -} - -/* - * __rtl_digest_endMD2. - */ -static void __rtl_digest_endMD2 (DigestContextMD2 *ctx) -{ - register sal_uInt8 *X; - register sal_uInt32 *C; - sal_uInt32 i, n; - - X = ctx->m_pData; - C = ctx->m_chksum; - n = DIGEST_CBLOCK_MD2 - ctx->m_nDatLen; - - for (i = ctx->m_nDatLen; i < DIGEST_CBLOCK_MD2; i++) - X[i] = (sal_uInt8)(n & 0xff); - __rtl_digest_updateMD2 (ctx); - - for (i = 0; i < DIGEST_CBLOCK_MD2; i++) - X[i] = (sal_uInt8)(C[i] & 0xff); - __rtl_digest_updateMD2 (ctx); -} - -/*======================================================================== - * - * rtl_digest_MD2 implementation. - * - *======================================================================*/ -/* - * rtl_digest_MD2. - */ -rtlDigestError SAL_CALL rtl_digest_MD2 ( - const void *pData, sal_uInt32 nDatLen, - sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestMD2_Impl digest; - rtlDigestError result; - - digest.m_digest = __rtl_digest_MD2; - __rtl_digest_initMD2 (&(digest.m_context)); - - result = rtl_digest_updateMD2 (&digest, pData, nDatLen); - if (result == rtl_Digest_E_None) - result = rtl_digest_getMD2 (&digest, pBuffer, nBufLen); - - rtl_zeroMemory (&digest, sizeof (digest)); - return (result); -} - -/* - * rtl_digest_createMD2. - */ -rtlDigest SAL_CALL rtl_digest_createMD2 (void) -{ - DigestMD2_Impl *pImpl = (DigestMD2_Impl*)NULL; - pImpl = RTL_DIGEST_CREATE(DigestMD2_Impl); - if (pImpl) - { - pImpl->m_digest = __rtl_digest_MD2; - __rtl_digest_initMD2 (&(pImpl->m_context)); - } - return ((rtlDigest)pImpl); -} - -/* - * rtl_digest_updateMD2. - */ -rtlDigestError SAL_CALL rtl_digest_updateMD2 ( - rtlDigest Digest, const void *pData, sal_uInt32 nDatLen) -{ - DigestMD2_Impl *pImpl = (DigestMD2_Impl *)Digest; - const sal_uInt8 *d = (const sal_uInt8 *)pData; - - DigestContextMD2 *ctx; - - if ((pImpl == NULL) || (pData == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD2)) - return rtl_Digest_E_Algorithm; - - if (nDatLen == 0) - return rtl_Digest_E_None; - - ctx = &(pImpl->m_context); - - if (ctx->m_nDatLen) - { - sal_uInt8 *p = ctx->m_pData + ctx->m_nDatLen; - sal_uInt32 n = DIGEST_CBLOCK_MD2 - ctx->m_nDatLen; - - if (nDatLen < n) - { - rtl_copyMemory (p, d, nDatLen); - ctx->m_nDatLen += nDatLen; - - return rtl_Digest_E_None; - } - - rtl_copyMemory (p, d, n); - d += n; - nDatLen -= n; - - __rtl_digest_updateMD2 (ctx); - ctx->m_nDatLen = 0; - } - - while (nDatLen >= DIGEST_CBLOCK_MD2) - { - rtl_copyMemory (ctx->m_pData, d, DIGEST_CBLOCK_MD2); - d += DIGEST_CBLOCK_MD2; - nDatLen -= DIGEST_CBLOCK_MD2; - - __rtl_digest_updateMD2 (ctx); - } - - rtl_copyMemory (ctx->m_pData, d, nDatLen); - ctx->m_nDatLen = nDatLen; - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_getMD2. - */ -rtlDigestError SAL_CALL rtl_digest_getMD2 ( - rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestMD2_Impl *pImpl = (DigestMD2_Impl *)Digest; - sal_uInt32 i; - - DigestContextMD2 *ctx; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD2)) - return rtl_Digest_E_Algorithm; - - if (!(pImpl->m_digest.m_length <= nBufLen)) - return rtl_Digest_E_BufferSize; - - ctx = &(pImpl->m_context); - - __rtl_digest_endMD2 (ctx); - for (i = 0; i < DIGEST_CBLOCK_MD2; i++) - pBuffer[i] = (sal_uInt8)(ctx->m_state[i] & 0xff); - __rtl_digest_initMD2 (ctx); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_destroyMD2. - */ -void SAL_CALL rtl_digest_destroyMD2 (rtlDigest Digest) -{ - DigestMD2_Impl *pImpl = (DigestMD2_Impl *)Digest; - if (pImpl) - { - if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD2) - rtl_freeZeroMemory (pImpl, sizeof (DigestMD2_Impl)); - else - rtl_freeMemory (pImpl); - } -} - -/*======================================================================== - * - * rtl_digest_MD5 internals. - * - *======================================================================*/ -#define DIGEST_CBLOCK_MD5 64 -#define DIGEST_LBLOCK_MD5 16 - -typedef struct digestMD5_context_st -{ - sal_uInt32 m_nDatLen; - sal_uInt32 m_pData[DIGEST_LBLOCK_MD5]; - sal_uInt32 m_nA, m_nB, m_nC, m_nD; - sal_uInt32 m_nL, m_nH; -} DigestContextMD5; - -typedef struct digestMD5_impl_st -{ - Digest_Impl m_digest; - DigestContextMD5 m_context; -} DigestMD5_Impl; - -static void __rtl_digest_initMD5 (DigestContextMD5 *ctx); -static void __rtl_digest_updateMD5 (DigestContextMD5 *ctx); -static void __rtl_digest_endMD5 (DigestContextMD5 *ctx); - -#define F(x,y,z) ((((y) ^ (z)) & (x)) ^ (z)) -#define G(x,y,z) ((((x) ^ (y)) & (z)) ^ (y)) -#define H(x,y,z) ((x) ^ (y) ^ (z)) -#define I(x,y,z) (((x) | (~(z))) ^ (y)) - -#define R0(a,b,c,d,k,s,t) { \ - a += ((k) + (t) + F((b), (c), (d))); \ - a = RTL_DIGEST_ROTL(a, s); \ - a += b; } - -#define R1(a,b,c,d,k,s,t) { \ - a += ((k) + (t) + G((b), (c), (d))); \ - a = RTL_DIGEST_ROTL(a, s); \ - a += b; } - -#define R2(a,b,c,d,k,s,t) { \ - a += ((k) + (t) + H((b), (c), (d))); \ - a = RTL_DIGEST_ROTL(a, s); \ - a += b; } - -#define R3(a,b,c,d,k,s,t) { \ - a += ((k) + (t) + I((b), (c), (d))); \ - a = RTL_DIGEST_ROTL(a, s); \ - a += b; } - -/* - * __rtl_digest_MD5. - */ -static const Digest_Impl __rtl_digest_MD5 = -{ - rtl_Digest_AlgorithmMD5, - RTL_DIGEST_LENGTH_MD5, - - NULL, - rtl_digest_destroyMD5, - rtl_digest_updateMD5, - rtl_digest_getMD5 -}; - -/* - * __rtl_digest_initMD5. - */ -static void __rtl_digest_initMD5 (DigestContextMD5 *ctx) -{ - rtl_zeroMemory (ctx, sizeof (DigestContextMD5)); - - ctx->m_nA = (sal_uInt32)0x67452301L; - ctx->m_nB = (sal_uInt32)0xefcdab89L; - ctx->m_nC = (sal_uInt32)0x98badcfeL; - ctx->m_nD = (sal_uInt32)0x10325476L; -} - -/* - * __rtl_digest_updateMD5. - */ -static void __rtl_digest_updateMD5 (DigestContextMD5 *ctx) -{ - register sal_uInt32 A, B, C, D; - register sal_uInt32 *X; - - A = ctx->m_nA; - B = ctx->m_nB; - C = ctx->m_nC; - D = ctx->m_nD; - X = ctx->m_pData; - - R0 (A, B, C, D, X[ 0], 7, 0xd76aa478L); - R0 (D, A, B, C, X[ 1], 12, 0xe8c7b756L); - R0 (C, D, A, B, X[ 2], 17, 0x242070dbL); - R0 (B, C, D, A, X[ 3], 22, 0xc1bdceeeL); - R0 (A, B, C, D, X[ 4], 7, 0xf57c0fafL); - R0 (D, A, B, C, X[ 5], 12, 0x4787c62aL); - R0 (C, D, A, B, X[ 6], 17, 0xa8304613L); - R0 (B, C, D, A, X[ 7], 22, 0xfd469501L); - R0 (A, B, C, D, X[ 8], 7, 0x698098d8L); - R0 (D, A, B, C, X[ 9], 12, 0x8b44f7afL); - R0 (C, D, A, B, X[10], 17, 0xffff5bb1L); - R0 (B, C, D, A, X[11], 22, 0x895cd7beL); - R0 (A, B, C, D, X[12], 7, 0x6b901122L); - R0 (D, A, B, C, X[13], 12, 0xfd987193L); - R0 (C, D, A, B, X[14], 17, 0xa679438eL); - R0 (B, C, D, A, X[15], 22, 0x49b40821L); - - R1 (A, B, C, D, X[ 1], 5, 0xf61e2562L); - R1 (D, A, B, C, X[ 6], 9, 0xc040b340L); - R1 (C, D, A, B, X[11], 14, 0x265e5a51L); - R1 (B, C, D, A, X[ 0], 20, 0xe9b6c7aaL); - R1 (A, B, C, D, X[ 5], 5, 0xd62f105dL); - R1 (D, A, B, C, X[10], 9, 0x02441453L); - R1 (C, D, A, B, X[15], 14, 0xd8a1e681L); - R1 (B, C, D, A, X[ 4], 20, 0xe7d3fbc8L); - R1 (A, B, C, D, X[ 9], 5, 0x21e1cde6L); - R1 (D, A, B, C, X[14], 9, 0xc33707d6L); - R1 (C, D, A, B, X[ 3], 14, 0xf4d50d87L); - R1 (B, C, D, A, X[ 8], 20, 0x455a14edL); - R1 (A, B, C, D, X[13], 5, 0xa9e3e905L); - R1 (D, A, B, C, X[ 2], 9, 0xfcefa3f8L); - R1 (C, D, A, B, X[ 7], 14, 0x676f02d9L); - R1 (B, C, D, A, X[12], 20, 0x8d2a4c8aL); - - R2 (A, B, C, D, X[ 5], 4, 0xfffa3942L); - R2 (D, A, B, C, X[ 8], 11, 0x8771f681L); - R2 (C, D, A, B, X[11], 16, 0x6d9d6122L); - R2 (B, C, D, A, X[14], 23, 0xfde5380cL); - R2 (A, B, C, D, X[ 1], 4, 0xa4beea44L); - R2 (D, A, B, C, X[ 4], 11, 0x4bdecfa9L); - R2 (C, D, A, B, X[ 7], 16, 0xf6bb4b60L); - R2 (B, C, D, A, X[10], 23, 0xbebfbc70L); - R2 (A, B, C, D, X[13], 4, 0x289b7ec6L); - R2 (D, A, B, C, X[ 0], 11, 0xeaa127faL); - R2 (C, D, A, B, X[ 3], 16, 0xd4ef3085L); - R2 (B, C, D, A, X[ 6], 23, 0x04881d05L); - R2 (A, B, C, D, X[ 9], 4, 0xd9d4d039L); - R2 (D, A, B, C, X[12], 11, 0xe6db99e5L); - R2 (C, D, A, B, X[15], 16, 0x1fa27cf8L); - R2 (B, C, D, A, X[ 2], 23, 0xc4ac5665L); - - R3 (A, B, C, D, X[ 0], 6, 0xf4292244L); - R3 (D, A, B, C, X[ 7], 10, 0x432aff97L); - R3 (C, D, A, B, X[14], 15, 0xab9423a7L); - R3 (B, C, D, A, X[ 5], 21, 0xfc93a039L); - R3 (A, B, C, D, X[12], 6, 0x655b59c3L); - R3 (D, A, B, C, X[ 3], 10, 0x8f0ccc92L); - R3 (C, D, A, B, X[10], 15, 0xffeff47dL); - R3 (B, C, D, A, X[ 1], 21, 0x85845dd1L); - R3 (A, B, C, D, X[ 8], 6, 0x6fa87e4fL); - R3 (D, A, B, C, X[15], 10, 0xfe2ce6e0L); - R3 (C, D, A, B, X[ 6], 15, 0xa3014314L); - R3 (B, C, D, A, X[13], 21, 0x4e0811a1L); - R3 (A, B, C, D, X[ 4], 6, 0xf7537e82L); - R3 (D, A, B, C, X[11], 10, 0xbd3af235L); - R3 (C, D, A, B, X[ 2], 15, 0x2ad7d2bbL); - R3 (B, C, D, A, X[ 9], 21, 0xeb86d391L); - - ctx->m_nA += A; - ctx->m_nB += B; - ctx->m_nC += C; - ctx->m_nD += D; -} - -/* - * __rtl_digest_endMD5. - */ -static void __rtl_digest_endMD5 (DigestContextMD5 *ctx) -{ - static const sal_uInt8 end[4] = - { - 0x80, 0x00, 0x00, 0x00 - }; - register const sal_uInt8 *p = end; - - register sal_uInt32 *X; - register int i; - - X = ctx->m_pData; - i = (ctx->m_nDatLen >> 2); - -#ifdef OSL_BIGENDIAN - __rtl_digest_swapLong (X, i + 1); -#endif /* OSL_BIGENDIAN */ - - switch (ctx->m_nDatLen & 0x03) - { - case 1: X[i] &= 0x000000ff; break; - case 2: X[i] &= 0x0000ffff; break; - case 3: X[i] &= 0x00ffffff; break; - } - - switch (ctx->m_nDatLen & 0x03) - { - case 0: X[i] = ((sal_uInt32)(*(p++))) << 0L; - case 1: X[i] |= ((sal_uInt32)(*(p++))) << 8L; - case 2: X[i] |= ((sal_uInt32)(*(p++))) << 16L; - case 3: X[i] |= ((sal_uInt32)(*p)) << 24L; - } - - i += 1; - - if (i >= (DIGEST_LBLOCK_MD5 - 2)) - { - for (; i < DIGEST_LBLOCK_MD5; i++) - X[i] = 0; - __rtl_digest_updateMD5 (ctx); - i = 0; - } - - for (; i < (DIGEST_LBLOCK_MD5 - 2); i++) - X[i] = 0; - - X[DIGEST_LBLOCK_MD5 - 2] = ctx->m_nL; - X[DIGEST_LBLOCK_MD5 - 1] = ctx->m_nH; - - __rtl_digest_updateMD5 (ctx); -} - -/*======================================================================== - * - * rtl_digest_MD5 implementation. - * - *======================================================================*/ -/* - * rtl_digest_MD5. - */ -rtlDigestError SAL_CALL rtl_digest_MD5 ( - const void *pData, sal_uInt32 nDatLen, - sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestMD5_Impl digest; - rtlDigestError result; - - digest.m_digest = __rtl_digest_MD5; - __rtl_digest_initMD5 (&(digest.m_context)); - - result = rtl_digest_update (&digest, pData, nDatLen); - if (result == rtl_Digest_E_None) - result = rtl_digest_getMD5 (&digest, pBuffer, nBufLen); - - rtl_zeroMemory (&digest, sizeof (digest)); - return (result); -} - -/* - * rtl_digest_createMD5. - */ -rtlDigest SAL_CALL rtl_digest_createMD5 (void) -{ - DigestMD5_Impl *pImpl = (DigestMD5_Impl*)NULL; - pImpl = RTL_DIGEST_CREATE(DigestMD5_Impl); - if (pImpl) - { - pImpl->m_digest = __rtl_digest_MD5; - __rtl_digest_initMD5 (&(pImpl->m_context)); - } - return ((rtlDigest)pImpl); -} - -/* - * rtl_digest_updateMD5. - */ -rtlDigestError SAL_CALL rtl_digest_updateMD5 ( - rtlDigest Digest, const void *pData, sal_uInt32 nDatLen) -{ - DigestMD5_Impl *pImpl = (DigestMD5_Impl *)Digest; - const sal_uInt8 *d = (const sal_uInt8 *)pData; - - DigestContextMD5 *ctx; - sal_uInt32 len; - - if ((pImpl == NULL) || (pData == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD5)) - return rtl_Digest_E_Algorithm; - - if (nDatLen == 0) - return rtl_Digest_E_None; - - ctx = &(pImpl->m_context); - - len = ctx->m_nL + (nDatLen << 3); - if (len < ctx->m_nL) ctx->m_nH += 1; - ctx->m_nH += (nDatLen >> 29); - ctx->m_nL = len; - - if (ctx->m_nDatLen) - { - sal_uInt8 *p = (sal_uInt8 *)(ctx->m_pData) + ctx->m_nDatLen; - sal_uInt32 n = DIGEST_CBLOCK_MD5 - ctx->m_nDatLen; - - if (nDatLen < n) - { - rtl_copyMemory (p, d, nDatLen); - ctx->m_nDatLen += nDatLen; - - return rtl_Digest_E_None; - } - - rtl_copyMemory (p, d, n); - d += n; - nDatLen -= n; - -#ifdef OSL_BIGENDIAN - __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_MD5); -#endif /* OSL_BIGENDIAN */ - - __rtl_digest_updateMD5 (ctx); - ctx->m_nDatLen = 0; - } - - while (nDatLen >= DIGEST_CBLOCK_MD5) - { - rtl_copyMemory (ctx->m_pData, d, DIGEST_CBLOCK_MD5); - d += DIGEST_CBLOCK_MD5; - nDatLen -= DIGEST_CBLOCK_MD5; - -#ifdef OSL_BIGENDIAN - __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_MD5); -#endif /* OSL_BIGENDIAN */ - - __rtl_digest_updateMD5 (ctx); - } - - rtl_copyMemory (ctx->m_pData, d, nDatLen); - ctx->m_nDatLen = nDatLen; - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_getMD5. - */ -rtlDigestError SAL_CALL rtl_digest_getMD5 ( - rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestMD5_Impl *pImpl = (DigestMD5_Impl *)Digest; - sal_uInt8 *p = pBuffer; - - DigestContextMD5 *ctx; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD5)) - return rtl_Digest_E_Algorithm; - - if (!(pImpl->m_digest.m_length <= nBufLen)) - return rtl_Digest_E_BufferSize; - - ctx = &(pImpl->m_context); - - __rtl_digest_endMD5 (ctx); - RTL_DIGEST_LTOC (ctx->m_nA, p); - RTL_DIGEST_LTOC (ctx->m_nB, p); - RTL_DIGEST_LTOC (ctx->m_nC, p); - RTL_DIGEST_LTOC (ctx->m_nD, p); - __rtl_digest_initMD5 (ctx); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_rawMD5. - */ -rtlDigestError SAL_CALL rtl_digest_rawMD5 ( - rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestMD5_Impl *pImpl = (DigestMD5_Impl *)Digest; - sal_uInt8 *p = pBuffer; - - DigestContextMD5 *ctx; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD5)) - return rtl_Digest_E_Algorithm; - - if (!(pImpl->m_digest.m_length <= nBufLen)) - return rtl_Digest_E_BufferSize; - - ctx = &(pImpl->m_context); - - /* __rtl_digest_endMD5 (ctx); *//* not finalized */ - RTL_DIGEST_LTOC (ctx->m_nA, p); - RTL_DIGEST_LTOC (ctx->m_nB, p); - RTL_DIGEST_LTOC (ctx->m_nC, p); - RTL_DIGEST_LTOC (ctx->m_nD, p); - __rtl_digest_initMD5 (ctx); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_destroyMD5. - */ -void SAL_CALL rtl_digest_destroyMD5 (rtlDigest Digest) -{ - DigestMD5_Impl *pImpl = (DigestMD5_Impl *)Digest; - if (pImpl) - { - if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD5) - rtl_freeZeroMemory (pImpl, sizeof (DigestMD5_Impl)); - else - rtl_freeMemory (pImpl); - } -} - -/*======================================================================== - * - * rtl_digest_(SHA|SHA1) common internals. - * - *======================================================================*/ -#define DIGEST_CBLOCK_SHA 64 -#define DIGEST_LBLOCK_SHA 16 - -typedef sal_uInt32 DigestSHA_update_t (sal_uInt32 x); - -static sal_uInt32 __rtl_digest_updateSHA_0 (sal_uInt32 x); -static sal_uInt32 __rtl_digest_updateSHA_1 (sal_uInt32 x); - -typedef struct digestSHA_context_st -{ - DigestSHA_update_t *m_update; - sal_uInt32 m_nDatLen; - sal_uInt32 m_pData[DIGEST_LBLOCK_SHA]; - sal_uInt32 m_nA, m_nB, m_nC, m_nD, m_nE; - sal_uInt32 m_nL, m_nH; -} DigestContextSHA; - -typedef struct digestSHA_impl_st -{ - Digest_Impl m_digest; - DigestContextSHA m_context; -} DigestSHA_Impl; - -static void __rtl_digest_initSHA ( - DigestContextSHA *ctx, DigestSHA_update_t *fct); - -static void __rtl_digest_updateSHA (DigestContextSHA *ctx); -static void __rtl_digest_endSHA (DigestContextSHA *ctx); - -#define K_00_19 (sal_uInt32)0x5a827999L -#define K_20_39 (sal_uInt32)0x6ed9eba1L -#define K_40_59 (sal_uInt32)0x8f1bbcdcL -#define K_60_79 (sal_uInt32)0xca62c1d6L - -#define F_00_19(b,c,d) ((((c) ^ (d)) & (b)) ^ (d)) -#define F_20_39(b,c,d) ((b) ^ (c) ^ (d)) -#define F_40_59(b,c,d) (((b) & (c)) | ((b) & (d)) | ((c) & (d))) -#define F_60_79(b,c,d) F_20_39(b,c,d) - -#define BODY_X(i) \ - (X[(i)&0x0f] ^ X[((i)+2)&0x0f] ^ X[((i)+8)&0x0f] ^ X[((i)+13)&0x0f]) - -#define BODY_00_15(u,i,a,b,c,d,e,f) \ - (f) = X[i]; \ - (f) += (e) + K_00_19 + RTL_DIGEST_ROTL((a), 5) + F_00_19((b), (c), (d)); \ - (b) = RTL_DIGEST_ROTL((b), 30); - -#define BODY_16_19(u,i,a,b,c,d,e,f) \ - (f) = BODY_X((i)); \ - (f) = X[(i)&0x0f] = (u)((f)); \ - (f) += (e) + K_00_19 + RTL_DIGEST_ROTL((a), 5) + F_00_19((b), (c), (d)); \ - (b) = RTL_DIGEST_ROTL((b), 30); - -#define BODY_20_39(u,i,a,b,c,d,e,f) \ - (f) = BODY_X((i)); \ - (f) = X[(i)&0x0f] = (u)((f)); \ - (f) += (e) + K_20_39 + RTL_DIGEST_ROTL((a), 5) + F_20_39((b), (c), (d)); \ - (b) = RTL_DIGEST_ROTL((b), 30); - -#define BODY_40_59(u,i,a,b,c,d,e,f) \ - (f) = BODY_X((i)); \ - (f) = X[(i)&0x0f] = (u)((f)); \ - (f) += (e) + K_40_59 + RTL_DIGEST_ROTL((a), 5) + F_40_59((b), (c), (d)); \ - (b) = RTL_DIGEST_ROTL((b), 30); - -#define BODY_60_79(u,i,a,b,c,d,e,f) \ - (f) = BODY_X((i)); \ - (f) = X[(i)&0x0f] = (u)((f)); \ - (f) += (e) + K_60_79 + RTL_DIGEST_ROTL((a), 5) + F_60_79((b), (c), (d)); \ - (b) = RTL_DIGEST_ROTL((b), 30); - -/* - * __rtl_digest_initSHA. - */ -static void __rtl_digest_initSHA ( - DigestContextSHA *ctx, DigestSHA_update_t *fct) -{ - rtl_zeroMemory (ctx, sizeof (DigestContextSHA)); - ctx->m_update = fct; - - ctx->m_nA = (sal_uInt32)0x67452301L; - ctx->m_nB = (sal_uInt32)0xefcdab89L; - ctx->m_nC = (sal_uInt32)0x98badcfeL; - ctx->m_nD = (sal_uInt32)0x10325476L; - ctx->m_nE = (sal_uInt32)0xc3d2e1f0L; -} - -/* - * __rtl_digest_updateSHA. - */ -static void __rtl_digest_updateSHA (DigestContextSHA *ctx) -{ - register sal_uInt32 A, B, C, D, E, T; - register sal_uInt32 *X; - - register DigestSHA_update_t *U; - U = ctx->m_update; - - A = ctx->m_nA; - B = ctx->m_nB; - C = ctx->m_nC; - D = ctx->m_nD; - E = ctx->m_nE; - X = ctx->m_pData; - - BODY_00_15 (U, 0, A, B, C, D, E, T); - BODY_00_15 (U, 1, T, A, B, C, D, E); - BODY_00_15 (U, 2, E, T, A, B, C, D); - BODY_00_15 (U, 3, D, E, T, A, B, C); - BODY_00_15 (U, 4, C, D, E, T, A, B); - BODY_00_15 (U, 5, B, C, D, E, T, A); - BODY_00_15 (U, 6, A, B, C, D, E, T); - BODY_00_15 (U, 7, T, A, B, C, D, E); - BODY_00_15 (U, 8, E, T, A, B, C, D); - BODY_00_15 (U, 9, D, E, T, A, B, C); - BODY_00_15 (U, 10, C, D, E, T, A, B); - BODY_00_15 (U, 11, B, C, D, E, T, A); - BODY_00_15 (U, 12, A, B, C, D, E, T); - BODY_00_15 (U, 13, T, A, B, C, D, E); - BODY_00_15 (U, 14, E, T, A, B, C, D); - BODY_00_15 (U, 15, D, E, T, A, B, C); - BODY_16_19 (U, 16, C, D, E, T, A, B); - BODY_16_19 (U, 17, B, C, D, E, T, A); - BODY_16_19 (U, 18, A, B, C, D, E, T); - BODY_16_19 (U, 19, T, A, B, C, D, E); - - BODY_20_39 (U, 20, E, T, A, B, C, D); - BODY_20_39 (U, 21, D, E, T, A, B, C); - BODY_20_39 (U, 22, C, D, E, T, A, B); - BODY_20_39 (U, 23, B, C, D, E, T, A); - BODY_20_39 (U, 24, A, B, C, D, E, T); - BODY_20_39 (U, 25, T, A, B, C, D, E); - BODY_20_39 (U, 26, E, T, A, B, C, D); - BODY_20_39 (U, 27, D, E, T, A, B, C); - BODY_20_39 (U, 28, C, D, E, T, A, B); - BODY_20_39 (U, 29, B, C, D, E, T, A); - BODY_20_39 (U, 30, A, B, C, D, E, T); - BODY_20_39 (U, 31, T, A, B, C, D, E); - BODY_20_39 (U, 32, E, T, A, B, C, D); - BODY_20_39 (U, 33, D, E, T, A, B, C); - BODY_20_39 (U, 34, C, D, E, T, A, B); - BODY_20_39 (U, 35, B, C, D, E, T, A); - BODY_20_39 (U, 36, A, B, C, D, E, T); - BODY_20_39 (U, 37, T, A, B, C, D, E); - BODY_20_39 (U, 38, E, T, A, B, C, D); - BODY_20_39 (U, 39, D, E, T, A, B, C); - - BODY_40_59 (U, 40, C, D, E, T, A, B); - BODY_40_59 (U, 41, B, C, D, E, T, A); - BODY_40_59 (U, 42, A, B, C, D, E, T); - BODY_40_59 (U, 43, T, A, B, C, D, E); - BODY_40_59 (U, 44, E, T, A, B, C, D); - BODY_40_59 (U, 45, D, E, T, A, B, C); - BODY_40_59 (U, 46, C, D, E, T, A, B); - BODY_40_59 (U, 47, B, C, D, E, T, A); - BODY_40_59 (U, 48, A, B, C, D, E, T); - BODY_40_59 (U, 49, T, A, B, C, D, E); - BODY_40_59 (U, 50, E, T, A, B, C, D); - BODY_40_59 (U, 51, D, E, T, A, B, C); - BODY_40_59 (U, 52, C, D, E, T, A, B); - BODY_40_59 (U, 53, B, C, D, E, T, A); - BODY_40_59 (U, 54, A, B, C, D, E, T); - BODY_40_59 (U, 55, T, A, B, C, D, E); - BODY_40_59 (U, 56, E, T, A, B, C, D); - BODY_40_59 (U, 57, D, E, T, A, B, C); - BODY_40_59 (U, 58, C, D, E, T, A, B); - BODY_40_59 (U, 59, B, C, D, E, T, A); - - BODY_60_79 (U, 60, A, B, C, D, E, T); - BODY_60_79 (U, 61, T, A, B, C, D, E); - BODY_60_79 (U, 62, E, T, A, B, C, D); - BODY_60_79 (U, 63, D, E, T, A, B, C); - BODY_60_79 (U, 64, C, D, E, T, A, B); - BODY_60_79 (U, 65, B, C, D, E, T, A); - BODY_60_79 (U, 66, A, B, C, D, E, T); - BODY_60_79 (U, 67, T, A, B, C, D, E); - BODY_60_79 (U, 68, E, T, A, B, C, D); - BODY_60_79 (U, 69, D, E, T, A, B, C); - BODY_60_79 (U, 70, C, D, E, T, A, B); - BODY_60_79 (U, 71, B, C, D, E, T, A); - BODY_60_79 (U, 72, A, B, C, D, E, T); - BODY_60_79 (U, 73, T, A, B, C, D, E); - BODY_60_79 (U, 74, E, T, A, B, C, D); - BODY_60_79 (U, 75, D, E, T, A, B, C); - BODY_60_79 (U, 76, C, D, E, T, A, B); - BODY_60_79 (U, 77, B, C, D, E, T, A); - BODY_60_79 (U, 78, A, B, C, D, E, T); - BODY_60_79 (U, 79, T, A, B, C, D, E); - - ctx->m_nA += E; - ctx->m_nB += T; - ctx->m_nC += A; - ctx->m_nD += B; - ctx->m_nE += C; -} - -/* - * __rtl_digest_endSHA. - */ -static void __rtl_digest_endSHA (DigestContextSHA *ctx) -{ - static const sal_uInt8 end[4] = - { - 0x80, 0x00, 0x00, 0x00 - }; - register const sal_uInt8 *p = end; - - register sal_uInt32 *X; - register int i; - - X = ctx->m_pData; - i = (ctx->m_nDatLen >> 2); - -#ifdef OSL_BIGENDIAN - __rtl_digest_swapLong (X, i + 1); -#endif /* OSL_BIGENDIAN */ - - switch (ctx->m_nDatLen & 0x03) - { - case 1: X[i] &= 0x000000ff; break; - case 2: X[i] &= 0x0000ffff; break; - case 3: X[i] &= 0x00ffffff; break; - } - - switch (ctx->m_nDatLen & 0x03) - { - case 0: X[i] = ((sal_uInt32)(*(p++))) << 0L; - case 1: X[i] |= ((sal_uInt32)(*(p++))) << 8L; - case 2: X[i] |= ((sal_uInt32)(*(p++))) << 16L; - case 3: X[i] |= ((sal_uInt32)(*(p++))) << 24L; - } - - __rtl_digest_swapLong (X, i + 1); - - i += 1; - - if (i >= (DIGEST_LBLOCK_SHA - 2)) - { - for (; i < DIGEST_LBLOCK_SHA; i++) - X[i] = 0; - __rtl_digest_updateSHA (ctx); - i = 0; - } - - for (; i < (DIGEST_LBLOCK_SHA - 2); i++) - X[i] = 0; - - X[DIGEST_LBLOCK_SHA - 2] = ctx->m_nH; - X[DIGEST_LBLOCK_SHA - 1] = ctx->m_nL; - - __rtl_digest_updateSHA (ctx); -} - -/*======================================================================== - * - * rtl_digest_SHA internals. - * - *======================================================================*/ -/* - * __rtl_digest_SHA_0. - */ -static const Digest_Impl __rtl_digest_SHA_0 = -{ - rtl_Digest_AlgorithmSHA, - RTL_DIGEST_LENGTH_SHA, - - NULL, - rtl_digest_destroySHA, - rtl_digest_updateSHA, - rtl_digest_getSHA -}; - -/* - * __rtl_digest_updateSHA_0. - */ -static sal_uInt32 __rtl_digest_updateSHA_0 (sal_uInt32 x) -{ - return x; -} - -/*======================================================================== - * - * rtl_digest_SHA implementation. - * - *======================================================================*/ -/* - * rtl_digest_SHA. - */ -rtlDigestError SAL_CALL rtl_digest_SHA ( - const void *pData, sal_uInt32 nDatLen, - sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestSHA_Impl digest; - rtlDigestError result; - - digest.m_digest = __rtl_digest_SHA_0; - __rtl_digest_initSHA (&(digest.m_context), __rtl_digest_updateSHA_0); - - result = rtl_digest_updateSHA (&digest, pData, nDatLen); - if (result == rtl_Digest_E_None) - result = rtl_digest_getSHA (&digest, pBuffer, nBufLen); - - rtl_zeroMemory (&digest, sizeof (digest)); - return (result); -} - -/* - * rtl_digest_createSHA. - */ -rtlDigest SAL_CALL rtl_digest_createSHA (void) -{ - DigestSHA_Impl *pImpl = (DigestSHA_Impl*)NULL; - pImpl = RTL_DIGEST_CREATE(DigestSHA_Impl); - if (pImpl) - { - pImpl->m_digest = __rtl_digest_SHA_0; - __rtl_digest_initSHA (&(pImpl->m_context), __rtl_digest_updateSHA_0); - } - return ((rtlDigest)pImpl); -} - -/* - * rtl_digest_updateSHA. - */ -rtlDigestError SAL_CALL rtl_digest_updateSHA ( - rtlDigest Digest, const void *pData, sal_uInt32 nDatLen) -{ - DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest; - const sal_uInt8 *d = (const sal_uInt8 *)pData; - - DigestContextSHA *ctx; - sal_uInt32 len; - - if ((pImpl == NULL) || (pData == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA)) - return rtl_Digest_E_Algorithm; - - if (nDatLen == 0) - return rtl_Digest_E_None; - - ctx = &(pImpl->m_context); - - len = ctx->m_nL + (nDatLen << 3); - if (len < ctx->m_nL) ctx->m_nH += 1; - ctx->m_nH += (nDatLen >> 29); - ctx->m_nL = len; - - if (ctx->m_nDatLen) - { - sal_uInt8 *p = (sal_uInt8 *)(ctx->m_pData) + ctx->m_nDatLen; - sal_uInt32 n = DIGEST_CBLOCK_SHA - ctx->m_nDatLen; - - if (nDatLen < n) - { - rtl_copyMemory (p, d, nDatLen); - ctx->m_nDatLen += nDatLen; - - return rtl_Digest_E_None; - } - - rtl_copyMemory (p, d, n); - d += n; - nDatLen -= n; - -#ifndef OSL_BIGENDIAN - __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA); -#endif /* OSL_BIGENDIAN */ - - __rtl_digest_updateSHA (ctx); - ctx->m_nDatLen = 0; - } - - while (nDatLen >= DIGEST_CBLOCK_SHA) - { - rtl_copyMemory (ctx->m_pData, d, DIGEST_CBLOCK_SHA); - d += DIGEST_CBLOCK_SHA; - nDatLen -= DIGEST_CBLOCK_SHA; - -#ifndef OSL_BIGENDIAN - __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA); -#endif /* OSL_BIGENDIAN */ - - __rtl_digest_updateSHA (ctx); - } - - rtl_copyMemory (ctx->m_pData, d, nDatLen); - ctx->m_nDatLen = nDatLen; - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_getSHA. - */ -rtlDigestError SAL_CALL rtl_digest_getSHA ( - rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest; - sal_uInt8 *p = pBuffer; - - DigestContextSHA *ctx; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA)) - return rtl_Digest_E_Algorithm; - - if (!(pImpl->m_digest.m_length <= nBufLen)) - return rtl_Digest_E_BufferSize; - - ctx = &(pImpl->m_context); - - __rtl_digest_endSHA (ctx); - RTL_DIGEST_HTONL (ctx->m_nA, p); - RTL_DIGEST_HTONL (ctx->m_nB, p); - RTL_DIGEST_HTONL (ctx->m_nC, p); - RTL_DIGEST_HTONL (ctx->m_nD, p); - RTL_DIGEST_HTONL (ctx->m_nE, p); - __rtl_digest_initSHA (ctx, __rtl_digest_updateSHA_0); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_destroySHA. - */ -void SAL_CALL rtl_digest_destroySHA (rtlDigest Digest) -{ - DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest; - if (pImpl) - { - if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA) - rtl_freeZeroMemory (pImpl, sizeof (DigestSHA_Impl)); - else - rtl_freeMemory (pImpl); - } -} - -/*======================================================================== - * - * rtl_digest_SHA1 internals. - * - *======================================================================*/ -/* - * __rtl_digest_SHA_1. - */ -static const Digest_Impl __rtl_digest_SHA_1 = -{ - rtl_Digest_AlgorithmSHA1, - RTL_DIGEST_LENGTH_SHA1, - - NULL, - rtl_digest_destroySHA1, - rtl_digest_updateSHA1, - rtl_digest_getSHA1 -}; - -/* - * __rtl_digest_updateSHA_1. - */ -static sal_uInt32 __rtl_digest_updateSHA_1 (sal_uInt32 x) -{ - return RTL_DIGEST_ROTL (x, 1); -} - -/*======================================================================== - * - * rtl_digest_SHA1 implementation. - * - *======================================================================*/ -/* - * rtl_digest_SHA1. - */ -rtlDigestError SAL_CALL rtl_digest_SHA1 ( - const void *pData, sal_uInt32 nDatLen, - sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestSHA_Impl digest; - rtlDigestError result; - - digest.m_digest = __rtl_digest_SHA_1; - __rtl_digest_initSHA (&(digest.m_context), __rtl_digest_updateSHA_1); - - result = rtl_digest_updateSHA1 (&digest, pData, nDatLen); - if (result == rtl_Digest_E_None) - result = rtl_digest_getSHA1 (&digest, pBuffer, nBufLen); - - rtl_zeroMemory (&digest, sizeof (digest)); - return (result); -} - -/* - * rtl_digest_createSHA1. - */ -rtlDigest SAL_CALL rtl_digest_createSHA1 (void) -{ - DigestSHA_Impl *pImpl = (DigestSHA_Impl*)NULL; - pImpl = RTL_DIGEST_CREATE(DigestSHA_Impl); - if (pImpl) - { - pImpl->m_digest = __rtl_digest_SHA_1; - __rtl_digest_initSHA (&(pImpl->m_context), __rtl_digest_updateSHA_1); - } - return ((rtlDigest)pImpl); -} - -/* - * rtl_digest_updateSHA1. - */ -rtlDigestError SAL_CALL rtl_digest_updateSHA1 ( - rtlDigest Digest, const void *pData, sal_uInt32 nDatLen) -{ - DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest; - const sal_uInt8 *d = (const sal_uInt8 *)pData; - - DigestContextSHA *ctx; - sal_uInt32 len; - - if ((pImpl == NULL) || (pData == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA1)) - return rtl_Digest_E_Algorithm; - - if (nDatLen == 0) - return rtl_Digest_E_None; - - ctx = &(pImpl->m_context); - - len = ctx->m_nL + (nDatLen << 3); - if (len < ctx->m_nL) ctx->m_nH += 1; - ctx->m_nH += (nDatLen >> 29); - ctx->m_nL = len; - - if (ctx->m_nDatLen) - { - sal_uInt8 *p = (sal_uInt8 *)(ctx->m_pData) + ctx->m_nDatLen; - sal_uInt32 n = DIGEST_CBLOCK_SHA - ctx->m_nDatLen; - - if (nDatLen < n) - { - rtl_copyMemory (p, d, nDatLen); - ctx->m_nDatLen += nDatLen; - - return rtl_Digest_E_None; - } - - rtl_copyMemory (p, d, n); - d += n; - nDatLen -= n; - -#ifndef OSL_BIGENDIAN - __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA); -#endif /* OSL_BIGENDIAN */ - - __rtl_digest_updateSHA (ctx); - ctx->m_nDatLen = 0; - } - - while (nDatLen >= DIGEST_CBLOCK_SHA) - { - rtl_copyMemory (ctx->m_pData, d, DIGEST_CBLOCK_SHA); - d += DIGEST_CBLOCK_SHA; - nDatLen -= DIGEST_CBLOCK_SHA; - -#ifndef OSL_BIGENDIAN - __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA); -#endif /* OSL_BIGENDIAN */ - - __rtl_digest_updateSHA (ctx); - } - - rtl_copyMemory (ctx->m_pData, d, nDatLen); - ctx->m_nDatLen = nDatLen; - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_getSHA1. - */ -rtlDigestError SAL_CALL rtl_digest_getSHA1 ( - rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest; - sal_uInt8 *p = pBuffer; - - DigestContextSHA *ctx; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA1)) - return rtl_Digest_E_Algorithm; - - if (!(pImpl->m_digest.m_length <= nBufLen)) - return rtl_Digest_E_BufferSize; - - ctx = &(pImpl->m_context); - - __rtl_digest_endSHA (ctx); - RTL_DIGEST_HTONL (ctx->m_nA, p); - RTL_DIGEST_HTONL (ctx->m_nB, p); - RTL_DIGEST_HTONL (ctx->m_nC, p); - RTL_DIGEST_HTONL (ctx->m_nD, p); - RTL_DIGEST_HTONL (ctx->m_nE, p); - __rtl_digest_initSHA (ctx, __rtl_digest_updateSHA_1); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_destroySHA1. - */ -void SAL_CALL rtl_digest_destroySHA1 (rtlDigest Digest) -{ - DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest; - if (pImpl) - { - if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA1) - rtl_freeZeroMemory (pImpl, sizeof (DigestSHA_Impl)); - else - rtl_freeMemory (pImpl); - } -} - -/*======================================================================== - * - * rtl_digest_HMAC_MD5 internals. - * - *======================================================================*/ -#define DIGEST_CBLOCK_HMAC_MD5 64 - -typedef struct _contextHMAC_MD5_st -{ - DigestMD5_Impl m_hash; - sal_uInt8 m_opad[DIGEST_CBLOCK_HMAC_MD5]; -} ContextHMAC_MD5; - -typedef struct _digestHMAC_MD5_impl_st -{ - Digest_Impl m_digest; - ContextHMAC_MD5 m_context; -} DigestHMAC_MD5_Impl; - -static void __rtl_digest_initHMAC_MD5 (ContextHMAC_MD5 * ctx); -static void __rtl_digest_ipadHMAC_MD5 (ContextHMAC_MD5 * ctx); -static void __rtl_digest_opadHMAC_MD5 (ContextHMAC_MD5 * ctx); - -/* - * __rtl_digest_HMAC_MD5. - */ -static const Digest_Impl __rtl_digest_HMAC_MD5 = -{ - rtl_Digest_AlgorithmHMAC_MD5, - RTL_DIGEST_LENGTH_MD5, - - rtl_digest_initHMAC_MD5, - rtl_digest_destroyHMAC_MD5, - rtl_digest_updateHMAC_MD5, - rtl_digest_getHMAC_MD5 -}; - -/* - * __rtl_digest_initHMAC_MD5. - */ -static void __rtl_digest_initHMAC_MD5 (ContextHMAC_MD5 * ctx) -{ - DigestMD5_Impl *pImpl = &(ctx->m_hash); - - pImpl->m_digest = __rtl_digest_MD5; - __rtl_digest_initMD5 (&(pImpl->m_context)); - - rtl_zeroMemory (ctx->m_opad, DIGEST_CBLOCK_HMAC_MD5); -} - -/* - * __rtl_digest_ipadHMAC_MD5. - */ -static void __rtl_digest_ipadHMAC_MD5 (ContextHMAC_MD5 * ctx) -{ - register sal_uInt32 i; - - for (i = 0; i < DIGEST_CBLOCK_HMAC_MD5; i++) - ctx->m_opad[i] ^= 0x36; - rtl_digest_updateMD5 ( - &(ctx->m_hash), ctx->m_opad, DIGEST_CBLOCK_HMAC_MD5); - for (i = 0; i < DIGEST_CBLOCK_HMAC_MD5; i++) - ctx->m_opad[i] ^= 0x36; -} - -/* - * __rtl_digest_opadHMAC_MD5. - */ -static void __rtl_digest_opadHMAC_MD5 (ContextHMAC_MD5 * ctx) -{ - register sal_uInt32 i; - - for (i = 0; i < DIGEST_CBLOCK_HMAC_MD5; i++) - ctx->m_opad[i] ^= 0x5c; -} - -/*======================================================================== - * - * rtl_digest_HMAC_MD5 implementation. - * - *======================================================================*/ -/* - * rtl_digest_HMAC_MD5. - */ -rtlDigestError SAL_CALL rtl_digest_HMAC_MD5 ( - const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen, - const void *pData, sal_uInt32 nDatLen, - sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestHMAC_MD5_Impl digest; - rtlDigestError result; - - digest.m_digest = __rtl_digest_HMAC_MD5; - - result = rtl_digest_initHMAC_MD5 (&digest, pKeyData, nKeyLen); - if (result == rtl_Digest_E_None) - { - result = rtl_digest_updateHMAC_MD5 (&digest, pData, nDatLen); - if (result == rtl_Digest_E_None) - result = rtl_digest_getHMAC_MD5 (&digest, pBuffer, nBufLen); - } - - rtl_zeroMemory (&digest, sizeof (digest)); - return (result); -} - -/* - * rtl_digest_createHMAC_MD5. - */ -rtlDigest SAL_CALL rtl_digest_createHMAC_MD5 (void) -{ - DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)NULL; - pImpl = RTL_DIGEST_CREATE(DigestHMAC_MD5_Impl); - if (pImpl) - { - pImpl->m_digest = __rtl_digest_HMAC_MD5; - __rtl_digest_initHMAC_MD5 (&(pImpl->m_context)); - } - return ((rtlDigest)pImpl); -} - -/* - * rtl_digest_initHMAC_MD5. - */ -rtlDigestError SAL_CALL rtl_digest_initHMAC_MD5 ( - rtlDigest Digest, const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen) -{ - DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)Digest; - ContextHMAC_MD5 *ctx; - - if ((pImpl == NULL) || (pKeyData == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_MD5)) - return rtl_Digest_E_Algorithm; - - ctx = &(pImpl->m_context); - __rtl_digest_initHMAC_MD5 (ctx); - - if (nKeyLen > DIGEST_CBLOCK_HMAC_MD5) - { - /* Initialize 'opad' with hashed 'KeyData' */ - rtl_digest_updateMD5 ( - &(ctx->m_hash), pKeyData, nKeyLen); - rtl_digest_getMD5 ( - &(ctx->m_hash), ctx->m_opad, RTL_DIGEST_LENGTH_MD5); - } - else - { - /* Initialize 'opad' with plain 'KeyData' */ - rtl_copyMemory (ctx->m_opad, pKeyData, nKeyLen); - } - - __rtl_digest_ipadHMAC_MD5 (ctx); - __rtl_digest_opadHMAC_MD5 (ctx); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_updateHMAC_MD5. - */ -rtlDigestError SAL_CALL rtl_digest_updateHMAC_MD5 ( - rtlDigest Digest, const void *pData, sal_uInt32 nDatLen) -{ - DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)Digest; - ContextHMAC_MD5 *ctx; - - if ((pImpl == NULL) || (pData == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_MD5)) - return rtl_Digest_E_Algorithm; - - ctx = &(pImpl->m_context); - rtl_digest_updateMD5 (&(ctx->m_hash), pData, nDatLen); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_getHMAC_MD5. - */ -rtlDigestError SAL_CALL rtl_digest_getHMAC_MD5 ( - rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)Digest; - ContextHMAC_MD5 *ctx; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_MD5)) - return rtl_Digest_E_Algorithm; - - if (!(pImpl->m_digest.m_length <= nBufLen)) - return rtl_Digest_E_BufferSize; - - nBufLen = pImpl->m_digest.m_length; - - ctx = &(pImpl->m_context); - rtl_digest_getMD5 (&(ctx->m_hash), pBuffer, nBufLen); - - rtl_digest_updateMD5 (&(ctx->m_hash), ctx->m_opad, 64); - rtl_digest_updateMD5 (&(ctx->m_hash), pBuffer, nBufLen); - rtl_digest_getMD5 (&(ctx->m_hash), pBuffer, nBufLen); - - __rtl_digest_opadHMAC_MD5 (ctx); - __rtl_digest_ipadHMAC_MD5 (ctx); - __rtl_digest_opadHMAC_MD5 (ctx); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_destroyHMAC_MD5. - */ -void SAL_CALL rtl_digest_destroyHMAC_MD5 (rtlDigest Digest) -{ - DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)Digest; - if (pImpl) - { - if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_MD5) - rtl_freeZeroMemory (pImpl, sizeof (DigestHMAC_MD5_Impl)); - else - rtl_freeMemory (pImpl); - } -} - -/*======================================================================== - * - * rtl_digest_HMAC_SHA1 internals. - * - *======================================================================*/ -#define DIGEST_CBLOCK_HMAC_SHA1 64 - -typedef struct _contextHMAC_SHA1_st -{ - DigestSHA_Impl m_hash; - sal_uInt8 m_opad[DIGEST_CBLOCK_HMAC_SHA1]; -} ContextHMAC_SHA1; - -typedef struct _digestHMAC_SHA1_impl_st -{ - Digest_Impl m_digest; - ContextHMAC_SHA1 m_context; -} DigestHMAC_SHA1_Impl; - -static void __rtl_digest_initHMAC_SHA1 (ContextHMAC_SHA1 * ctx); -static void __rtl_digest_ipadHMAC_SHA1 (ContextHMAC_SHA1 * ctx); -static void __rtl_digest_opadHMAC_SHA1 (ContextHMAC_SHA1 * ctx); - -/* - * __rtl_digest_HMAC_SHA1. - */ -static const Digest_Impl __rtl_digest_HMAC_SHA1 = -{ - rtl_Digest_AlgorithmHMAC_SHA1, - RTL_DIGEST_LENGTH_SHA1, - - rtl_digest_initHMAC_SHA1, - rtl_digest_destroyHMAC_SHA1, - rtl_digest_updateHMAC_SHA1, - rtl_digest_getHMAC_SHA1 -}; - -/* - * __rtl_digest_initHMAC_SHA1. - */ -static void __rtl_digest_initHMAC_SHA1 (ContextHMAC_SHA1 * ctx) -{ - DigestSHA_Impl *pImpl = &(ctx->m_hash); - - pImpl->m_digest = __rtl_digest_SHA_1; - __rtl_digest_initSHA (&(pImpl->m_context), __rtl_digest_updateSHA_1); - - rtl_zeroMemory (ctx->m_opad, DIGEST_CBLOCK_HMAC_SHA1); -} - -/* - * __rtl_digest_ipadHMAC_SHA1. - */ -static void __rtl_digest_ipadHMAC_SHA1 (ContextHMAC_SHA1 * ctx) -{ - register sal_uInt32 i; - - for (i = 0; i < DIGEST_CBLOCK_HMAC_SHA1; i++) - ctx->m_opad[i] ^= 0x36; - rtl_digest_updateSHA1 ( - &(ctx->m_hash), ctx->m_opad, DIGEST_CBLOCK_HMAC_SHA1); - for (i = 0; i < DIGEST_CBLOCK_HMAC_SHA1; i++) - ctx->m_opad[i] ^= 0x36; -} - -/* - * __rtl_digest_opadHMAC_SHA1. - */ -static void __rtl_digest_opadHMAC_SHA1 (ContextHMAC_SHA1 * ctx) -{ - register sal_uInt32 i; - - for (i = 0; i < DIGEST_CBLOCK_HMAC_SHA1; i++) - ctx->m_opad[i] ^= 0x5c; -} - -/*======================================================================== - * - * rtl_digest_HMAC_SHA1 implementation. - * - *======================================================================*/ -/* - * rtl_digest_HMAC_SHA1. - */ -rtlDigestError SAL_CALL rtl_digest_HMAC_SHA1 ( - const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen, - const void *pData, sal_uInt32 nDatLen, - sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestHMAC_SHA1_Impl digest; - rtlDigestError result; - - digest.m_digest = __rtl_digest_HMAC_SHA1; - - result = rtl_digest_initHMAC_SHA1 (&digest, pKeyData, nKeyLen); - if (result == rtl_Digest_E_None) - { - result = rtl_digest_updateHMAC_SHA1 (&digest, pData, nDatLen); - if (result == rtl_Digest_E_None) - result = rtl_digest_getHMAC_SHA1 (&digest, pBuffer, nBufLen); - } - - rtl_zeroMemory (&digest, sizeof (digest)); - return (result); -} - -/* - * rtl_digest_createHMAC_SHA1. - */ -rtlDigest SAL_CALL rtl_digest_createHMAC_SHA1 (void) -{ - DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)NULL; - pImpl = RTL_DIGEST_CREATE(DigestHMAC_SHA1_Impl); - if (pImpl) - { - pImpl->m_digest = __rtl_digest_HMAC_SHA1; - __rtl_digest_initHMAC_SHA1 (&(pImpl->m_context)); - } - return ((rtlDigest)pImpl); -} - -/* - * rtl_digest_initHMAC_SHA1. - */ -rtlDigestError SAL_CALL rtl_digest_initHMAC_SHA1 ( - rtlDigest Digest, const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen) -{ - DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)Digest; - ContextHMAC_SHA1 *ctx; - - if ((pImpl == NULL) || (pKeyData == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_SHA1)) - return rtl_Digest_E_Algorithm; - - ctx = &(pImpl->m_context); - __rtl_digest_initHMAC_SHA1 (ctx); - - if (nKeyLen > DIGEST_CBLOCK_HMAC_SHA1) - { - /* Initialize 'opad' with hashed 'KeyData' */ - rtl_digest_updateSHA1 ( - &(ctx->m_hash), pKeyData, nKeyLen); - rtl_digest_getSHA1 ( - &(ctx->m_hash), ctx->m_opad, RTL_DIGEST_LENGTH_SHA1); - } - else - { - /* Initialize 'opad' with plain 'KeyData' */ - rtl_copyMemory (ctx->m_opad, pKeyData, nKeyLen); - } - - __rtl_digest_ipadHMAC_SHA1 (ctx); - __rtl_digest_opadHMAC_SHA1 (ctx); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_updateHMAC_SHA1. - */ -rtlDigestError SAL_CALL rtl_digest_updateHMAC_SHA1 ( - rtlDigest Digest, const void *pData, sal_uInt32 nDatLen) -{ - DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)Digest; - ContextHMAC_SHA1 *ctx; - - if ((pImpl == NULL) || (pData == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_SHA1)) - return rtl_Digest_E_Algorithm; - - ctx = &(pImpl->m_context); - rtl_digest_updateSHA1 (&(ctx->m_hash), pData, nDatLen); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_getHMAC_SHA1. - */ -rtlDigestError SAL_CALL rtl_digest_getHMAC_SHA1 ( - rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen) -{ - DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)Digest; - ContextHMAC_SHA1 *ctx; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Digest_E_Argument; - - if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_SHA1)) - return rtl_Digest_E_Algorithm; - - if (!(pImpl->m_digest.m_length <= nBufLen)) - return rtl_Digest_E_BufferSize; - - nBufLen = pImpl->m_digest.m_length; - - ctx = &(pImpl->m_context); - rtl_digest_getSHA1 (&(ctx->m_hash), pBuffer, nBufLen); - - rtl_digest_updateSHA1 (&(ctx->m_hash), ctx->m_opad, sizeof(ctx->m_opad)); - rtl_digest_updateSHA1 (&(ctx->m_hash), pBuffer, nBufLen); - rtl_digest_getSHA1 (&(ctx->m_hash), pBuffer, nBufLen); - - __rtl_digest_opadHMAC_SHA1 (ctx); - __rtl_digest_ipadHMAC_SHA1 (ctx); - __rtl_digest_opadHMAC_SHA1 (ctx); - - return rtl_Digest_E_None; -} - -/* - * rtl_digest_destroyHMAC_SHA1. - */ -void SAL_CALL rtl_digest_destroyHMAC_SHA1 (rtlDigest Digest) -{ - DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)Digest; - if (pImpl) - { - if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_SHA1) - rtl_freeZeroMemory (pImpl, sizeof (DigestHMAC_SHA1_Impl)); - else - rtl_freeMemory (pImpl); - } -} - -/*======================================================================== - * - * rtl_digest_PBKDF2 internals. - * - *======================================================================*/ -#define DIGEST_CBLOCK_PBKDF2 RTL_DIGEST_LENGTH_HMAC_SHA1 - -/* - * __rtl_digest_updatePBKDF2. - */ -static void __rtl_digest_updatePBKDF2 ( - rtlDigest hDigest, - sal_uInt8 T[DIGEST_CBLOCK_PBKDF2], - const sal_uInt8 *pSaltData, sal_uInt32 nSaltLen, - sal_uInt32 nCount, sal_uInt32 nIndex) -{ - /* T_i = F (P, S, c, i) */ - sal_uInt8 U[DIGEST_CBLOCK_PBKDF2]; - register sal_uInt32 i, k; - - /* U_(1) = PRF (P, S || INDEX) */ - rtl_digest_updateHMAC_SHA1 (hDigest, pSaltData, nSaltLen); - rtl_digest_updateHMAC_SHA1 (hDigest, &nIndex, sizeof(nIndex)); - rtl_digest_getHMAC_SHA1 (hDigest, U, DIGEST_CBLOCK_PBKDF2); - - /* T = U_(1) */ - for (k = 0; k < DIGEST_CBLOCK_PBKDF2; k++) T[k] = U[k]; - - /* T ^= U_(2) ^ ... ^ U_(c) */ - for (i = 1; i < nCount; i++) - { - /* U_(i) = PRF (P, U_(i-1)) */ - rtl_digest_updateHMAC_SHA1 (hDigest, U, DIGEST_CBLOCK_PBKDF2); - rtl_digest_getHMAC_SHA1 (hDigest, U, DIGEST_CBLOCK_PBKDF2); - - /* T ^= U_(i) */ - for (k = 0; k < DIGEST_CBLOCK_PBKDF2; k++) T[k] ^= U[k]; - } - - rtl_zeroMemory (U, DIGEST_CBLOCK_PBKDF2); -} - -/*======================================================================== - * - * rtl_digest_PBKDF2 implementation. - * - *======================================================================*/ -/* - * rtl_digest_PBKDF2. - */ -rtlDigestError SAL_CALL rtl_digest_PBKDF2 ( - sal_uInt8 *pKeyData , sal_uInt32 nKeyLen, - const sal_uInt8 *pPassData, sal_uInt32 nPassLen, - const sal_uInt8 *pSaltData, sal_uInt32 nSaltLen, - sal_uInt32 nCount) -{ - DigestHMAC_SHA1_Impl digest; - sal_uInt32 i = 1; - - if ((pKeyData == NULL) || (pPassData == NULL) || (pSaltData == NULL)) - return rtl_Digest_E_Argument; - - digest.m_digest = __rtl_digest_HMAC_SHA1; - rtl_digest_initHMAC_SHA1 (&digest, pPassData, nPassLen); - - /* DK = T_(1) || T_(2) || ... || T_(l) */ - while (nKeyLen >= DIGEST_CBLOCK_PBKDF2) - { - /* T_(i) = F (P, S, c, i); DK ||= T_(i) */ - __rtl_digest_updatePBKDF2 ( - &digest, pKeyData, - pSaltData, nSaltLen, - nCount, OSL_NETDWORD(i)); - - /* Next 'KeyData' block */ - pKeyData += DIGEST_CBLOCK_PBKDF2; - nKeyLen -= DIGEST_CBLOCK_PBKDF2; - i += 1; - } - if (nKeyLen > 0) - { - /* Last 'KeyData' block */ - sal_uInt8 T[DIGEST_CBLOCK_PBKDF2]; - - /* T_i = F (P, S, c, i) */ - __rtl_digest_updatePBKDF2 ( - &digest, T, - pSaltData, nSaltLen, - nCount, OSL_NETDWORD(i)); - - /* DK ||= T_(i) */ - rtl_copyMemory (pKeyData, T, nKeyLen); - rtl_zeroMemory (T, DIGEST_CBLOCK_PBKDF2); - } - - rtl_zeroMemory (&digest, sizeof (digest)); - return rtl_Digest_E_None; -} - -/*======================================================================== - * - * The End. - * - *======================================================================*/ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/hash.cxx b/sal/rtl/source/hash.cxx deleted file mode 100644 index 0f381ea82..000000000 --- a/sal/rtl/source/hash.cxx +++ /dev/null @@ -1,242 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include "hash.h" -#include "strimp.h" -#include <osl/diagnose.h> -#include <sal/macros.h> - -struct StringHashTableImpl { - sal_uInt32 nEntries; - sal_uInt32 nSize; - rtl_uString **pData; -}; - -typedef StringHashTableImpl StringHashTable; - -// Only for use in the implementation -static StringHashTable *rtl_str_hash_new (sal_uInt32 nSize); -static void rtl_str_hash_free (StringHashTable *pHash); - -StringHashTable * -getHashTable () -{ - static StringHashTable *pInternPool = NULL; - if (pInternPool == NULL) { - static StringHashTable* pHash = rtl_str_hash_new(1024); - pInternPool = pHash; - } - return pInternPool; -} - -// Better / smaller / faster hash set .... - -// TODO: add bottom bit-set list terminator to string list - -static sal_uInt32 -getNextSize (sal_uInt32 nSize) -{ - // Sedgewick - Algorithms in C P577. - static const sal_uInt32 nPrimes[] = { 1021, 2039, 4093, 8191, 16381, 32749, - 65521, 131071,262139, 524287, 1048573, - 2097143, 4194301, 8388593, 16777213, - 33554393, 67108859, 134217689 }; - - for (sal_uInt32 i = 0; i < SAL_N_ELEMENTS(nPrimes); i++) - { - if (nPrimes[i] > nSize) - return nPrimes[i]; - } - return nSize * 2; -} - -static sal_uInt32 -hashString (rtl_uString *pString) -{ - return (sal_uInt32) rtl_ustr_hashCode_WithLength (pString->buffer, - pString->length); -} - -static StringHashTable * -rtl_str_hash_new (sal_uInt32 nSize) -{ - StringHashTable *pHash = (StringHashTable *)malloc (sizeof (StringHashTable)); - - pHash->nEntries = 0; - pHash->nSize = getNextSize (nSize); - pHash->pData = (rtl_uString **) calloc (sizeof (rtl_uString *), pHash->nSize); - - return pHash; -} - -static void -rtl_str_hash_free (StringHashTable *pHash) -{ - if (!pHash) - return; - if (pHash->pData) - free (pHash->pData); - free (pHash); -} - -static void -rtl_str_hash_insert_nonequal (StringHashTable *pHash, - rtl_uString *pString) -{ - sal_uInt32 nHash = hashString (pString); - sal_uInt32 n; - - n = nHash % pHash->nSize; - while (pHash->pData[n] != NULL) { - n++; - if (n >= pHash->nSize) - n = 0; - } - pHash->pData[n] = pString; -} - -static void -rtl_str_hash_resize (sal_uInt32 nNewSize) -{ - sal_uInt32 i; - StringHashTable *pNewHash; - StringHashTable *pHash = getHashTable(); - - OSL_ASSERT (nNewSize > pHash->nEntries); - - pNewHash = rtl_str_hash_new (nNewSize); - - for (i = 0; i < pHash->nSize; i++) - { - if (pHash->pData[i] != NULL) - rtl_str_hash_insert_nonequal (pNewHash, pHash->pData[i]); - } - pNewHash->nEntries = pHash->nEntries; - free (pHash->pData); - *pHash = *pNewHash; - pNewHash->pData = NULL; - rtl_str_hash_free (pNewHash); -} - -static int -compareEqual (rtl_uString *pStringA, rtl_uString *pStringB) -{ - if (pStringA == pStringB) - return 1; - if (pStringA->length != pStringB->length) - return 0; - return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length, - pStringB->buffer, pStringB->length); -} - - -rtl_uString * -rtl_str_hash_intern (rtl_uString *pString, - int can_return) -{ - sal_uInt32 nHash = hashString (pString); - sal_uInt32 n; - rtl_uString *pHashStr; - - StringHashTable *pHash = getHashTable(); - - // Should we resize ? - if (pHash->nEntries >= pHash->nSize/2) - rtl_str_hash_resize (getNextSize(pHash->nSize)); - - n = nHash % pHash->nSize; - while ((pHashStr = pHash->pData[n]) != NULL) { - if (compareEqual (pHashStr, pString)) - { - rtl_uString_acquire (pHashStr); - return pHashStr; - } - n++; - if (n >= pHash->nSize) - n = 0; - } - - if (!can_return) - { - rtl_uString *pCopy = NULL; - rtl_uString_newFromString( &pCopy, pString ); - pString = pCopy; - if (!pString) - return NULL; - } - - if (!SAL_STRING_IS_STATIC (pString)) - pString->refCount |= SAL_STRING_INTERN_FLAG; - pHash->pData[n] = pString; - pHash->nEntries++; - - return pString; -} - -void -rtl_str_hash_remove (rtl_uString *pString) -{ - sal_uInt32 n; - sal_uInt32 nHash = hashString (pString); - rtl_uString *pHashStr; - - StringHashTable *pHash = getHashTable(); - - n = nHash % pHash->nSize; - while ((pHashStr = pHash->pData[n]) != NULL) { - if (compareEqual (pHashStr, pString)) - break; - n++; - if (n >= pHash->nSize) - n = 0; - } - OSL_ASSERT (pHash->pData[n] != 0); - if (pHash->pData[n] == NULL) - return; - - pHash->pData[n++] = NULL; - pHash->nEntries--; - - if (n >= pHash->nSize) - n = 0; - - while ((pHashStr = pHash->pData[n]) != NULL) { - pHash->pData[n] = NULL; - // FIXME: rather unsophisticated and N^2 in chain-length, but robust. - rtl_str_hash_insert_nonequal (pHash, pHashStr); - n++; - if (n >= pHash->nSize) - n = 0; - } - // FIXME: Should we down-size ? -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/hash.h b/sal/rtl/source/hash.h deleted file mode 100644 index 6a6518833..000000000 --- a/sal/rtl/source/hash.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -#ifndef INCLUDED_RTL_SOURCE_HASH_H -#define INCLUDED_RTL_SOURCE_HASH_H - -#include <sal/types.h> -#include <rtl/ustring.h> - -#if defined __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* These functions are not multi-thread safe: */ - -rtl_uString *rtl_str_hash_intern (rtl_uString *pString, - int can_return); -void rtl_str_hash_remove (rtl_uString *pString); - -#if defined __cplusplus -} -#endif /* __cplusplus */ - -#endif /* INCLUDED_RTL_SOURCE_HASH_H */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/locale.c b/sal/rtl/source/locale.c deleted file mode 100644 index 79f2fb8b9..000000000 --- a/sal/rtl/source/locale.c +++ /dev/null @@ -1,352 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "rtl/locale.h" - -#include "osl/diagnose.h" -#include "rtl/alloc.h" - -#include "internal/once.h" - -static sal_Int32 RTL_HASHTABLE_SIZE[] = -{ - 7, 31, 127, 251, 509, 1021, 2039, 4093 -}; - -typedef struct rtl_hashentry RTL_HASHENTRY; - -struct rtl_hashentry -{ - rtl_Locale* Entry; - RTL_HASHENTRY* Next; -}; - -typedef struct rtl_hashtable -{ - sal_Int8 iSize; - sal_Int32 Size; - sal_Int32 Elements; - RTL_HASHENTRY** Table; -} RTL_HASHTABLE; - -static RTL_HASHTABLE* g_pLocaleTable = NULL; - -static rtl_Locale* g_pDefaultLocale = NULL; - -/************************************************************************* - */ -void rtl_hashentry_destroy(RTL_HASHENTRY* entry) -{ - rtl_uString_release(entry->Entry->Language); - rtl_uString_release(entry->Entry->Country); - rtl_uString_release(entry->Entry->Variant); - if (entry->Next) - rtl_hashentry_destroy(entry->Next); - - rtl_freeMemory(entry->Entry); - rtl_freeMemory(entry); -} - -void rtl_hashtable_destroy(RTL_HASHTABLE* table) -{ - sal_Int32 size = 0; - - if (!table) - return; - - size = table->Size; - - while (size) - { - if (table->Table[size - 1]) - rtl_hashentry_destroy(table->Table[size - 1]); - size--; - } - - rtl_freeMemory(table->Table); - rtl_freeMemory(table); -} - -void rtl_hashtable_init(RTL_HASHTABLE** table, sal_Int8 sizeIndex) -{ - sal_Int32 nSize = RTL_HASHTABLE_SIZE[sizeIndex]; - - if (*table) - rtl_hashtable_destroy(*table); - - *table = (RTL_HASHTABLE*)rtl_allocateMemory( sizeof(RTL_HASHTABLE) ); - - (*table)->iSize = sizeIndex; - (*table)->Size = nSize; - (*table)->Elements = 0; - (*table)->Table = (RTL_HASHENTRY**)rtl_allocateMemory( (*table)->Size * sizeof(RTL_HASHENTRY*) ); - - while (nSize) - { - (*table)->Table[nSize - 1] = NULL; - nSize--; - } -} - -sal_Int32 rtl_hashfunc(RTL_HASHTABLE* table, sal_Int32 key) -{ - return ( (sal_uInt32) key % table->Size); -} - -sal_Bool rtl_hashtable_grow(RTL_HASHTABLE** table); - -rtl_Locale* rtl_hashtable_add(RTL_HASHTABLE** table, rtl_Locale* value) -{ - sal_Int32 key = 0; - - if (!(*table)) - return NULL; - - if ((*table)->Elements > ((*table)->Size / 2)) - rtl_hashtable_grow(table); - - key = rtl_hashfunc(*table, value->HashCode); - - if (!(*table)->Table[key]) - { - RTL_HASHENTRY *newEntry = (RTL_HASHENTRY*)rtl_allocateMemory( sizeof(RTL_HASHENTRY) ); - newEntry->Entry = value; - newEntry->Next = NULL; - (*table)->Table[key] = newEntry; - (*table)->Elements++; - return NULL; - } else - { - RTL_HASHENTRY *pEntry = (*table)->Table[key]; - RTL_HASHENTRY *newEntry = NULL; - - while (pEntry) - { - if (value->HashCode == pEntry->Entry->HashCode) - return pEntry->Entry; - - if (!pEntry->Next) - break; - - pEntry = pEntry->Next; - } - - newEntry = (RTL_HASHENTRY*)rtl_allocateMemory( sizeof(RTL_HASHENTRY) ); - newEntry->Entry = value; - newEntry->Next = NULL; - pEntry->Next = newEntry; - (*table)->Elements++; - return NULL; - } -} - -sal_Bool rtl_hashtable_grow(RTL_HASHTABLE** table) -{ - RTL_HASHTABLE* pNewTable = NULL; - sal_Int32 i = 0; - - rtl_hashtable_init(&pNewTable, (sal_Int8)((*table)->iSize + 1)); - - while (i < (*table)->Size) - { - if ((*table)->Table[i]) - { - RTL_HASHENTRY *pNext; - RTL_HASHENTRY *pEntry = (*table)->Table[i]; - - rtl_hashtable_add(&pNewTable, pEntry->Entry); - - while (pEntry->Next) - { - rtl_hashtable_add(&pNewTable, pEntry->Next->Entry); - pNext = pEntry->Next; - rtl_freeMemory(pEntry); - pEntry = pNext; - } - - rtl_freeMemory(pEntry); - } - i++; - } - - rtl_freeMemory((*table)->Table); - rtl_freeMemory((*table)); - (*table) = pNewTable; - - return sal_True; -} - -sal_Bool rtl_hashtable_find(RTL_HASHTABLE * table, sal_Int32 key, sal_Int32 hashCode, rtl_Locale** pValue) -{ - if (!table) - return sal_False; - - if (table->Table[key]) - { - RTL_HASHENTRY *pEntry = table->Table[key]; - - while (pEntry && hashCode != pEntry->Entry->HashCode) - pEntry = pEntry->Next; - - if (pEntry) - *pValue = pEntry->Entry; - else - return sal_False; - } else - return sal_False; - - return sal_True; -} - -/************************************************************************* - * rtl_locale_init - */ -void rtl_locale_init (void) -{ - OSL_ASSERT(g_pLocaleTable == 0); - rtl_hashtable_init(&g_pLocaleTable, 1); -} - -/************************************************************************* - * rtl_locale_fini - */ -void rtl_locale_fini (void) -{ - if (g_pLocaleTable != 0) - { - rtl_hashtable_destroy (g_pLocaleTable); - g_pLocaleTable = 0; - } -} - -extern void ensureLocaleSingleton(); - -/************************************************************************* - * rtl_locale_register - */ -rtl_Locale * SAL_CALL rtl_locale_register( const sal_Unicode * language, const sal_Unicode * country, const sal_Unicode * variant ) -{ - sal_Unicode c = 0; - rtl_uString* sLanguage = NULL; - rtl_uString* sCountry = NULL; - rtl_uString* sVariant = NULL; - rtl_Locale *newLocale = NULL; - sal_Int32 hashCode = -1; - sal_Int32 key = 0; - - if ( !country ) - country = &c; - if ( !variant ) - variant = &c; - - ensureLocaleSingleton(); - if (!g_pLocaleTable) - return NULL; - - hashCode = rtl_ustr_hashCode(language) ^ rtl_ustr_hashCode(country) ^ rtl_ustr_hashCode(variant); - key = rtl_hashfunc(g_pLocaleTable, hashCode); - - if (rtl_hashtable_find(g_pLocaleTable, key, hashCode, &newLocale)) - return newLocale; - - rtl_uString_newFromStr(&sLanguage, language); - rtl_uString_newFromStr(&sCountry, country); - rtl_uString_newFromStr(&sVariant, variant); - - newLocale = (rtl_Locale*)rtl_allocateMemory( sizeof(rtl_Locale) ); - - newLocale->Language = sLanguage; - newLocale->Country = sCountry; - newLocale->Variant = sVariant; - newLocale->HashCode = hashCode; - - rtl_hashtable_add(&g_pLocaleTable, newLocale); - - return newLocale; -} - -/************************************************************************* - * rtl_locale_getDefault - */ -rtl_Locale * SAL_CALL rtl_locale_getDefault() -{ - return g_pDefaultLocale; -} - -/************************************************************************* - * rtl_locale_setDefault - */ -void SAL_CALL rtl_locale_setDefault( const sal_Unicode * language, const sal_Unicode * country, const sal_Unicode * variant ) -{ - g_pDefaultLocale = rtl_locale_register(language, country, variant); -} - -/************************************************************************* - * rtl_locale_getLanguage - */ -rtl_uString * SAL_CALL rtl_locale_getLanguage( rtl_Locale * This ) -{ - rtl_uString_acquire(This->Language); - return This->Language; -} - -/************************************************************************* - * rtl_locale_getCountry - */ -rtl_uString * SAL_CALL rtl_locale_getCountry( rtl_Locale * This ) -{ - rtl_uString_acquire(This->Country); - return This->Country; -} - -/************************************************************************* - * rtl_locale_getVariant - */ -rtl_uString * SAL_CALL rtl_locale_getVariant( rtl_Locale * This ) -{ - rtl_uString_acquire(This->Variant); - return This->Variant; -} - -/************************************************************************* - * rtl_locale_hashCode - */ -sal_Int32 SAL_CALL rtl_locale_hashCode( rtl_Locale * This ) -{ - return This->HashCode; -} - -/************************************************************************* - * rtl_locale_equals - */ -sal_Int32 SAL_CALL rtl_locale_equals( rtl_Locale * This, rtl_Locale * obj ) -{ - return This == obj; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/logfile.cxx b/sal/rtl/source/logfile.cxx deleted file mode 100644 index fa1955a88..000000000 --- a/sal/rtl/source/logfile.cxx +++ /dev/null @@ -1,251 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" -#include <cstdarg> -#include <cstdio> -#include <stdio.h> -#include <stdarg.h> - -#include <rtl/logfile.h> -#include <osl/process.h> -#include <osl/time.h> -#include <osl/time.h> -#include <osl/mutex.hxx> -#include <rtl/bootstrap.h> -#include <rtl/ustring.hxx> -#include <rtl/ustrbuf.hxx> -#include <rtl/alloc.h> -#include <rtl/instance.hxx> -#include "osl/thread.h" - -#include <algorithm> - -#ifdef _MSC_VER -#define vsnprintf _vsnprintf -#endif - -using namespace osl; -using namespace std; - -using ::rtl::OUString; -using ::rtl::OUStringBuffer; - -namespace { - -static oslFileHandle g_aFile = 0; -static sal_Bool g_bHasBeenCalled = sal_False; -static const sal_Int32 g_BUFFERSIZE = 4096; -static sal_Char *g_buffer = 0; - -class LoggerGuard -{ -public: - ~LoggerGuard(); -}; - -LoggerGuard::~LoggerGuard() -{ - if( g_buffer ) - { - sal_Int64 nWritten, nConverted = - sprintf( g_buffer, "closing log file at %06" SAL_PRIuUINT32, osl_getGlobalTimer() ); - if( nConverted > 0 ) - osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64 *)&nWritten ); - osl_closeFile( g_aFile ); - g_aFile = 0; - - rtl_freeMemory( g_buffer ); - g_buffer = 0; - g_bHasBeenCalled = sal_False; - } -} - -// The destructor of this static LoggerGuard is "activated" by the assignment to -// g_buffer in init(): -LoggerGuard loggerGuard; - -namespace -{ - class theLogMutex : public rtl::Static<osl::Mutex, theLogMutex>{}; -} - -static Mutex & getLogMutex() -{ - return theLogMutex::get(); -} - -OUString getFileUrl( const OUString &name ) -{ - OUString aRet; - if ( osl_getFileURLFromSystemPath( name.pData, &aRet.pData ) - != osl_File_E_None ) - { - OSL_ASSERT( false ); - } - - OUString aWorkingDirectory; - osl_getProcessWorkingDir( &(aWorkingDirectory.pData) ); - osl_getAbsoluteFileURL( aWorkingDirectory.pData, aRet.pData, &(aRet.pData) ); - - return aRet; -} - -void init() { - if( !g_bHasBeenCalled ) - { - MutexGuard guard( getLogMutex() ); - if( ! g_bHasBeenCalled ) - { - OUString name( RTL_CONSTASCII_USTRINGPARAM( "RTL_LOGFILE" ) ); - OUString value; - if( rtl_bootstrap_get( name.pData, &value.pData, 0 ) ) - { - // Obtain process id. - oslProcessIdentifier aProcessId = 0; - oslProcessInfo info; - info.Size = sizeof (oslProcessInfo); - if (osl_getProcessInfo (0, osl_Process_IDENTIFIER, &info) == osl_Process_E_None) - aProcessId = info.Ident; - - // Construct name of log file and open the file. - OUStringBuffer buf( 128 ); - buf.append( value ); - - // if the filename ends with .nopid, the incoming filename is not modified - if( value.getLength() < 6 /* ".nopid" */ || - rtl_ustr_ascii_compare_WithLength( - value.getStr() + (value.getLength()-6) , 6 , ".nopid" ) ) - { - buf.appendAscii( "_" ); - buf.append( (sal_Int32) aProcessId ); - buf.appendAscii( ".log" ); - } - - OUString o = getFileUrl( buf.makeStringAndClear() ); - oslFileError e = osl_openFile( - o.pData, &g_aFile, osl_File_OpenFlag_Write|osl_File_OpenFlag_Create); - - if( osl_File_E_None == e ) - { - TimeValue aCurrentTime; - g_buffer = ( sal_Char * ) rtl_allocateMemory( g_BUFFERSIZE ); - sal_Int64 nConverted = 0; - if (osl_getSystemTime (&aCurrentTime)) - { - nConverted = (sal_Int64 ) sprintf ( - g_buffer, - "opening log file %f seconds past January 1st 1970\n" - "corresponding to %" SAL_PRIuUINT32 " ms after timer start\n", - aCurrentTime.Seconds + 1e-9 * aCurrentTime.Nanosec, - osl_getGlobalTimer()); - - if( nConverted > 0 ) - { - sal_Int64 nWritten; - osl_writeFile( g_aFile, g_buffer, nConverted , (sal_uInt64 *)&nWritten ); - } - } - - nConverted = sprintf (g_buffer, "Process id is %" SAL_PRIuUINT32 "\n", aProcessId); - if( nConverted ) - { - sal_Int64 nWritten; - osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64 *)&nWritten ); - } - } - else - { - OSL_TRACE( "Couldn't open logfile %s(%d)" , o.getStr(), e ); - } - } - g_bHasBeenCalled = sal_True; - } - } -} - -} - -extern "C" void SAL_CALL rtl_logfile_trace ( const char *pszFormat, ... ) -{ - init(); - if( g_buffer ) - { - va_list args; - va_start(args, pszFormat); - { - sal_Int64 nConverted, nWritten; - MutexGuard guard( getLogMutex() ); - nConverted = vsnprintf( g_buffer , g_BUFFERSIZE, pszFormat, args ); - nConverted = (nConverted > g_BUFFERSIZE ? g_BUFFERSIZE : nConverted ); - if( nConverted > 0 ) - osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64*)&nWritten ); - } - va_end(args); - } -} - -extern "C" void SAL_CALL rtl_logfile_longTrace(char const * format, ...) { - init(); - if (g_buffer != 0) { - sal_uInt32 time = osl_getGlobalTimer(); - oslThreadIdentifier threadId = osl_getThreadIdentifier(0); - va_list args; - va_start(args, format); - { - MutexGuard g(getLogMutex()); - int n1 = snprintf( - g_buffer, g_BUFFERSIZE, "%06" SAL_PRIuUINT32 " %" SAL_PRIuUINT32 " ", time, threadId); - if (n1 >= 0) { - sal_uInt64 n2; - osl_writeFile( - g_aFile, g_buffer, - static_cast< sal_uInt64 >( - std::min(n1, static_cast< int >(g_BUFFERSIZE))), - &n2); - n1 = vsnprintf(g_buffer, g_BUFFERSIZE, format, args); - if (n1 > 0) { - osl_writeFile( - g_aFile, g_buffer, - static_cast< sal_uInt64 >( - std::min(n1, static_cast< int >(g_BUFFERSIZE))), - &n2); - } - } - } - va_end(args); - } -} - -extern "C" sal_Bool SAL_CALL rtl_logfile_hasLogFile( void ) { - init(); - return g_buffer != 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/macro.hxx b/sal/rtl/source/macro.hxx deleted file mode 100644 index b07c7705c..000000000 --- a/sal/rtl/source/macro.hxx +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _RTL_MACRO_HXX -#define _RTL_MACRO_HXX - -#include <rtl/bootstrap.h> -#include <rtl/ustring.hxx> -#include <osl/endian.h> - -#if defined WIN32 -#define THIS_OS "Windows" -#elif defined SOLARIS -#define THIS_OS "Solaris" -#elif defined LINUX -#ifdef __FreeBSD_kernel__ -#define THIS_OS "kFreeBSD" -#else -#define THIS_OS "Linux" -#endif -#elif defined ANDROID -#define THIS_OS "Android" -#elif defined MACOSX -#define THIS_OS "MacOSX" -#elif defined IOS -#define THIS_OS "iOS" -#elif defined NETBSD -#define THIS_OS "NetBSD" -#elif defined FREEBSD -#define THIS_OS "FreeBSD" -#elif defined AIX -#define THIS_OS "AIX" -#elif defined OPENBSD -#define THIS_OS "OpenBSD" -#elif defined DRAGONFLY -#define THIS_OS "DragonFly" -#endif - -#if ! defined THIS_OS -#error "unknown OS -- insert your OS identifier above" -this is inserted for the case that the preprocessor ignores error -#endif - -#if defined X86_64 -# define THIS_ARCH "X86_64" -#elif defined INTEL -# define THIS_ARCH "x86" -#elif defined POWERPC64 -# define THIS_ARCH "PowerPC_64" -#elif defined POWERPC -# define THIS_ARCH "PowerPC" -#elif defined S390X -# define THIS_ARCH "S390x" -#elif defined S390 -# define THIS_ARCH "S390" -#elif defined SPARC -#if defined IS_LP64 -# define THIS_ARCH "SPARC64" -#else -# define THIS_ARCH "SPARC" -#endif -#elif defined MIPS -# ifdef OSL_BIGENDIAN -# define THIS_ARCH "MIPS_EB" -# else -# define THIS_ARCH "MIPS_EL" -# endif -#elif defined ARM -# ifdef __ARM_EABI__ -# define THIS_ARCH "ARM_EABI" -# else -# define THIS_ARCH "ARM_OABI" -# endif -#elif defined IA64 -# define THIS_ARCH "IA64" -#elif defined M68K -# define THIS_ARCH "M68K" -#elif defined HPPA -# define THIS_ARCH "HPPA" -#elif defined AXP -# define THIS_ARCH "ALPHA" -#endif - -#if ! defined THIS_ARCH -#error "unknown ARCH -- insert your ARCH identifier above" -this is inserted for the case that the preprocessor ignores error -#endif - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/makefile.mk b/sal/rtl/source/makefile.mk deleted file mode 100644 index 2f1f610a5..000000000 --- a/sal/rtl/source/makefile.mk +++ /dev/null @@ -1,165 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -PRJ=..$/.. - -PRJNAME=sal -TARGET=cpprtl -ENABLE_EXCEPTIONS=TRUE -USE_LDUMP2=TRUE - -PROJECTPCH4DLL=TRUE -PROJECTPCH=cont_pch -PROJECTPCHSOURCE=cont_pch - -TARGETTYPE=CUI - -# --- Settings ----------------------------------------------------- - -.INCLUDE : settings.mk - -.IF "$(VALGRIND_CFLAGS)" != "" -CFLAGS += $(VALGRIND_CFLAGS) -CDEFS += -DHAVE_MEMCHECK_H=1 -.ENDIF # VALGRIND_CFLAGS - -.IF "$(ALLOC)" == "SYS_ALLOC" || "$(ALLOC)" == "TCMALLOC" || "$(ALLOC)" == "JEMALLOC" -CDEFS+= -DFORCE_SYSALLOC -.ENDIF - -CFLAGS+= $(LFS_CFLAGS) -CXXFLAGS+= $(LFS_CFLAGS) - -# --- Files -------------------------------------------------------- - -.IF "$(header)" == "" - -.IF "$(OS)" != "AIX" -ALWAYSDBGFILES=$(SLO)$/debugprint.obj -.ENDIF - -.IF "$(ALWAYSDBGFILES)" != "" -ALWAYSDBGTARGET=do_it_alwaysdebug -.ENDIF - -SLOFILES= \ - $(SLO)$/memory.obj \ - $(SLO)$/cipher.obj \ - $(SLO)$/crc.obj \ - $(SLO)$/digest.obj \ - $(SLO)$/random.obj \ - $(SLO)$/locale.obj \ - $(SLO)$/strimp.obj \ - $(SLO)$/hash.obj \ - $(SLO)$/string.obj \ - $(SLO)$/ustring.obj \ - $(SLO)$/strbuf.obj \ - $(SLO)$/ustrbuf.obj \ - $(SLO)$/uuid.obj \ - $(SLO)$/rtl_process.obj \ - $(SLO)$/byteseq.obj \ - $(SLO)$/uri.obj \ - $(SLO)$/bootstrap.obj \ - $(SLO)$/cmdargs.obj \ - $(SLO)$/unload.obj \ - $(SLO)$/logfile.obj \ - $(SLO)$/tres.obj \ - $(SLO)$/debugprint.obj \ - $(SLO)$/math.obj \ - $(SLO)$/alloc_global.obj\ - $(SLO)$/alloc_cache.obj \ - $(SLO)$/alloc_arena.obj \ - $(SLO)$/alloc_fini.obj - -OBJFILES= \ - $(OBJ)$/memory.obj \ - $(OBJ)$/cipher.obj \ - $(OBJ)$/crc.obj \ - $(OBJ)$/digest.obj \ - $(OBJ)$/random.obj \ - $(OBJ)$/locale.obj \ - $(OBJ)$/strimp.obj \ - $(OBJ)$/hash.obj \ - $(OBJ)$/string.obj \ - $(OBJ)$/ustring.obj \ - $(OBJ)$/strbuf.obj \ - $(OBJ)$/ustrbuf.obj \ - $(OBJ)$/uuid.obj \ - $(OBJ)$/rtl_process.obj \ - $(OBJ)$/byteseq.obj \ - $(OBJ)$/uri.obj \ - $(OBJ)$/bootstrap.obj \ - $(OBJ)$/cmdargs.obj \ - $(OBJ)$/unload.obj \ - $(OBJ)$/logfile.obj \ - $(OBJ)$/tres.obj \ - $(OBJ)$/math.obj \ - $(OBJ)$/alloc_global.obj\ - $(OBJ)$/alloc_cache.obj \ - $(OBJ)$/alloc_arena.obj \ - $(OBJ)$/alloc_fini.obj - - -.ENDIF - -# --- Makefile snippet -------------------------------------------- - -# used by e.g. update info file -BOOTSTRAPMK = $(OUT)$/inc$/rtlbootstrap.mk - -# --- Targets ------------------------------------------------------ - -.IF "$(ALWAYSDBG_FLAG)"=="" -TARGETDEPS+=$(ALWAYSDBGTARGET) -.ENDIF - -.INCLUDE : target.mk - -.IF "$(ALWAYSDBGTARGET)" != "" -.IF "$(ALWAYSDBG_FLAG)" == "" -# -------------------------------------------------- -# - ALWAYSDBG - files always compiled with debugging -# -------------------------------------------------- -$(ALWAYSDBGTARGET): - @echo --- ALWAYSDBGFILES --- - @dmake $(MFLAGS) $(MAKEFILE) debug=true $(ALWAYSDBGFILES) ALWAYSDBG_FLAG=TRUE $(CALLMACROS) - @echo --- ALWAYSDBGFILES OVER --- - -$(ALWAYSDBGFILES): - @echo --- ALWAYSDBG --- - @dmake $(MFLAGS) $(MAKEFILE) debug=true ALWAYSDBG_FLAG=TRUE $(CALLMACROS) $@ - @echo --- ALWAYSDBG OVER --- - -.ENDIF -.ENDIF - - -ALLTAR : $(BOOTSTRAPMK) - -$(BOOTSTRAPMK) : - (echo '#include "macro.hxx"'; echo RTL_OS:=THIS_OS; echo RTL_ARCH:=THIS_ARCH) >$(BOOTSTRAPMK).c - $(CC) -E $(CFLAGS) $(INCLUDE_C) $(CFLAGSCC) $(CFLAGSOBJ) $(CDEFS) $(CDEFSOBJ) $(CFLAGSAPPEND) $(BOOTSTRAPMK).c | $(GREP) '^RTL_' | $(SED) -e 's/"//g' >$@ diff --git a/sal/rtl/source/math.cxx b/sal/rtl/source/math.cxx deleted file mode 100644 index 1aee95642..000000000 --- a/sal/rtl/source/math.cxx +++ /dev/null @@ -1,1268 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include "rtl/math.h" - -#include "osl/diagnose.h" -#include "rtl/alloc.h" -#include "rtl/math.hxx" -#include "rtl/strbuf.h" -#include "rtl/string.h" -#include "rtl/ustrbuf.h" -#include "rtl/ustring.h" -#include "sal/mathconf.h" -#include "sal/types.h" - -#include <algorithm> -#include <float.h> -#include <limits.h> -#include <math.h> -#include <stdlib.h> - - -static int const n10Count = 16; -static double const n10s[2][n10Count] = { - { 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, - 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16 }, - { 1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7, 1e-8, - 1e-9, 1e-10, 1e-11, 1e-12, 1e-13, 1e-14, 1e-15, 1e-16 } -}; - -// return pow(10.0,nExp) optimized for exponents in the interval [-16,16] -static double getN10Exp( int nExp ) -{ - if ( nExp < 0 ) - { - if ( -nExp <= n10Count ) - return n10s[1][-nExp-1]; - else - return pow( 10.0, static_cast<double>( nExp ) ); - } - else if ( nExp > 0 ) - { - if ( nExp <= n10Count ) - return n10s[0][nExp-1]; - else - return pow( 10.0, static_cast<double>( nExp ) ); - } - else // ( nExp == 0 ) - return 1.0; -} - -/** Approximation algorithm for erf for 0 < x < 0.65. */ -void lcl_Erf0065( double x, double& fVal ) -{ - static const double pn[] = { - 1.12837916709551256, - 1.35894887627277916E-1, - 4.03259488531795274E-2, - 1.20339380863079457E-3, - 6.49254556481904354E-5 - }; - static const double qn[] = { - 1.00000000000000000, - 4.53767041780002545E-1, - 8.69936222615385890E-2, - 8.49717371168693357E-3, - 3.64915280629351082E-4 - }; - double fPSum = 0.0; - double fQSum = 0.0; - double fXPow = 1.0; - for ( unsigned int i = 0; i <= 4; ++i ) - { - fPSum += pn[i]*fXPow; - fQSum += qn[i]*fXPow; - fXPow *= x*x; - } - fVal = x * fPSum / fQSum; -} - -/** Approximation algorithm for erfc for 0.65 < x < 6.0. */ -void lcl_Erfc0600( double x, double& fVal ) -{ - double fPSum = 0.0; - double fQSum = 0.0; - double fXPow = 1.0; - const double *pn; - const double *qn; - - if ( x < 2.2 ) - { - static const double pn22[] = { - 9.99999992049799098E-1, - 1.33154163936765307, - 8.78115804155881782E-1, - 3.31899559578213215E-1, - 7.14193832506776067E-2, - 7.06940843763253131E-3 - }; - static const double qn22[] = { - 1.00000000000000000, - 2.45992070144245533, - 2.65383972869775752, - 1.61876655543871376, - 5.94651311286481502E-1, - 1.26579413030177940E-1, - 1.25304936549413393E-2 - }; - pn = pn22; - qn = qn22; - } - else /* if ( x < 6.0 ) this is true, but the compiler does not know */ - { - static const double pn60[] = { - 9.99921140009714409E-1, - 1.62356584489366647, - 1.26739901455873222, - 5.81528574177741135E-1, - 1.57289620742838702E-1, - 2.25716982919217555E-2 - }; - static const double qn60[] = { - 1.00000000000000000, - 2.75143870676376208, - 3.37367334657284535, - 2.38574194785344389, - 1.05074004614827206, - 2.78788439273628983E-1, - 4.00072964526861362E-2 - }; - pn = pn60; - qn = qn60; - } - - for ( unsigned int i = 0; i < 6; ++i ) - { - fPSum += pn[i]*fXPow; - fQSum += qn[i]*fXPow; - fXPow *= x; - } - fQSum += qn[6]*fXPow; - fVal = exp( -1.0*x*x )* fPSum / fQSum; -} - -/** Approximation algorithm for erfc for 6.0 < x < 26.54 (but used for all - x > 6.0). */ -void lcl_Erfc2654( double x, double& fVal ) -{ - static const double pn[] = { - 5.64189583547756078E-1, - 8.80253746105525775, - 3.84683103716117320E1, - 4.77209965874436377E1, - 8.08040729052301677 - }; - static const double qn[] = { - 1.00000000000000000, - 1.61020914205869003E1, - 7.54843505665954743E1, - 1.12123870801026015E2, - 3.73997570145040850E1 - }; - - double fPSum = 0.0; - double fQSum = 0.0; - double fXPow = 1.0; - - for ( unsigned int i = 0; i <= 4; ++i ) - { - fPSum += pn[i]*fXPow; - fQSum += qn[i]*fXPow; - fXPow /= x*x; - } - fVal = exp(-1.0*x*x)*fPSum / (x*fQSum); -} - -namespace { - -double const nKorrVal[] = { - 0, 9e-1, 9e-2, 9e-3, 9e-4, 9e-5, 9e-6, 9e-7, 9e-8, - 9e-9, 9e-10, 9e-11, 9e-12, 9e-13, 9e-14, 9e-15 -}; - -struct StringTraits -{ - typedef sal_Char Char; - - typedef rtl_String String; - - static inline void createString(rtl_String ** pString, - sal_Char const * pChars, sal_Int32 nLen) - { - rtl_string_newFromStr_WithLength(pString, pChars, nLen); - } - - static inline void createBuffer(rtl_String ** pBuffer, - sal_Int32 * pCapacity) - { - rtl_string_new_WithLength(pBuffer, *pCapacity); - } - - static inline void appendChar(rtl_String ** pBuffer, sal_Int32 * pCapacity, - sal_Int32 * pOffset, sal_Char cChar) - { - rtl_stringbuffer_insert(pBuffer, pCapacity, *pOffset, &cChar, 1); - ++*pOffset; - } - - static inline void appendChars(rtl_String ** pBuffer, sal_Int32 * pCapacity, - sal_Int32 * pOffset, sal_Char const * pChars, - sal_Int32 nLen) - { - rtl_stringbuffer_insert(pBuffer, pCapacity, *pOffset, pChars, nLen); - *pOffset += nLen; - } - - static inline void appendAscii(rtl_String ** pBuffer, sal_Int32 * pCapacity, - sal_Int32 * pOffset, sal_Char const * pStr, - sal_Int32 nLen) - { - rtl_stringbuffer_insert(pBuffer, pCapacity, *pOffset, pStr, nLen); - *pOffset += nLen; - } -}; - -struct UStringTraits -{ - typedef sal_Unicode Char; - - typedef rtl_uString String; - - static inline void createString(rtl_uString ** pString, - sal_Unicode const * pChars, sal_Int32 nLen) - { - rtl_uString_newFromStr_WithLength(pString, pChars, nLen); - } - - static inline void createBuffer(rtl_uString ** pBuffer, - sal_Int32 * pCapacity) - { - rtl_uString_new_WithLength(pBuffer, *pCapacity); - } - - static inline void appendChar(rtl_uString ** pBuffer, sal_Int32 * pCapacity, - sal_Int32 * pOffset, sal_Unicode cChar) - { - rtl_uStringbuffer_insert(pBuffer, pCapacity, *pOffset, &cChar, 1); - ++*pOffset; - } - - static inline void appendChars(rtl_uString ** pBuffer, - sal_Int32 * pCapacity, sal_Int32 * pOffset, - sal_Unicode const * pChars, sal_Int32 nLen) - { - rtl_uStringbuffer_insert(pBuffer, pCapacity, *pOffset, pChars, nLen); - *pOffset += nLen; - } - - static inline void appendAscii(rtl_uString ** pBuffer, - sal_Int32 * pCapacity, sal_Int32 * pOffset, - sal_Char const * pStr, sal_Int32 nLen) - { - rtl_uStringbuffer_insert_ascii(pBuffer, pCapacity, *pOffset, pStr, - nLen); - *pOffset += nLen; - } -}; - - -// Solaris C++ 5.2 compiler has problems when "StringT ** pResult" is -// "typename T::String ** pResult" instead: -template< typename T, typename StringT > -inline void doubleToString(StringT ** pResult, - sal_Int32 * pResultCapacity, sal_Int32 nResultOffset, - double fValue, rtl_math_StringFormat eFormat, - sal_Int32 nDecPlaces, typename T::Char cDecSeparator, - sal_Int32 const * pGroups, - typename T::Char cGroupSeparator, - bool bEraseTrailingDecZeros) -{ - static double const nRoundVal[] = { - 5.0e+0, 0.5e+0, 0.5e-1, 0.5e-2, 0.5e-3, 0.5e-4, 0.5e-5, 0.5e-6, - 0.5e-7, 0.5e-8, 0.5e-9, 0.5e-10,0.5e-11,0.5e-12,0.5e-13,0.5e-14 - }; - - // sign adjustment, instead of testing for fValue<0.0 this will also fetch - // -0.0 - bool bSign = rtl::math::isSignBitSet( fValue ); - if( bSign ) - fValue = -fValue; - - if ( rtl::math::isNan( fValue ) ) - { - // #i112652# XMLSchema-2 - sal_Int32 nCapacity = RTL_CONSTASCII_LENGTH("NaN"); - if (pResultCapacity == 0) - { - pResultCapacity = &nCapacity; - T::createBuffer(pResult, pResultCapacity); - nResultOffset = 0; - } - T::appendAscii(pResult, pResultCapacity, &nResultOffset, - RTL_CONSTASCII_STRINGPARAM("NaN")); - - return; - } - - bool bHuge = fValue == HUGE_VAL; // g++ 3.0.1 requires it this way... - if ( bHuge || rtl::math::isInf( fValue ) ) - { - // #i112652# XMLSchema-2 - sal_Int32 nCapacity = RTL_CONSTASCII_LENGTH("-INF"); - if (pResultCapacity == 0) - { - pResultCapacity = &nCapacity; - T::createBuffer(pResult, pResultCapacity); - nResultOffset = 0; - } - if ( bSign ) - T::appendAscii(pResult, pResultCapacity, &nResultOffset, - RTL_CONSTASCII_STRINGPARAM("-")); - T::appendAscii(pResult, pResultCapacity, &nResultOffset, - RTL_CONSTASCII_STRINGPARAM("INF")); - - return; - } - - // find the exponent - int nExp = 0; - if ( fValue > 0.0 ) - { - nExp = static_cast< int >( floor( log10( fValue ) ) ); - fValue /= getN10Exp( nExp ); - } - - switch ( eFormat ) - { - case rtl_math_StringFormat_Automatic : - { // E or F depending on exponent magnitude - int nPrec; - if ( nExp <= -15 || nExp >= 15 ) // #58531# was <-16, >16 - { - nPrec = 14; - eFormat = rtl_math_StringFormat_E; - } - else - { - if ( nExp < 14 ) - { - nPrec = 15 - nExp - 1; - eFormat = rtl_math_StringFormat_F; - } - else - { - nPrec = 15; - eFormat = rtl_math_StringFormat_F; - } - } - if ( nDecPlaces == rtl_math_DecimalPlaces_Max ) - nDecPlaces = nPrec; - } - break; - case rtl_math_StringFormat_G : - { // G-Point, similar to sprintf %G - if ( nDecPlaces == rtl_math_DecimalPlaces_DefaultSignificance ) - nDecPlaces = 6; - if ( nExp < -4 || nExp >= nDecPlaces ) - { - nDecPlaces = std::max< sal_Int32 >( 1, nDecPlaces - 1 ); - eFormat = rtl_math_StringFormat_E; - } - else - { - nDecPlaces = std::max< sal_Int32 >( 0, nDecPlaces - nExp - 1 ); - eFormat = rtl_math_StringFormat_F; - } - } - break; - default: - break; - } - - sal_Int32 nDigits = nDecPlaces + 1; - - if( eFormat == rtl_math_StringFormat_F ) - nDigits += nExp; - - // Round the number - if( nDigits >= 0 ) - { - if( ( fValue += nRoundVal[ nDigits > 15 ? 15 : nDigits ] ) >= 10 ) - { - fValue = 1.0; - nExp++; - if( eFormat == rtl_math_StringFormat_F ) - nDigits++; - } - } - - static sal_Int32 const nBufMax = 256; - typename T::Char aBuf[nBufMax]; - typename T::Char * pBuf; - sal_Int32 nBuf = static_cast< sal_Int32 > - ( nDigits <= 0 ? std::max< sal_Int32 >( nDecPlaces, abs(nExp) ) - : nDigits + nDecPlaces ) + 10 + (pGroups ? abs(nDigits) * 2 : 0); - if ( nBuf > nBufMax ) - { - pBuf = reinterpret_cast< typename T::Char * >( - rtl_allocateMemory(nBuf * sizeof (typename T::Char))); - OSL_ENSURE(pBuf != 0, "Out of memory"); - } - else - pBuf = aBuf; - typename T::Char * p = pBuf; - if ( bSign ) - *p++ = static_cast< typename T::Char >('-'); - - bool bHasDec = false; - - int nDecPos; - // Check for F format and number < 1 - if( eFormat == rtl_math_StringFormat_F ) - { - if( nExp < 0 ) - { - *p++ = static_cast< typename T::Char >('0'); - if ( nDecPlaces > 0 ) - { - *p++ = cDecSeparator; - bHasDec = true; - } - sal_Int32 i = ( nDigits <= 0 ? nDecPlaces : -nExp - 1 ); - while( (i--) > 0 ) - *p++ = static_cast< typename T::Char >('0'); - nDecPos = 0; - } - else - nDecPos = nExp + 1; - } - else - nDecPos = 1; - - int nGrouping = 0, nGroupSelector = 0, nGroupExceed = 0; - if ( nDecPos > 1 && pGroups && pGroups[0] && cGroupSeparator ) - { - while ( nGrouping + pGroups[nGroupSelector] < nDecPos ) - { - nGrouping += pGroups[ nGroupSelector ]; - if ( pGroups[nGroupSelector+1] ) - { - if ( nGrouping + pGroups[nGroupSelector+1] >= nDecPos ) - break; // while - ++nGroupSelector; - } - else if ( !nGroupExceed ) - nGroupExceed = nGrouping; - } - } - - // print the number - if( nDigits > 0 ) - { - for ( int i = 0; ; i++ ) - { - if( i < 15 ) - { - int nDigit; - if (nDigits-1 == 0 && i > 0 && i < 14) - nDigit = static_cast< int >( floor( fValue - + nKorrVal[15-i] ) ); - else - nDigit = static_cast< int >( fValue + 1E-15 ); - if (nDigit >= 10) - { // after-treatment of up-rounding to the next decade - sal_Int32 sLen = static_cast< long >(p-pBuf)-1; - if (sLen == -1) - { - p = pBuf; - if ( eFormat == rtl_math_StringFormat_F ) - { - *p++ = static_cast< typename T::Char >('1'); - *p++ = static_cast< typename T::Char >('0'); - } - else - { - *p++ = static_cast< typename T::Char >('1'); - *p++ = cDecSeparator; - *p++ = static_cast< typename T::Char >('0'); - nExp++; - bHasDec = true; - } - } - else - { - for (sal_Int32 j = sLen; j >= 0; j--) - { - typename T::Char cS = pBuf[j]; - if (cS != cDecSeparator) - { - if ( cS != static_cast< typename T::Char >('9')) - { - pBuf[j] = ++cS; - j = -1; // break loop - } - else - { - pBuf[j] - = static_cast< typename T::Char >('0'); - if (j == 0) - { - if ( eFormat == rtl_math_StringFormat_F) - { // insert '1' - typename T::Char * px = p++; - while ( pBuf < px ) - { - *px = *(px-1); - px--; - } - pBuf[0] = static_cast< - typename T::Char >('1'); - } - else - { - pBuf[j] = static_cast< - typename T::Char >('1'); - nExp++; - } - } - } - } - } - *p++ = static_cast< typename T::Char >('0'); - } - fValue = 0.0; - } - else - { - *p++ = static_cast< typename T::Char >( - nDigit + static_cast< typename T::Char >('0') ); - fValue = ( fValue - nDigit ) * 10.0; - } - } - else - *p++ = static_cast< typename T::Char >('0'); - if( !--nDigits ) - break; // for - if( nDecPos ) - { - if( !--nDecPos ) - { - *p++ = cDecSeparator; - bHasDec = true; - } - else if ( nDecPos == nGrouping ) - { - *p++ = cGroupSeparator; - nGrouping -= pGroups[ nGroupSelector ]; - if ( nGroupSelector && nGrouping < nGroupExceed ) - --nGroupSelector; - } - } - } - } - - if ( !bHasDec && eFormat == rtl_math_StringFormat_F ) - { // nDecPlaces < 0 did round the value - while ( --nDecPos > 0 ) - { // fill before decimal point - if ( nDecPos == nGrouping ) - { - *p++ = cGroupSeparator; - nGrouping -= pGroups[ nGroupSelector ]; - if ( nGroupSelector && nGrouping < nGroupExceed ) - --nGroupSelector; - } - *p++ = static_cast< typename T::Char >('0'); - } - } - - if ( bEraseTrailingDecZeros && bHasDec && p > pBuf ) - { - while ( *(p-1) == static_cast< typename T::Char >('0') ) - p--; - if ( *(p-1) == cDecSeparator ) - p--; - } - - // Print the exponent ('E', followed by '+' or '-', followed by exactly - // three digits). The code in rtl_[u]str_valueOf{Float|Double} relies on - // this format. - if( eFormat == rtl_math_StringFormat_E ) - { - if ( p == pBuf ) - *p++ = static_cast< typename T::Char >('1'); - // maybe no nDigits if nDecPlaces < 0 - *p++ = static_cast< typename T::Char >('E'); - if( nExp < 0 ) - { - nExp = -nExp; - *p++ = static_cast< typename T::Char >('-'); - } - else - *p++ = static_cast< typename T::Char >('+'); -// if (nExp >= 100 ) - *p++ = static_cast< typename T::Char >( - nExp / 100 + static_cast< typename T::Char >('0') ); - nExp %= 100; - *p++ = static_cast< typename T::Char >( - nExp / 10 + static_cast< typename T::Char >('0') ); - *p++ = static_cast< typename T::Char >( - nExp % 10 + static_cast< typename T::Char >('0') ); - } - - if (pResultCapacity == 0) - T::createString(pResult, pBuf, p - pBuf); - else - T::appendChars(pResult, pResultCapacity, &nResultOffset, pBuf, - p - pBuf); - - if ( pBuf != &aBuf[0] ) - rtl_freeMemory(pBuf); -} - -} - -void SAL_CALL rtl_math_doubleToString(rtl_String ** pResult, - sal_Int32 * pResultCapacity, - sal_Int32 nResultOffset, double fValue, - rtl_math_StringFormat eFormat, - sal_Int32 nDecPlaces, - sal_Char cDecSeparator, - sal_Int32 const * pGroups, - sal_Char cGroupSeparator, - sal_Bool bEraseTrailingDecZeros) - SAL_THROW_EXTERN_C() -{ - doubleToString< StringTraits, StringTraits::String >( - pResult, pResultCapacity, nResultOffset, fValue, eFormat, nDecPlaces, - cDecSeparator, pGroups, cGroupSeparator, bEraseTrailingDecZeros); -} - -void SAL_CALL rtl_math_doubleToUString(rtl_uString ** pResult, - sal_Int32 * pResultCapacity, - sal_Int32 nResultOffset, double fValue, - rtl_math_StringFormat eFormat, - sal_Int32 nDecPlaces, - sal_Unicode cDecSeparator, - sal_Int32 const * pGroups, - sal_Unicode cGroupSeparator, - sal_Bool bEraseTrailingDecZeros) - SAL_THROW_EXTERN_C() -{ - doubleToString< UStringTraits, UStringTraits::String >( - pResult, pResultCapacity, nResultOffset, fValue, eFormat, nDecPlaces, - cDecSeparator, pGroups, cGroupSeparator, bEraseTrailingDecZeros); -} - - -namespace { - -// if nExp * 10 + nAdd would result in overflow -inline bool long10Overflow( long& nExp, int nAdd ) -{ - if ( nExp > (LONG_MAX/10) - || (nExp == (LONG_MAX/10) && nAdd > (LONG_MAX%10)) ) - { - nExp = LONG_MAX; - return true; - } - return false; -} - -// We are only concerned about ASCII arabic numerical digits here -template< typename CharT > -inline bool isDigit( CharT c ) -{ - return 0x30 <= c && c <= 0x39; -} - -template< typename CharT > -inline double stringToDouble(CharT const * pBegin, CharT const * pEnd, - CharT cDecSeparator, CharT cGroupSeparator, - rtl_math_ConversionStatus * pStatus, - CharT const ** pParsedEnd) -{ - double fVal = 0.0; - rtl_math_ConversionStatus eStatus = rtl_math_ConversionStatus_Ok; - - CharT const * p0 = pBegin; - while (p0 != pEnd && (*p0 == CharT(' ') || *p0 == CharT('\t'))) - ++p0; - bool bSign; - if (p0 != pEnd && *p0 == CharT('-')) - { - bSign = true; - ++p0; - } - else - { - bSign = false; - if (p0 != pEnd && *p0 == CharT('+')) - ++p0; - } - CharT const * p = p0; - bool bDone = false; - - // #i112652# XMLSchema-2 - if (3 >= (pEnd - p)) - { - if ((CharT('N') == p[0]) && (CharT('a') == p[1]) - && (CharT('N') == p[2])) - { - p += 3; - rtl::math::setNan( &fVal ); - bDone = true; - } - else if ((CharT('I') == p[0]) && (CharT('N') == p[1]) - && (CharT('F') == p[2])) - { - p += 3; - fVal = HUGE_VAL; - eStatus = rtl_math_ConversionStatus_OutOfRange; - bDone = true; - } - } - - if (!bDone) // do not recognize e.g. NaN1.23 - { - // leading zeros and group separators may be safely ignored - while (p != pEnd && (*p == CharT('0') || *p == cGroupSeparator)) - ++p; - - long nValExp = 0; // carry along exponent of mantissa - - // integer part of mantissa - for (; p != pEnd; ++p) - { - CharT c = *p; - if (isDigit(c)) - { - fVal = fVal * 10.0 + static_cast< double >( c - CharT('0') ); - ++nValExp; - } - else if (c != cGroupSeparator) - break; - } - - // fraction part of mantissa - if (p != pEnd && *p == cDecSeparator) - { - ++p; - double fFrac = 0.0; - long nFracExp = 0; - while (p != pEnd && *p == CharT('0')) - { - --nFracExp; - ++p; - } - if ( nValExp == 0 ) - nValExp = nFracExp - 1; // no integer part => fraction exponent - // one decimal digit needs ld(10) ~= 3.32 bits - static const int nSigs = (DBL_MANT_DIG / 3) + 1; - int nDigs = 0; - for (; p != pEnd; ++p) - { - CharT c = *p; - if (!isDigit(c)) - break; - if ( nDigs < nSigs ) - { // further digits (more than nSigs) don't have any - // significance - fFrac = fFrac * 10.0 + static_cast<double>(c - CharT('0')); - --nFracExp; - ++nDigs; - } - } - if ( fFrac != 0.0 ) - fVal += rtl::math::pow10Exp( fFrac, nFracExp ); - else if ( nValExp < 0 ) - nValExp = 0; // no digit other than 0 after decimal point - } - - if ( nValExp > 0 ) - --nValExp; // started with offset +1 at the first mantissa digit - - // Exponent - if (p != p0 && p != pEnd && (*p == CharT('E') || *p == CharT('e'))) - { - ++p; - bool bExpSign; - if (p != pEnd && *p == CharT('-')) - { - bExpSign = true; - ++p; - } - else - { - bExpSign = false; - if (p != pEnd && *p == CharT('+')) - ++p; - } - if ( fVal == 0.0 ) - { // no matter what follows, zero stays zero, but carry on the - // offset - while (p != pEnd && isDigit(*p)) - ++p; - } - else - { - bool bOverFlow = false; - long nExp = 0; - for (; p != pEnd; ++p) - { - CharT c = *p; - if (!isDigit(c)) - break; - int i = c - CharT('0'); - if ( long10Overflow( nExp, i ) ) - bOverFlow = true; - else - nExp = nExp * 10 + i; - } - if ( nExp ) - { - if ( bExpSign ) - nExp = -nExp; - long nAllExp = ( bOverFlow ? 0 : nExp + nValExp ); - if ( nAllExp > DBL_MAX_10_EXP || (bOverFlow && !bExpSign) ) - { // overflow - fVal = HUGE_VAL; - eStatus = rtl_math_ConversionStatus_OutOfRange; - } - else if ((nAllExp < DBL_MIN_10_EXP) || - (bOverFlow && bExpSign) ) - { // underflow - fVal = 0.0; - eStatus = rtl_math_ConversionStatus_OutOfRange; - } - else if ( nExp > DBL_MAX_10_EXP || nExp < DBL_MIN_10_EXP ) - { // compensate exponents - fVal = rtl::math::pow10Exp( fVal, -nValExp ); - fVal = rtl::math::pow10Exp( fVal, nAllExp ); - } - else - fVal = rtl::math::pow10Exp( fVal, nExp ); // normal - } - } - } - else if (p - p0 == 2 && p != pEnd && p[0] == CharT('#') - && p[-1] == cDecSeparator && p[-2] == CharT('1')) - { - if (pEnd - p >= 4 && p[1] == CharT('I') && p[2] == CharT('N') - && p[3] == CharT('F')) - { - // "1.#INF", "+1.#INF", "-1.#INF" - p += 4; - fVal = HUGE_VAL; - eStatus = rtl_math_ConversionStatus_OutOfRange; - // Eat any further digits: - while (p != pEnd && isDigit(*p)) - ++p; - } - else if (pEnd - p >= 4 && p[1] == CharT('N') && p[2] == CharT('A') - && p[3] == CharT('N')) - { - // "1.#NAN", "+1.#NAN", "-1.#NAN" - p += 4; - rtl::math::setNan( &fVal ); - if (bSign) - { - union { - double sd; - sal_math_Double md; - } m; - m.sd = fVal; - m.md.w32_parts.msw |= 0x80000000; // create negative NaN - fVal = m.sd; - bSign = false; // don't negate again - } - // Eat any further digits: - while (p != pEnd && isDigit(*p)) - ++p; - } - } - } - - // overflow also if more than DBL_MAX_10_EXP digits without decimal - // separator, or 0. and more than DBL_MIN_10_EXP digits, ... - bool bHuge = fVal == HUGE_VAL; // g++ 3.0.1 requires it this way... - if ( bHuge ) - eStatus = rtl_math_ConversionStatus_OutOfRange; - - if ( bSign ) - fVal = -fVal; - - if (pStatus != 0) - *pStatus = eStatus; - if (pParsedEnd != 0) - *pParsedEnd = p == p0 ? pBegin : p; - - return fVal; -} - -} - -double SAL_CALL rtl_math_stringToDouble(sal_Char const * pBegin, - sal_Char const * pEnd, - sal_Char cDecSeparator, - sal_Char cGroupSeparator, - rtl_math_ConversionStatus * pStatus, - sal_Char const ** pParsedEnd) - SAL_THROW_EXTERN_C() -{ - return stringToDouble(pBegin, pEnd, cDecSeparator, cGroupSeparator, pStatus, - pParsedEnd); -} - -double SAL_CALL rtl_math_uStringToDouble(sal_Unicode const * pBegin, - sal_Unicode const * pEnd, - sal_Unicode cDecSeparator, - sal_Unicode cGroupSeparator, - rtl_math_ConversionStatus * pStatus, - sal_Unicode const ** pParsedEnd) - SAL_THROW_EXTERN_C() -{ - return stringToDouble(pBegin, pEnd, cDecSeparator, cGroupSeparator, pStatus, - pParsedEnd); -} - -double SAL_CALL rtl_math_round(double fValue, int nDecPlaces, - enum rtl_math_RoundingMode eMode) - SAL_THROW_EXTERN_C() -{ - OSL_ASSERT(nDecPlaces >= -20 && nDecPlaces <= 20); - - if ( fValue == 0.0 ) - return fValue; - - // sign adjustment - bool bSign = rtl::math::isSignBitSet( fValue ); - if ( bSign ) - fValue = -fValue; - - double fFac = 0; - if ( nDecPlaces != 0 ) - { - // max 20 decimals, we don't have unlimited precision - // #38810# and no overflow on fValue*=fFac - if ( nDecPlaces < -20 || 20 < nDecPlaces || fValue > (DBL_MAX / 1e20) ) - return bSign ? -fValue : fValue; - - fFac = getN10Exp( nDecPlaces ); - fValue *= fFac; - } - //else //! uninitialized fFac, not needed - - switch ( eMode ) - { - case rtl_math_RoundingMode_Corrected : - { - int nExp; // exponent for correction - if ( fValue > 0.0 ) - nExp = static_cast<int>( floor( log10( fValue ) ) ); - else - nExp = 0; - int nIndex = 15 - nExp; - if ( nIndex > 15 ) - nIndex = 15; - else if ( nIndex <= 1 ) - nIndex = 0; - fValue = floor( fValue + 0.5 + nKorrVal[nIndex] ); - } - break; - case rtl_math_RoundingMode_Down : - fValue = rtl::math::approxFloor( fValue ); - break; - case rtl_math_RoundingMode_Up : - fValue = rtl::math::approxCeil( fValue ); - break; - case rtl_math_RoundingMode_Floor : - fValue = bSign ? rtl::math::approxCeil( fValue ) - : rtl::math::approxFloor( fValue ); - break; - case rtl_math_RoundingMode_Ceiling : - fValue = bSign ? rtl::math::approxFloor( fValue ) - : rtl::math::approxCeil( fValue ); - break; - case rtl_math_RoundingMode_HalfDown : - { - double f = floor( fValue ); - fValue = ((fValue - f) <= 0.5) ? f : ceil( fValue ); - } - break; - case rtl_math_RoundingMode_HalfUp : - { - double f = floor( fValue ); - fValue = ((fValue - f) < 0.5) ? f : ceil( fValue ); - } - break; - case rtl_math_RoundingMode_HalfEven : -#if defined FLT_ROUNDS -/* - Use fast version. FLT_ROUNDS may be defined to a function by some compilers! - - DBL_EPSILON is the smallest fractional number which can be represented, - its reciprocal is therefore the smallest number that cannot have a - fractional part. Once you add this reciprocal to `x', its fractional part - is stripped off. Simply subtracting the reciprocal back out returns `x' - without its fractional component. - Simple, clever, and elegant - thanks to Ross Cottrell, the original author, - who placed it into public domain. - - volatile: prevent compiler from being too smart -*/ - if ( FLT_ROUNDS == 1 ) - { - volatile double x = fValue + 1.0 / DBL_EPSILON; - fValue = x - 1.0 / DBL_EPSILON; - } - else -#endif // FLT_ROUNDS - { - double f = floor( fValue ); - if ( (fValue - f) != 0.5 ) - fValue = floor( fValue + 0.5 ); - else - { - double g = f / 2.0; - fValue = (g == floor( g )) ? f : (f + 1.0); - } - } - break; - default: - OSL_ASSERT(false); - break; - } - - if ( nDecPlaces != 0 ) - fValue /= fFac; - - return bSign ? -fValue : fValue; -} - - -double SAL_CALL rtl_math_pow10Exp(double fValue, int nExp) SAL_THROW_EXTERN_C() -{ - return fValue * getN10Exp( nExp ); -} - - -double SAL_CALL rtl_math_approxValue( double fValue ) SAL_THROW_EXTERN_C() -{ - if (fValue == 0.0 || fValue == HUGE_VAL || !::rtl::math::isFinite( fValue)) - // We don't handle these conditions. Bail out. - return fValue; - - double fOrigValue = fValue; - - bool bSign = ::rtl::math::isSignBitSet( fValue); - if (bSign) - fValue = -fValue; - - int nExp = static_cast<int>( floor( log10( fValue))); - nExp = 14 - nExp; - double fExpValue = getN10Exp( nExp); - - fValue *= fExpValue; - // If the original value was near DBL_MIN we got an overflow. Restore and - // bail out. - if (!rtl::math::isFinite( fValue)) - return fOrigValue; - fValue = rtl_math_round( fValue, 0, rtl_math_RoundingMode_Corrected); - fValue /= fExpValue; - // If the original value was near DBL_MAX we got an overflow. Restore and - // bail out. - if (!rtl::math::isFinite( fValue)) - return fOrigValue; - - return bSign ? -fValue : fValue; -} - - -double SAL_CALL rtl_math_expm1( double fValue ) SAL_THROW_EXTERN_C() -{ - double fe = exp( fValue ); - if (fe == 1.0) - return fValue; - if (fe-1.0 == -1.0) - return -1.0; - return (fe-1.0) * fValue / log(fe); -} - - -double SAL_CALL rtl_math_log1p( double fValue ) SAL_THROW_EXTERN_C() -{ - // Use volatile because a compiler may be too smart "optimizing" the - // condition such that in certain cases the else path was called even if - // (fp==1.0) was true, where the term (fp-1.0) then resulted in 0.0 and - // hence the entire expression resulted in NaN. - // Happened with g++ 3.4.1 and an input value of 9.87E-18 - volatile double fp = 1.0 + fValue; - if (fp == 1.0) - return fValue; - else - return log(fp) * fValue / (fp-1.0); -} - - -double SAL_CALL rtl_math_atanh( double fValue ) SAL_THROW_EXTERN_C() -{ - return 0.5 * rtl_math_log1p( 2.0 * fValue / (1.0-fValue) ); -} - - -/** Parent error function (erf) that calls different algorithms based on the - value of x. It takes care of cases where x is negative as erf is an odd - function i.e. erf(-x) = -erf(x). - - Kramer, W., and Blomquist, F., 2000, Algorithms with Guaranteed Error Bounds - for the Error Function and the Complementary Error Function - - http://www.math.uni-wuppertal.de/wrswt/literatur_en.html - - @author Kohei Yoshida <kohei@openoffice.org> - - @see #i55735# - */ -double SAL_CALL rtl_math_erf( double x ) SAL_THROW_EXTERN_C() -{ - if( x == 0.0 ) - return 0.0; - - bool bNegative = false; - if ( x < 0.0 ) - { - x = fabs( x ); - bNegative = true; - } - - double fErf = 1.0; - if ( x < 1.0e-10 ) - fErf = (double) (x*1.1283791670955125738961589031215452L); - else if ( x < 0.65 ) - lcl_Erf0065( x, fErf ); - else - fErf = 1.0 - rtl_math_erfc( x ); - - if ( bNegative ) - fErf *= -1.0; - - return fErf; -} - - -/** Parent complementary error function (erfc) that calls different algorithms - based on the value of x. It takes care of cases where x is negative as erfc - satisfies relationship erfc(-x) = 2 - erfc(x). See the comment for Erf(x) - for the source publication. - - @author Kohei Yoshida <kohei@openoffice.org> - - @see #i55735#, moved from module scaddins (#i97091#) - - */ -double SAL_CALL rtl_math_erfc( double x ) SAL_THROW_EXTERN_C() -{ - if ( x == 0.0 ) - return 1.0; - - bool bNegative = false; - if ( x < 0.0 ) - { - x = fabs( x ); - bNegative = true; - } - - double fErfc = 0.0; - if ( x >= 0.65 ) - { - if ( x < 6.0 ) - lcl_Erfc0600( x, fErfc ); - else - lcl_Erfc2654( x, fErfc ); - } - else - fErfc = 1.0 - rtl_math_erf( x ); - - if ( bNegative ) - fErfc = 2.0 - fErfc; - - return fErfc; -} - -/** improved accuracy of asinh for |x| large and for x near zero - @see #i97605# - */ -double SAL_CALL rtl_math_asinh( double fX ) SAL_THROW_EXTERN_C() -{ - if ( fX == 0.0 ) - return 0.0; - else - { - double fSign = 1.0; - if ( fX < 0.0 ) - { - fX = - fX; - fSign = -1.0; - } - if ( fX < 0.125 ) - return fSign * rtl_math_log1p( fX + fX*fX / (1.0 + sqrt( 1.0 + fX*fX))); - else if ( fX < 1.25e7 ) - return fSign * log( fX + sqrt( 1.0 + fX*fX)); - else - return fSign * log( 2.0*fX); - } -} - -/** improved accuracy of acosh for x large and for x near 1 - @see #i97605# - */ -double SAL_CALL rtl_math_acosh( double fX ) SAL_THROW_EXTERN_C() -{ - volatile double fZ = fX - 1.0; - if ( fX < 1.0 ) - { - double fResult; - ::rtl::math::setNan( &fResult ); - return fResult; - } - else if ( fX == 1.0 ) - return 0.0; - else if ( fX < 1.1 ) - return rtl_math_log1p( fZ + sqrt( fZ*fZ + 2.0*fZ)); - else if ( fX < 1.25e7 ) - return log( fX + sqrt( fX*fX - 1.0)); - else - return log( 2.0*fX); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/memory.c b/sal/rtl/source/memory.c deleted file mode 100644 index 888dfde56..000000000 --- a/sal/rtl/source/memory.c +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#include <string.h> -#include <rtl/memory.h> - -void SAL_CALL rtl_zeroMemory(void *Ptr, sal_Size Bytes) -{ - memset(Ptr, 0, Bytes); -} - -void SAL_CALL rtl_fillMemory(void *Ptr, sal_Size Bytes, sal_uInt8 Fill) -{ - memset(Ptr, Fill, Bytes); -} - -void SAL_CALL rtl_copyMemory(void *Dst, const void *Src, sal_Size Bytes) -{ - memcpy(Dst, Src, Bytes); -} - -void SAL_CALL rtl_moveMemory(void *Dst, const void *Src, sal_Size Bytes) -{ - memmove(Dst, Src, Bytes); -} - -sal_Int32 SAL_CALL rtl_compareMemory(const void *MemA, const void *MemB, sal_Size Bytes) -{ - return memcmp(MemA, MemB, Bytes); -} - -void* SAL_CALL rtl_findInMemory(const void *MemA, sal_uInt8 ch, sal_Size Bytes) -{ - return memchr(MemA, ch, Bytes); -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/random.c b/sal/rtl/source/random.c deleted file mode 100644 index 4bdf88204..000000000 --- a/sal/rtl/source/random.c +++ /dev/null @@ -1,340 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#define _RTL_RANDOM_C_ - -#include <sal/types.h> -#include <osl/thread.h> -#include <osl/time.h> -#include <rtl/alloc.h> -#include <rtl/digest.h> -#include <rtl/random.h> -#include <osl/time.h> - -/*======================================================================== - * - * rtlRandom internals. - * - *======================================================================*/ -#define RTL_RANDOM_RNG_1(a) ((a) * 16807L) -#define RTL_RANDOM_RNG_2(a) ((a) * 65539L) - -#define RTL_RANDOM_RNG(x, y, z) \ -{ \ - (x) = 170 * ((x) % 178) - 63 * ((x) / 178); \ - if ((x) < 0) (x) += 30328L; \ - \ - (y) = 171 * ((y) % 177) - 2 * ((y) / 177); \ - if ((y) < 0) (y) += 30269L; \ - \ - (z) = 172 * ((z) % 176) - 35 * ((z) / 176); \ - if ((z) < 0) (z) += 30307L; \ -} - -/** RandomData_Impl. - */ -typedef struct random_data_impl_st -{ - sal_Int16 m_nX; - sal_Int16 m_nY; - sal_Int16 m_nZ; -} RandomData_Impl; - -/** __rtl_random_data. - */ -static double __rtl_random_data (RandomData_Impl *pImpl); - -/** RandomPool_Impl. - */ -#define RTL_RANDOM_DIGEST rtl_Digest_AlgorithmMD5 -#define RTL_RANDOM_SIZE_DIGEST RTL_DIGEST_LENGTH_MD5 -#define RTL_RANDOM_SIZE_POOL 1023 - -typedef struct random_pool_impl_st -{ - rtlDigest m_hDigest; - sal_uInt8 m_pDigest[RTL_RANDOM_SIZE_DIGEST]; - sal_uInt8 m_pData[RTL_RANDOM_SIZE_POOL + 1]; - sal_uInt32 m_nData; - sal_uInt32 m_nIndex; - sal_uInt32 m_nCount; -} RandomPool_Impl; - -/** __rtl_random_initPool. - */ -static sal_Bool __rtl_random_initPool ( - RandomPool_Impl *pImpl); - -/** __rtl_random_seedPool. - */ -static void __rtl_random_seedPool ( - RandomPool_Impl *pImpl, const sal_uInt8 *pBuffer, sal_Size nBufLen); - -/** __rtl_random_readPool. - */ -static void __rtl_random_readPool ( - RandomPool_Impl *pImpl, sal_uInt8 *pBuffer, sal_Size nBufLen); - -/* - * __rtl_random_data. - */ -static double __rtl_random_data (RandomData_Impl *pImpl) -{ - register double random; - - RTL_RANDOM_RNG (pImpl->m_nX, pImpl->m_nY, pImpl->m_nZ); - random = (((double)(pImpl->m_nX) / 30328.0) + - ((double)(pImpl->m_nY) / 30269.0) + - ((double)(pImpl->m_nZ) / 30307.0) ); - - random -= ((double)((sal_uInt32)(random))); - return (random); -} - -/* - * __rtl_random_initPool. - */ -static sal_Bool __rtl_random_initPool (RandomPool_Impl *pImpl) -{ - pImpl->m_hDigest = rtl_digest_create (RTL_RANDOM_DIGEST); - if (pImpl->m_hDigest) - { - oslThreadIdentifier id; - TimeValue tv; - RandomData_Impl rd; - double seed; - - /* The use of uninitialized stack variables as a way to - * enhance the entropy of the random pool triggers - * memory checkers like purify and valgrind. - */ - - /* - __rtl_random_seedPool (pImpl, (sal_uInt8*)&id, sizeof(id)); - __rtl_random_seedPool (pImpl, (sal_uInt8*)&tv, sizeof(tv)); - __rtl_random_seedPool (pImpl, (sal_uInt8*)&rd, sizeof(rd)); - */ - - id = osl_getThreadIdentifier (NULL); - id = RTL_RANDOM_RNG_2(RTL_RANDOM_RNG_1(id)); - __rtl_random_seedPool (pImpl, (sal_uInt8*)&id, sizeof(id)); - - osl_getSystemTime (&tv); - tv.Seconds = RTL_RANDOM_RNG_2(tv.Seconds); - tv.Nanosec = RTL_RANDOM_RNG_2(tv.Nanosec); - __rtl_random_seedPool (pImpl, (sal_uInt8*)&tv, sizeof(tv)); - - rd.m_nX = (sal_Int16)(((id >> 1) << 1) + 1); - rd.m_nY = (sal_Int16)(((tv.Seconds >> 1) << 1) + 1); - rd.m_nZ = (sal_Int16)(((tv.Nanosec >> 1) << 1) + 1); - __rtl_random_seedPool (pImpl, (sal_uInt8*)&rd, sizeof(rd)); - - while (pImpl->m_nData < RTL_RANDOM_SIZE_POOL) - { - seed = __rtl_random_data (&rd); - __rtl_random_seedPool (pImpl, (sal_uInt8*)&seed, sizeof(seed)); - } - return sal_True; - } - return sal_False; -} - -/* - * __rtl_random_seedPool. - */ -static void __rtl_random_seedPool ( - RandomPool_Impl *pImpl, const sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - sal_Size i; - sal_sSize j, k; - - for (i = 0; i < nBufLen; i += RTL_RANDOM_SIZE_DIGEST) - { - j = nBufLen - i; - if (j > RTL_RANDOM_SIZE_DIGEST) - j = RTL_RANDOM_SIZE_DIGEST; - - rtl_digest_update ( - pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST); - - k = (pImpl->m_nIndex + j) - RTL_RANDOM_SIZE_POOL; - if (k > 0) - { - rtl_digest_update ( - pImpl->m_hDigest, &(pImpl->m_pData[pImpl->m_nIndex]), j - k); - rtl_digest_update ( - pImpl->m_hDigest, &(pImpl->m_pData[0]), k); - } - else - { - rtl_digest_update ( - pImpl->m_hDigest, &(pImpl->m_pData[pImpl->m_nIndex]), j); - } - - rtl_digest_update (pImpl->m_hDigest, pBuffer, j); - pBuffer += j; - - rtl_digest_get ( - pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST); - for (k = 0; k < j; k++) - { - pImpl->m_pData[pImpl->m_nIndex++] ^= pImpl->m_pDigest[k]; - if (pImpl->m_nIndex >= RTL_RANDOM_SIZE_POOL) - { - pImpl->m_nData = RTL_RANDOM_SIZE_POOL; - pImpl->m_nIndex = 0; - } - } - } - - if (pImpl->m_nIndex > pImpl->m_nData) - pImpl->m_nData = pImpl->m_nIndex; -} - -/* - * __rtl_random_readPool. - */ -static void __rtl_random_readPool ( - RandomPool_Impl *pImpl, sal_uInt8 *pBuffer, sal_Size nBufLen) -{ - sal_Int32 j, k; - - while (nBufLen > 0) - { - j = nBufLen; - if (j > RTL_RANDOM_SIZE_DIGEST/2) - j = RTL_RANDOM_SIZE_DIGEST/2; - nBufLen -= j; - - rtl_digest_update ( - pImpl->m_hDigest, - &(pImpl->m_pDigest[RTL_RANDOM_SIZE_DIGEST/2]), - RTL_RANDOM_SIZE_DIGEST/2); - - k = (pImpl->m_nIndex + j) - pImpl->m_nData; - if (k > 0) - { - rtl_digest_update ( - pImpl->m_hDigest, &(pImpl->m_pData[pImpl->m_nIndex]), j - k); - rtl_digest_update ( - pImpl->m_hDigest, &(pImpl->m_pData[0]), k); - } - else - { - rtl_digest_update ( - pImpl->m_hDigest, &(pImpl->m_pData[pImpl->m_nIndex]), j); - } - - rtl_digest_get ( - pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST); - for (k = 0; k < j; k++) - { - if (pImpl->m_nIndex >= pImpl->m_nData) pImpl->m_nIndex = 0; - pImpl->m_pData[pImpl->m_nIndex++] ^= pImpl->m_pDigest[k]; - *pBuffer++ = pImpl->m_pDigest[k + RTL_RANDOM_SIZE_DIGEST/2]; - } - } - - pImpl->m_nCount++; - rtl_digest_update ( - pImpl->m_hDigest, &(pImpl->m_nCount), sizeof(pImpl->m_nCount)); - rtl_digest_update ( - pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST); - rtl_digest_get ( - pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST); -} - -/*======================================================================== - * - * rtlRandom implementation. - * - *======================================================================*/ -/* - * rtl_random_createPool. - */ -rtlRandomPool SAL_CALL rtl_random_createPool (void) -{ - RandomPool_Impl *pImpl = (RandomPool_Impl*)NULL; - pImpl = (RandomPool_Impl*)rtl_allocateZeroMemory (sizeof(RandomPool_Impl)); - if (pImpl) - { - if (!__rtl_random_initPool (pImpl)) - { - rtl_freeZeroMemory (pImpl, sizeof(RandomPool_Impl)); - pImpl = (RandomPool_Impl*)NULL; - } - } - return ((rtlRandomPool)pImpl); -} - -/* - * rtl_random_destroyPool. - */ -void SAL_CALL rtl_random_destroyPool (rtlRandomPool Pool) -{ - RandomPool_Impl *pImpl = (RandomPool_Impl *)Pool; - if (pImpl) - { - rtl_digest_destroy (pImpl->m_hDigest); - rtl_freeZeroMemory (pImpl, sizeof (RandomPool_Impl)); - } -} - -/* - * rtl_random_addBytes. - */ -rtlRandomError SAL_CALL rtl_random_addBytes ( - rtlRandomPool Pool, const void *Buffer, sal_Size Bytes) -{ - RandomPool_Impl *pImpl = (RandomPool_Impl *)Pool; - const sal_uInt8 *pBuffer = (const sal_uInt8 *)Buffer; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Random_E_Argument; - - __rtl_random_seedPool (pImpl, pBuffer, Bytes); - return rtl_Random_E_None; -} - -/* - * rtl_random_getBytes. - */ -rtlRandomError SAL_CALL rtl_random_getBytes ( - rtlRandomPool Pool, void *Buffer, sal_Size Bytes) -{ - RandomPool_Impl *pImpl = (RandomPool_Impl *)Pool; - sal_uInt8 *pBuffer = (sal_uInt8 *)Buffer; - - if ((pImpl == NULL) || (pBuffer == NULL)) - return rtl_Random_E_Argument; - - __rtl_random_readPool (pImpl, pBuffer, Bytes); - return rtl_Random_E_None; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/rtl_process.c b/sal/rtl/source/rtl_process.c deleted file mode 100644 index 0317cd1af..000000000 --- a/sal/rtl/source/rtl_process.c +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#include <string.h> -#include <osl/mutex.h> -#include <rtl/uuid.h> - -/* rtl_getCommandArg, rtl_getCommandArgCount see cmdargs.cxx */ - -void SAL_CALL rtl_getGlobalProcessId( sal_uInt8 *pTargetUUID ) -{ - static sal_uInt8 *pUuid = 0; - if( ! pUuid ) - { - osl_acquireMutex( * osl_getGlobalMutex() ); - if( ! pUuid ) - { - static sal_uInt8 aUuid[16]; - rtl_createUuid( aUuid , 0 , sal_False ); - pUuid = aUuid; - } - osl_releaseMutex( * osl_getGlobalMutex() ); - } - memcpy( pTargetUUID , pUuid , 16 ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/strbuf.c b/sal/rtl/source/strbuf.c deleted file mode 100644 index c0e9694dc..000000000 --- a/sal/rtl/source/strbuf.c +++ /dev/null @@ -1,179 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <osl/interlck.h> - -#ifndef _RTL_STRING_HXX_ -#include <rtl/strbuf.hxx> -#endif -#include <rtl/memory.h> - -/* -#include <rtl/alloc.h> -*/ - - - -/************************************************************************* - * rtl_stringbuffer_newFromStr_WithLength - */ -void SAL_CALL rtl_stringbuffer_newFromStr_WithLength( rtl_String ** newStr, - const sal_Char * value, - sal_Int32 count ) -{ - if (!value) - { - rtl_string_new_WithLength( newStr, 16 ); - return; - } - - rtl_string_new_WithLength( newStr, count + 16 ); - (*newStr)->length = count; - rtl_copyMemory( (*newStr)->buffer, value, count ); - return; -} - -/************************************************************************* - * rtl_stringbuffer_newFromStringBuffer - */ -sal_Int32 SAL_CALL rtl_stringbuffer_newFromStringBuffer( rtl_String ** newStr, - sal_Int32 capacity, - rtl_String * oldStr ) -{ - sal_Int32 newCapacity = capacity; - - if (newCapacity < oldStr->length) - newCapacity = oldStr->length; - - rtl_string_new_WithLength( newStr, newCapacity ); - if (oldStr->length > 0) { - (*newStr)->length = oldStr->length; - rtl_copyMemory( (*newStr)->buffer, oldStr->buffer, oldStr->length ); - } - return newCapacity; -} - -/************************************************************************* - * rtl_stringbuffer_ensureCapacity - */ -void SAL_CALL rtl_stringbuffer_ensureCapacity - (rtl_String ** This, sal_Int32* capacity, sal_Int32 minimumCapacity) -{ - if (minimumCapacity > *capacity) - { - rtl_String * pTmp = *This; - rtl_String * pNew = NULL; - *capacity = ((*This)->length + 1) * 2; - if (minimumCapacity > *capacity) - /* still lower, set to the minimum capacity */ - *capacity = minimumCapacity; - - rtl_string_new_WithLength(&pNew, *capacity); - pNew->length = (*This)->length; - *This = pNew; - - rtl_copyMemory( (*This)->buffer, pTmp->buffer, pTmp->length ); - rtl_string_release( pTmp ); - } -} - -/************************************************************************* - * rtl_stringbuffer_insert - */ -void SAL_CALL rtl_stringbuffer_insert( rtl_String ** This, - sal_Int32 * capacity, - sal_Int32 offset, - const sal_Char * str, - sal_Int32 len ) -{ - sal_Int32 nOldLen; - sal_Char * pBuf; - sal_Int32 n; - if( len != 0 ) - { - if (*capacity < (*This)->length + len) - rtl_stringbuffer_ensureCapacity( This, capacity, (*This)->length + len ); - - /* - if( len == 1 ) - This->buffer - */ - nOldLen = (*This)->length; - pBuf = (*This)->buffer; - - /* copy the tail */ - n = (nOldLen - offset); - if( n == 1 ) - /* optimized for 1 character */ - pBuf[offset + len] = pBuf[offset]; - else if( n > 1 ) - rtl_moveMemory( pBuf + offset + len, pBuf + offset, n * sizeof(sal_Char) ); - - /* insert the new characters */ - n = len; - if( len == 1 ) - /* optimized for 1 character */ - pBuf[offset] = *str; - else if( n > 1 ) - rtl_copyMemory( pBuf + offset, str, len * sizeof(sal_Char) ); - (*This)->length = nOldLen + len; - pBuf[ nOldLen + len ] = 0; - } -} - -/************************************************************************* - * rtl_stringbuffer_remove - */ -void SAL_CALL rtl_stringbuffer_remove( rtl_String ** This, - sal_Int32 start, - sal_Int32 len ) -{ - sal_Int32 nTailLen; - sal_Char * pBuf; - - if (len > (*This)->length - start) - len = (*This)->length - start; - - //remove nothing - if (!len) - return; - - pBuf = (*This)->buffer; - nTailLen = (*This)->length - ( start + len ); - - if (nTailLen) - { - /* move the tail */ - rtl_moveMemory(pBuf + start, pBuf + start + len, nTailLen * sizeof(sal_Char)); - } - - (*This)->length-=len; - pBuf[ (*This)->length ] = 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/strimp.c b/sal/rtl/source/strimp.c deleted file mode 100644 index 3e66f0412..000000000 --- a/sal/rtl/source/strimp.c +++ /dev/null @@ -1,61 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "strimp.h" - -sal_Int16 rtl_ImplGetDigit( sal_Unicode ch, sal_Int16 nRadix ) -{ - sal_Int16 n = -1; - if ( (ch >= '0') && (ch <= '9') ) - n = ch-'0'; - else if ( (ch >= 'a') && (ch <= 'z') ) - n = ch-'a'+10; - else if ( (ch >= 'A') && (ch <= 'Z') ) - n = ch-'A'+10; - return (n < nRadix) ? n : -1; -} - -sal_Bool rtl_ImplIsWhitespace( sal_Unicode c ) -{ - /* Space or Control character? */ - if ( (c <= 32) && c ) - return sal_True; - - /* Only in the General Punctuation area Space or Control characters are included? */ - if ( (c < 0x2000) || (c > 0x206F) ) - return sal_False; - - if ( ((c >= 0x2000) && (c <= 0x200B)) || /* All Spaces */ - (c == 0x2028) || /* LINE SEPARATOR */ - (c == 0x2029) ) /* PARAGRAPH SEPARATOR */ - return sal_True; - - return sal_False; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/strimp.h b/sal/rtl/source/strimp.h deleted file mode 100644 index bbf3850c6..000000000 --- a/sal/rtl/source/strimp.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_RTL_SOURCE_STRIMP_H -#define INCLUDED_RTL_SOURCE_STRIMP_H - -#include <osl/interlck.h> - -#include "sal/types.h" - -/* ======================================================================= */ -/* Help functions for String and UString */ -/* ======================================================================= */ - -#if defined __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* - * refCount is opaqueincludes 2 bit-fields; - * MSB: 'interned' - is stored in the intern hash - * MSB-1: 'static' - is a const / static string, - * do no ref counting - */ -#define SAL_STRING_INTERN_FLAG 0x80000000 -#define SAL_STRING_STATIC_FLAG 0x40000000 -#define SAL_STRING_REFCOUNT(a) ((a) & 0x3fffffff) - -#define SAL_STRING_IS_INTERN(a) ((a)->refCount & SAL_STRING_INTERN_FLAG) -#define SAL_STRING_IS_STATIC(a) ((a)->refCount & SAL_STRING_STATIC_FLAG) - -sal_Int16 rtl_ImplGetDigit( sal_Unicode ch, sal_Int16 nRadix ); - -sal_Bool rtl_ImplIsWhitespace( sal_Unicode c ); - -#if defined __cplusplus -} -#endif /* __cplusplus */ - -#endif /* INCLUDED_RTL_SOURCE_STRIMP_H */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/string.c b/sal/rtl/source/string.c deleted file mode 100644 index 19680113d..000000000 --- a/sal/rtl/source/string.c +++ /dev/null @@ -1,323 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#pragma warning(disable:4738) // storing 32-bit float result in memory, possible loss of performance -#endif - -#include <rtl/memory.h> -#include <osl/interlck.h> -#include <rtl/alloc.h> -#include <osl/diagnose.h> -#include <rtl/tencinfo.h> - -#include "strimp.h" -#include "surrogates.h" -#include <rtl/string.h> - -#include "rtl/math.h" -#include "rtl/tencinfo.h" - -/* ======================================================================= */ - -/* static data to be referenced by all empty strings - * the refCount is predefined to 1 and must never become 0 ! - */ -static rtl_String const aImplEmpty_rtl_String = -{ - SAL_STRING_STATIC_FLAG|1, - /* sal_Int32 refCount; */ - 0, /* sal_Int32 length; */ - { 0 } /* sal_Char buffer[1]; */ -}; - -/* ======================================================================= */ - -#define IMPL_RTL_STRCODE sal_Char -#define IMPL_RTL_USTRCODE( c ) ((unsigned char)c) -#define IMPL_RTL_STRNAME( n ) rtl_str_ ## n - -#define IMPL_RTL_STRINGNAME( n ) rtl_string_ ## n -#define IMPL_RTL_STRINGDATA rtl_String -#define IMPL_RTL_EMPTYSTRING aImplEmpty_rtl_String - -/* ======================================================================= */ - -/* Include String/UString template code */ - -#include "strtmpl.c" - -sal_Int32 SAL_CALL rtl_str_valueOfFloat(sal_Char * pStr, float f) -{ - rtl_String * pResult = NULL; - sal_Int32 nLen; - rtl_math_doubleToString( - &pResult, 0, 0, f, rtl_math_StringFormat_G, - RTL_STR_MAX_VALUEOFFLOAT - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0, 0, - sal_True); - nLen = pResult->length; - OSL_ASSERT(nLen < RTL_STR_MAX_VALUEOFFLOAT); - rtl_copyMemory(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Char)); - rtl_string_release(pResult); - return nLen; -} - -sal_Int32 SAL_CALL rtl_str_valueOfDouble(sal_Char * pStr, double d) -{ - rtl_String * pResult = NULL; - sal_Int32 nLen; - rtl_math_doubleToString( - &pResult, 0, 0, d, rtl_math_StringFormat_G, - RTL_STR_MAX_VALUEOFDOUBLE - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0, - 0, sal_True); - nLen = pResult->length; - OSL_ASSERT(nLen < RTL_STR_MAX_VALUEOFDOUBLE); - rtl_copyMemory(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Char)); - rtl_string_release(pResult); - return nLen; -} - -float SAL_CALL rtl_str_toFloat(sal_Char const * pStr) -{ - return (float) rtl_math_stringToDouble(pStr, pStr + rtl_str_getLength(pStr), - '.', 0, 0, 0); -} - -double SAL_CALL rtl_str_toDouble(sal_Char const * pStr) -{ - return rtl_math_stringToDouble(pStr, pStr + rtl_str_getLength(pStr), '.', 0, - 0, 0); -} - -/* ======================================================================= */ - -static int rtl_ImplGetFastUTF8ByteLen( const sal_Unicode* pStr, sal_Int32 nLen ) -{ - int n; - sal_Unicode c; - sal_uInt32 nUCS4Char; - const sal_Unicode* pEndStr; - - n = 0; - pEndStr = pStr+nLen; - while ( pStr < pEndStr ) - { - c = *pStr; - - if ( c < 0x80 ) - n++; - else if ( c < 0x800 ) - n += 2; - else - { - if ( !SAL_RTL_IS_HIGH_SURROGATE(c) ) - n += 3; - else - { - nUCS4Char = c; - - if ( pStr+1 < pEndStr ) - { - c = *(pStr+1); - if ( SAL_RTL_IS_LOW_SURROGATE(c) ) - { - nUCS4Char = SAL_RTL_COMBINE_SURROGATES(nUCS4Char, c); - pStr++; - } - } - - if ( nUCS4Char < 0x10000 ) - n += 3; - else if ( nUCS4Char < 0x200000 ) - n += 4; - else if ( nUCS4Char < 0x4000000 ) - n += 5; - else - n += 6; - } - } - - pStr++; - } - - return n; -} - -/* ----------------------------------------------------------------------- */ - -sal_Bool SAL_CALL rtl_impl_convertUStringToString(rtl_String ** pTarget, - sal_Unicode const * pSource, - sal_Int32 nLength, - rtl_TextEncoding nEncoding, - sal_uInt32 nFlags, - sal_Bool bCheckErrors) -{ - OSL_ASSERT(pTarget != NULL - && (pSource != NULL || nLength == 0) - && nLength >= 0 - && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))); - - if ( !nLength ) - rtl_string_new( pTarget ); - else - { - rtl_String* pTemp; - rtl_UnicodeToTextConverter hConverter; - sal_uInt32 nInfo; - sal_Size nSrcChars; - sal_Size nDestBytes; - sal_Size nNewLen; - sal_Size nNotConvertedChars; - sal_Size nMaxCharLen; - - /* Optimization for UTF-8 - we try to calculate the exact length */ - /* For all other encoding we try an good estimation */ - if ( nEncoding == RTL_TEXTENCODING_UTF8 ) - { - nNewLen = rtl_ImplGetFastUTF8ByteLen( pSource, nLength ); - /* Includes the string only ASCII, then we could copy - the buffer faster */ - if ( nNewLen == (sal_Size)nLength ) - { - IMPL_RTL_STRCODE* pBuffer; - if ( *pTarget ) - IMPL_RTL_STRINGNAME( release )( *pTarget ); - *pTarget = IMPL_RTL_STRINGNAME( ImplAlloc )( nLength ); - OSL_ASSERT(*pTarget != NULL); - pBuffer = (*pTarget)->buffer; - do - { - /* Check ASCII range */ - OSL_ENSURE( *pSource <= 127, - "rtl_uString2String() - UTF8 test is encoding is wrong" ); - - *pBuffer = (IMPL_RTL_STRCODE)(unsigned char)*pSource; - pBuffer++; - pSource++; - nLength--; - } - while ( nLength ); - return sal_True; - } - - nMaxCharLen = 4; - } - else - { - rtl_TextEncodingInfo aTextEncInfo; - aTextEncInfo.StructSize = sizeof( aTextEncInfo ); - if ( !rtl_getTextEncodingInfo( nEncoding, &aTextEncInfo ) ) - { - aTextEncInfo.AverageCharSize = 1; - aTextEncInfo.MaximumCharSize = 8; - } - - nNewLen = nLength*aTextEncInfo.AverageCharSize; - nMaxCharLen = aTextEncInfo.MaximumCharSize; - } - - nFlags |= RTL_UNICODETOTEXT_FLAGS_FLUSH; - hConverter = rtl_createUnicodeToTextConverter( nEncoding ); - - for (;;) - { - pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen ); - OSL_ASSERT(pTemp != NULL); - nDestBytes = rtl_convertUnicodeToText( hConverter, 0, - pSource, nLength, - pTemp->buffer, nNewLen, - nFlags, - &nInfo, &nSrcChars ); - if (bCheckErrors && (nInfo & RTL_UNICODETOTEXT_INFO_ERROR) != 0) - { - rtl_freeMemory(pTemp); - rtl_destroyUnicodeToTextConverter(hConverter); - return sal_False; - } - - if ((nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL) == 0) - break; - - /* Buffer not big enough, try again with enough space */ - rtl_freeMemory( pTemp ); - - /* Try with the max. count of characters with - additional overhead for replacing functionality */ - nNotConvertedChars = nLength-nSrcChars; - nNewLen = nDestBytes+(nNotConvertedChars*nMaxCharLen)+nNotConvertedChars+4; - } - - /* Set the buffer to the correct size or is there to - much overhead, reallocate to the correct size */ - if ( nNewLen > nDestBytes+8 ) - { - rtl_String* pTemp2 = IMPL_RTL_STRINGNAME( ImplAlloc )( nDestBytes ); - OSL_ASSERT(pTemp2 != NULL); - rtl_str_ImplCopy( pTemp2->buffer, pTemp->buffer, nDestBytes ); - rtl_freeMemory( pTemp ); - pTemp = pTemp2; - } - else - { - pTemp->length = nDestBytes; - pTemp->buffer[nDestBytes] = 0; - } - - rtl_destroyUnicodeToTextConverter( hConverter ); - if ( *pTarget ) - IMPL_RTL_STRINGNAME( release )( *pTarget ); - *pTarget = pTemp; - - /* Results the conversion in an empty buffer - - create an empty string */ - if ( pTemp && !nDestBytes ) - rtl_string_new( pTarget ); - } - return sal_True; -} - -void SAL_CALL rtl_uString2String( rtl_String** ppThis, - const sal_Unicode* pUStr, - sal_Int32 nULen, - rtl_TextEncoding eTextEncoding, - sal_uInt32 nCvtFlags ) -{ - rtl_impl_convertUStringToString(ppThis, pUStr, nULen, eTextEncoding, - nCvtFlags, sal_False); -} - -sal_Bool SAL_CALL rtl_convertUStringToString(rtl_String ** pTarget, - sal_Unicode const * pSource, - sal_Int32 nLength, - rtl_TextEncoding nEncoding, - sal_uInt32 nFlags) -{ - return rtl_impl_convertUStringToString(pTarget, pSource, nLength, nEncoding, - nFlags, sal_True); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/strtmpl.c b/sal/rtl/source/strtmpl.c deleted file mode 100644 index 98c09f15a..000000000 --- a/sal/rtl/source/strtmpl.c +++ /dev/null @@ -1,1570 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -/* ======================================================================= */ -/* Internal C-String help functions which could be used without the */ -/* String-Class */ -/* ======================================================================= */ - -/* -inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* pDest, - const IMPL_RTL_STRCODE* pSrc, - sal_Int32 nCount ) -{ - while ( nCount > 0 ) - { - *pDest = *pSrc; - pDest++; - pSrc++; - nCount--; - } -} -*/ - -#define rtl_str_ImplCopy( _pDest, _pSrc, _nCount ) \ -{ \ - IMPL_RTL_STRCODE* __mm_pDest = _pDest; \ - const IMPL_RTL_STRCODE* __mm_pSrc = _pSrc; \ - sal_Int32 __mm_nCount = _nCount; \ - while ( __mm_nCount > 0 ) \ - { \ - *__mm_pDest = *__mm_pSrc; \ - __mm_pDest++; \ - __mm_pSrc++; \ - __mm_nCount--; \ - } \ -} - -/* ======================================================================= */ -/* C-String functions which could be used without the String-Class */ -/* ======================================================================= */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( getLength )( const IMPL_RTL_STRCODE* pStr ) -{ - const IMPL_RTL_STRCODE* pTempStr = pStr; - while( *pTempStr ) - pTempStr++; - return pTempStr-pStr; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare )( const IMPL_RTL_STRCODE* pStr1, - const IMPL_RTL_STRCODE* pStr2 ) -{ - sal_Int32 nRet; - while ( ((nRet = ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr1)))- - ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr2)))) == 0) && - *pStr2 ) - { - pStr1++; - pStr2++; - } - - return nRet; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare_WithLength )( const IMPL_RTL_STRCODE* pStr1, - sal_Int32 nStr1Len, - const IMPL_RTL_STRCODE* pStr2, - sal_Int32 nStr2Len ) -{ - sal_Int32 nRet = nStr1Len - nStr2Len; - int nCount = (nRet <= 0) ? nStr1Len : nStr2Len; - - --pStr1; - --pStr2; - while( (--nCount >= 0) && (*++pStr1 == *++pStr2) ); - - if( nCount >= 0 ) - nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 ))) - - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 ))); - - return nRet; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1, - sal_Int32 nStr1Len, - const IMPL_RTL_STRCODE* pStr2, - sal_Int32 nStr2Len, - sal_Int32 nShortenedLength ) -{ - const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len; - const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len; - sal_Int32 nRet; - while ( (nShortenedLength > 0) && - (pStr1 < pStr1End) && (pStr2 < pStr2End) ) - { - nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))- - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 ))); - if ( nRet ) - return nRet; - - nShortenedLength--; - pStr1++; - pStr2++; - } - - if ( nShortenedLength <= 0 ) - return 0; - return nStr1Len - nStr2Len; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( reverseCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1, - sal_Int32 nStr1Len, - const IMPL_RTL_STRCODE* pStr2, - sal_Int32 nStr2Len ) -{ - const IMPL_RTL_STRCODE* pStr1Run = pStr1+nStr1Len; - const IMPL_RTL_STRCODE* pStr2Run = pStr2+nStr2Len; - sal_Int32 nRet; - while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) ) - { - pStr1Run--; - pStr2Run--; - nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1Run )))- - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2Run ))); - if ( nRet ) - return nRet; - } - - return nStr1Len - nStr2Len; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase )( const IMPL_RTL_STRCODE* pStr1, - const IMPL_RTL_STRCODE* pStr2 ) -{ - sal_Int32 nRet; - sal_Int32 c1; - sal_Int32 c2; - do - { - /* If character between 'A' and 'Z', than convert it to lowercase */ - c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 ); - c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 ); - if ( (c1 >= 65) && (c1 <= 90) ) - c1 += 32; - if ( (c2 >= 65) && (c2 <= 90) ) - c2 += 32; - nRet = c1-c2; - if ( nRet != 0 ) - return nRet; - - pStr1++; - pStr2++; - } - while ( c2 ); - - return 0; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1, - sal_Int32 nStr1Len, - const IMPL_RTL_STRCODE* pStr2, - sal_Int32 nStr2Len ) -{ - const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len; - const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len; - sal_Int32 nRet; - sal_Int32 c1; - sal_Int32 c2; - while ( (pStr1 < pStr1End) && (pStr2 < pStr2End) ) - { - /* If character between 'A' and 'Z', than convert it to lowercase */ - c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 ); - c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 ); - if ( (c1 >= 65) && (c1 <= 90) ) - c1 += 32; - if ( (c2 >= 65) && (c2 <= 90) ) - c2 += 32; - nRet = c1-c2; - if ( nRet != 0 ) - return nRet; - - pStr1++; - pStr2++; - } - - return nStr1Len - nStr2Len; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1, - sal_Int32 nStr1Len, - const IMPL_RTL_STRCODE* pStr2, - sal_Int32 nStr2Len, - sal_Int32 nShortenedLength ) -{ - const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len; - const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len; - sal_Int32 nRet; - sal_Int32 c1; - sal_Int32 c2; - while ( (nShortenedLength > 0) && - (pStr1 < pStr1End) && (pStr2 < pStr2End) ) - { - /* If character between 'A' and 'Z', than convert it to lowercase */ - c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 ); - c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 ); - if ( (c1 >= 65) && (c1 <= 90) ) - c1 += 32; - if ( (c2 >= 65) && (c2 <= 90) ) - c2 += 32; - nRet = c1-c2; - if ( nRet != 0 ) - return nRet; - - nShortenedLength--; - pStr1++; - pStr2++; - } - - if ( nShortenedLength <= 0 ) - return 0; - return nStr1Len - nStr2Len; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode )( const IMPL_RTL_STRCODE* pStr ) -{ - return IMPL_RTL_STRNAME( hashCode_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) ); -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen ) -{ - sal_Int32 h = nLen; - - if ( nLen < 256 ) - { - while ( nLen > 0 ) - { - h = (h*37) + IMPL_RTL_USTRCODE( *pStr ); - pStr++; - nLen--; - } - } - else - { - sal_Int32 nSkip; - const IMPL_RTL_STRCODE* pEndStr = pStr+nLen-5; - - /* only sample some characters */ - /* the first 3, some characters between, and the last 5 */ - h = (h*39) + IMPL_RTL_USTRCODE( *pStr ); - pStr++; - h = (h*39) + IMPL_RTL_USTRCODE( *pStr ); - pStr++; - h = (h*39) + IMPL_RTL_USTRCODE( *pStr ); - pStr++; - - if ( nLen < 32 ) - nSkip = nLen / 4; - else - nSkip = nLen / 8; - nLen -= 8; - while ( nLen > 0 ) - { - h = (h*39) + IMPL_RTL_USTRCODE( *pStr ); - pStr += nSkip; - nLen -= nSkip; - } - - h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr ); - pEndStr++; - h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr ); - pEndStr++; - h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr ); - pEndStr++; - h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr ); - pEndStr++; - h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr ); - } - - return h; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar )( const IMPL_RTL_STRCODE* pStr, - IMPL_RTL_STRCODE c ) -{ - const IMPL_RTL_STRCODE* pTempStr = pStr; - while ( *pTempStr ) - { - if ( *pTempStr == c ) - return pTempStr-pStr; - - pTempStr++; - } - - return -1; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen, - IMPL_RTL_STRCODE c ) -{ - const IMPL_RTL_STRCODE* pTempStr = pStr; - while ( nLen > 0 ) - { - if ( *pTempStr == c ) - return pTempStr-pStr; - - pTempStr++; - nLen--; - } - - return -1; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar )( const IMPL_RTL_STRCODE* pStr, - IMPL_RTL_STRCODE c ) -{ - return IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), c ); -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen, - IMPL_RTL_STRCODE c ) -{ - pStr += nLen; - while ( nLen > 0 ) - { - nLen--; - pStr--; - - if ( *pStr == c ) - return nLen; - } - - return -1; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr )( const IMPL_RTL_STRCODE* pStr, - const IMPL_RTL_STRCODE* pSubStr ) -{ - return IMPL_RTL_STRNAME( indexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), - pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) ); -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr, - sal_Int32 nStrLen, - const IMPL_RTL_STRCODE* pSubStr, - sal_Int32 nSubLen ) -{ - /* faster search for a single character */ - if ( nSubLen < 2 ) - { - /* an empty SubString is always not foundable */ - if ( nSubLen == 1 ) - { - IMPL_RTL_STRCODE c = *pSubStr; - const IMPL_RTL_STRCODE* pTempStr = pStr; - while ( nStrLen > 0 ) - { - if ( *pTempStr == c ) - return pTempStr-pStr; - - pTempStr++; - nStrLen--; - } - } - } - else - { - const IMPL_RTL_STRCODE* pTempStr = pStr; - while ( nStrLen > 0 ) - { - if ( *pTempStr == *pSubStr ) - { - /* Compare SubString */ - if ( nSubLen <= nStrLen ) - { - const IMPL_RTL_STRCODE* pTempStr1 = pTempStr; - const IMPL_RTL_STRCODE* pTempStr2 = pSubStr; - sal_Int32 nTempLen = nSubLen; - while ( nTempLen ) - { - if ( *pTempStr1 != *pTempStr2 ) - break; - - pTempStr1++; - pTempStr2++; - nTempLen--; - } - - if ( !nTempLen ) - return pTempStr-pStr; - } - else - break; - } - - nStrLen--; - pTempStr++; - } - } - - return -1; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr )( const IMPL_RTL_STRCODE* pStr, - const IMPL_RTL_STRCODE* pSubStr ) -{ - return IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), - pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) ); -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr, - sal_Int32 nStrLen, - const IMPL_RTL_STRCODE* pSubStr, - sal_Int32 nSubLen ) -{ - /* faster search for a single character */ - if ( nSubLen < 2 ) - { - /* an empty SubString is always not foundable */ - if ( nSubLen == 1 ) - { - IMPL_RTL_STRCODE c = *pSubStr; - pStr += nStrLen; - while ( nStrLen > 0 ) - { - nStrLen--; - pStr--; - - if ( *pStr == c ) - return nStrLen; - } - } - } - else - { - pStr += nStrLen; - nStrLen -= nSubLen; - pStr -= nSubLen; - while ( nStrLen >= 0 ) - { - const IMPL_RTL_STRCODE* pTempStr1 = pStr; - const IMPL_RTL_STRCODE* pTempStr2 = pSubStr; - sal_Int32 nTempLen = nSubLen; - while ( nTempLen ) - { - if ( *pTempStr1 != *pTempStr2 ) - break; - - pTempStr1++; - pTempStr2++; - nTempLen--; - } - - if ( !nTempLen ) - return nStrLen; - - nStrLen--; - pStr--; - } - } - - return -1; -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRNAME( replaceChar )( IMPL_RTL_STRCODE* pStr, - IMPL_RTL_STRCODE cOld, - IMPL_RTL_STRCODE cNew ) -{ - while ( *pStr ) - { - if ( *pStr == cOld ) - *pStr = cNew; - - pStr++; - } -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRNAME( replaceChar_WithLength )( IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen, - IMPL_RTL_STRCODE cOld, - IMPL_RTL_STRCODE cNew ) -{ - while ( nLen > 0 ) - { - if ( *pStr == cOld ) - *pStr = cNew; - - pStr++; - nLen--; - } -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase )( IMPL_RTL_STRCODE* pStr ) -{ - while ( *pStr ) - { - /* Between A-Z (65-90), than to lowercase (+32) */ - if ( (*pStr >= 65) && (*pStr <= 90) ) - *pStr += 32; - - pStr++; - } -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase_WithLength )( IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen ) -{ - while ( nLen > 0 ) - { - /* Between A-Z (65-90), than to lowercase (+32) */ - if ( (*pStr >= 65) && (*pStr <= 90) ) - *pStr += 32; - - pStr++; - nLen--; - } -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase )( IMPL_RTL_STRCODE* pStr ) -{ - while ( *pStr ) - { - /* Between a-z (97-122), than to uppercase (-32) */ - if ( (*pStr >= 97) && (*pStr <= 122) ) - *pStr -= 32; - - pStr++; - } -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase_WithLength )( IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen ) -{ - while ( nLen > 0 ) - { - /* Between a-z (97-122), than to uppercase (-32) */ - if ( (*pStr >= 97) && (*pStr <= 122) ) - *pStr -= 32; - - pStr++; - nLen--; - } -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim )( IMPL_RTL_STRCODE* pStr ) -{ - return IMPL_RTL_STRNAME( trim_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) ); -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim_WithLength )( IMPL_RTL_STRCODE* pStr, sal_Int32 nLen ) -{ - sal_Int32 nPreSpaces = 0; - sal_Int32 nPostSpaces = 0; - sal_Int32 nIndex = nLen-1; - - while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nPreSpaces)) ) ) - nPreSpaces++; - - while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nIndex)) ) ) - { - nPostSpaces++; - nIndex--; - } - - if ( nPostSpaces ) - { - nLen -= nPostSpaces; - *(pStr+nLen) = 0; - } - - if ( nPreSpaces ) - { - IMPL_RTL_STRCODE* pNewStr = pStr+nPreSpaces; - - nLen -= nPreSpaces; - nIndex = nLen; - - while ( nIndex ) - { - *pStr = *pNewStr; - pStr++; - pNewStr++; - nIndex--; - } - *pStr = 0; - } - - return nLen; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfBoolean )( IMPL_RTL_STRCODE* pStr, sal_Bool b ) -{ - if ( b ) - { - *pStr = 't'; - pStr++; - *pStr = 'r'; - pStr++; - *pStr = 'u'; - pStr++; - *pStr = 'e'; - pStr++; - *pStr = 0; - return 4; - } - else - { - *pStr = 'f'; - pStr++; - *pStr = 'a'; - pStr++; - *pStr = 'l'; - pStr++; - *pStr = 's'; - pStr++; - *pStr = 'e'; - pStr++; - *pStr = 0; - return 5; - } -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfChar )( IMPL_RTL_STRCODE* pStr, - IMPL_RTL_STRCODE c ) -{ - *pStr++ = c; - *pStr = 0; - return 1; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt32 )( IMPL_RTL_STRCODE* pStr, - sal_Int32 n, - sal_Int16 nRadix ) -{ - sal_Char aBuf[RTL_STR_MAX_VALUEOFINT32]; - sal_Char* pBuf = aBuf; - sal_Int32 nLen = 0; - sal_uInt32 nValue; - - /* Radix must be valid */ - if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) ) - nRadix = 10; - - /* is value negativ */ - if ( n < 0 ) - { - *pStr = '-'; - pStr++; - nLen++; - nValue = -n; /* FIXME this code is not portable for n == -2147483648 - (smallest negative value for sal_Int32) */ - } - else - nValue = n; - - /* create a recursive buffer with all values, except the last one */ - do - { - sal_Char nDigit = (sal_Char)(nValue % nRadix); - nValue /= nRadix; - if ( nDigit > 9 ) - *pBuf = (nDigit-10) + 'a'; - else - *pBuf = (nDigit + '0' ); - pBuf++; - } - while ( nValue > 0 ); - - /* copy the values in the right direction into the destination buffer */ - do - { - pBuf--; - *pStr = *pBuf; - pStr++; - nLen++; - } - while ( pBuf != aBuf ); - *pStr = 0; - - return nLen; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt64 )( IMPL_RTL_STRCODE* pStr, - sal_Int64 n, - sal_Int16 nRadix ) -{ - sal_Char aBuf[RTL_STR_MAX_VALUEOFINT64]; - sal_Char* pBuf = aBuf; - sal_Int32 nLen = 0; - sal_uInt64 nValue; - - /* Radix must be valid */ - if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) ) - nRadix = 10; - - /* is value negativ */ - if ( n < 0 ) - { - *pStr = '-'; - pStr++; - nLen++; - nValue = -n; /* FIXME this code is not portable for - n == -9223372036854775808 (smallest negative value for - sal_Int64) */ - } - else - nValue = n; - - /* create a recursive buffer with all values, except the last one */ - do - { - sal_Char nDigit = (sal_Char)(nValue % nRadix); - nValue /= nRadix; - if ( nDigit > 9 ) - *pBuf = (nDigit-10) + 'a'; - else - *pBuf = (nDigit + '0' ); - pBuf++; - } - while ( nValue > 0 ); - - /* copy the values in the right direction into the destination buffer */ - do - { - pBuf--; - *pStr = *pBuf; - pStr++; - nLen++; - } - while ( pBuf != aBuf ); - *pStr = 0; - - return nLen; -} - -/* ----------------------------------------------------------------------- */ - -sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr ) -{ - if ( *pStr == '1' ) - return sal_True; - - if ( (*pStr == 'T') || (*pStr == 't') ) - { - pStr++; - if ( (*pStr == 'R') || (*pStr == 'r') ) - { - pStr++; - if ( (*pStr == 'U') || (*pStr == 'u') ) - { - pStr++; - if ( (*pStr == 'E') || (*pStr == 'e') ) - return sal_True; - } - } - } - - return sal_False; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr, - sal_Int16 nRadix ) -{ - sal_Bool bNeg; - sal_Int16 nDigit; - sal_Int32 n = 0; - - if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) ) - nRadix = 10; - - /* Skip whitespaces */ - while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) ) - pStr++; - - if ( *pStr == '-' ) - { - bNeg = sal_True; - pStr++; - } - else - { - if ( *pStr == '+' ) - pStr++; - bNeg = sal_False; - } - - while ( *pStr ) - { - nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix ); - if ( nDigit < 0 ) - break; - - n *= nRadix; - n += nDigit; - - pStr++; - } - - if ( bNeg ) - return -n; - else - return n; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr, - sal_Int16 nRadix ) -{ - sal_Bool bNeg; - sal_Int16 nDigit; - sal_Int64 n = 0; - - if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) ) - nRadix = 10; - - /* Skip whitespaces */ - while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) ) - pStr++; - - if ( *pStr == '-' ) - { - bNeg = sal_True; - pStr++; - } - else - { - if ( *pStr == '+' ) - pStr++; - bNeg = sal_False; - } - - while ( *pStr ) - { - nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix ); - if ( nDigit < 0 ) - break; - - n *= nRadix; - n += nDigit; - - pStr++; - } - - if ( bNeg ) - return -n; - else - return n; -} - -/* ======================================================================= */ -/* Internal String-Class help functions */ -/* ======================================================================= */ - -static IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen ) -{ - IMPL_RTL_STRINGDATA * pData - = (SAL_INT_CAST(sal_uInt32, nLen) - <= ((SAL_MAX_UINT32 - sizeof (IMPL_RTL_STRINGDATA)) - / sizeof (IMPL_RTL_STRCODE))) - ? (IMPL_RTL_STRINGDATA *) rtl_allocateMemory( - sizeof (IMPL_RTL_STRINGDATA) + nLen * sizeof (IMPL_RTL_STRCODE)) - : NULL; - if (pData != NULL) { - pData->refCount = 1; - pData->length = nLen; - pData->buffer[nLen] = 0; - } - return pData; -} - -/* ----------------------------------------------------------------------- */ - -static IMPL_RTL_STRCODE* IMPL_RTL_STRINGNAME( ImplNewCopy )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr, - sal_Int32 nCount ) -{ - IMPL_RTL_STRCODE* pDest; - const IMPL_RTL_STRCODE* pSrc; - IMPL_RTL_STRINGDATA* pData = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length ); - OSL_ASSERT(pData != NULL); - - pDest = pData->buffer; - pSrc = pStr->buffer; - while ( nCount > 0 ) - { - *pDest = *pSrc; - pDest++; - pSrc++; - nCount--; - } - - *ppThis = pData; - return pDest; -} - -/* ======================================================================= */ -/* String-Class functions */ -/* ======================================================================= */ - -#define IMPL_RTL_AQUIRE( pThis ) \ -{ \ - if (!SAL_STRING_IS_STATIC (pThis)) \ - osl_incrementInterlockedCount( &((pThis)->refCount) ); \ -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( acquire )( IMPL_RTL_STRINGDATA* pThis ) -{ - IMPL_RTL_AQUIRE( pThis ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( release )( IMPL_RTL_STRINGDATA* pThis ) -{ - if (SAL_STRING_IS_STATIC (pThis)) - return; - -/* OString doesn't have an 'intern' */ -#ifdef IMPL_RTL_INTERN - if (SAL_STRING_IS_INTERN (pThis)) - { - internRelease (pThis); - return; - } -#endif - - if ( pThis->refCount == 1 || - !osl_decrementInterlockedCount( &(pThis->refCount) ) ) - { - rtl_freeMemory( pThis ); - } -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( new )( IMPL_RTL_STRINGDATA** ppThis ) -{ - if ( *ppThis) - IMPL_RTL_STRINGNAME( release )( *ppThis ); - - *ppThis = (IMPL_RTL_STRINGDATA*) (&IMPL_RTL_EMPTYSTRING); - IMPL_RTL_AQUIRE( *ppThis ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( new_WithLength )( IMPL_RTL_STRINGDATA** ppThis, sal_Int32 nLen ) -{ - if ( nLen <= 0 ) - IMPL_RTL_STRINGNAME( new )( ppThis ); - else - { - if ( *ppThis) - IMPL_RTL_STRINGNAME( release )( *ppThis ); - - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen ); - OSL_ASSERT(*ppThis != NULL); - (*ppThis)->length = 0; - - { - IMPL_RTL_STRCODE* pTempStr = (*ppThis)->buffer; - while ( nLen >= 0 ) - { - *pTempStr = 0; - pTempStr++; - nLen--; - } - } - } -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newFromString )( IMPL_RTL_STRINGDATA** ppThis, - const IMPL_RTL_STRINGDATA* pStr ) -{ - IMPL_RTL_STRINGDATA* pOrg; - - if ( !pStr->length ) - { - IMPL_RTL_STRINGNAME( new )( ppThis ); - return; - } - - pOrg = *ppThis; - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length ); - OSL_ASSERT(*ppThis != NULL); - rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer, pStr->length ); - - /* must be done at least, if pStr == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr )( IMPL_RTL_STRINGDATA** ppThis, - const IMPL_RTL_STRCODE* pCharStr ) -{ - IMPL_RTL_STRCODE* pBuffer; - IMPL_RTL_STRINGDATA* pOrg; - sal_Int32 nLen; - - if ( pCharStr ) - { - const IMPL_RTL_STRCODE* pTempStr = pCharStr; - while( *pTempStr ) - pTempStr++; - nLen = pTempStr-pCharStr; - } - else - nLen = 0; - - if ( !nLen ) - { - IMPL_RTL_STRINGNAME( new )( ppThis ); - return; - } - - pOrg = *ppThis; - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen ); - OSL_ASSERT(*ppThis != NULL); - pBuffer = (*ppThis)->buffer; - do - { - *pBuffer = *pCharStr; - pBuffer++; - pCharStr++; - } - while ( *pCharStr ); - - /* must be done at least, if pCharStr == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr_WithLength )( IMPL_RTL_STRINGDATA** ppThis, - const IMPL_RTL_STRCODE* pCharStr, - sal_Int32 nLen ) -{ - IMPL_RTL_STRINGDATA* pOrg; - - if ( !pCharStr || (nLen <= 0) ) - { - IMPL_RTL_STRINGNAME( new )( ppThis ); - return; - } - - pOrg = *ppThis; - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen ); - OSL_ASSERT(*ppThis != NULL); - rtl_str_ImplCopy( (*ppThis)->buffer, pCharStr, nLen ); - - /* must be done at least, if pCharStr == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( assign )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr ) -{ - /* must be done at first, if pStr == *ppThis */ - IMPL_RTL_AQUIRE( pStr ); - - if ( *ppThis ) - IMPL_RTL_STRINGNAME( release )( *ppThis ); - - *ppThis = pStr; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getLength )( const IMPL_RTL_STRINGDATA* pThis ) -{ - return pThis->length; -} - -/* ----------------------------------------------------------------------- */ - -IMPL_RTL_STRCODE* SAL_CALL IMPL_RTL_STRINGNAME( getStr )( IMPL_RTL_STRINGDATA * pThis ) -{ - return pThis->buffer; -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newConcat )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pLeft, - IMPL_RTL_STRINGDATA* pRight ) -{ - IMPL_RTL_STRINGDATA* pOrg = *ppThis; - - /* Test for 0-Pointer - if not, change newReplaceStrAt! */ - if ( !pRight || !pRight->length ) - { - *ppThis = pLeft; - IMPL_RTL_AQUIRE( pLeft ); - } - else if ( !pLeft || !pLeft->length ) - { - *ppThis = pRight; - IMPL_RTL_AQUIRE( pRight ); - } - else - { - IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( pLeft->length + pRight->length ); - OSL_ASSERT(pTempStr != NULL); - rtl_str_ImplCopy( pTempStr->buffer, pLeft->buffer, pLeft->length ); - rtl_str_ImplCopy( pTempStr->buffer+pLeft->length, pRight->buffer, pRight->length ); - *ppThis = pTempStr; - } - - /* must be done at least, if left or right == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newReplaceStrAt )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr, - sal_Int32 nIndex, - sal_Int32 nCount, - IMPL_RTL_STRINGDATA* pNewSubStr ) -{ - /* Append? */ - if ( nIndex >= pStr->length ) - { - /* newConcat test, if pNewSubStr is 0 */ - IMPL_RTL_STRINGNAME( newConcat )( ppThis, pStr, pNewSubStr ); - return; - } - - /* negativ index? */ - if ( nIndex < 0 ) - { - nCount -= nIndex; - nIndex = 0; - } - - /* not more than the String length could be deleted */ - if ( nCount >= pStr->length-nIndex ) - { - nCount = pStr->length-nIndex; - - /* Assign of NewSubStr? */ - if ( !nIndex && (nCount >= pStr->length) ) - { - if ( !pNewSubStr ) - IMPL_RTL_STRINGNAME( new )( ppThis ); - else - IMPL_RTL_STRINGNAME( assign )( ppThis, pNewSubStr ); - return; - } - } - - /* Assign of Str? */ - if ( !nCount && (!pNewSubStr || !pNewSubStr->length) ) - { - IMPL_RTL_STRINGNAME( assign )( ppThis, pStr ); - return; - } - - { - IMPL_RTL_STRINGDATA* pOrg = *ppThis; - IMPL_RTL_STRCODE* pBuffer; - sal_Int32 nNewLen; - - /* Calculate length of the new string */ - nNewLen = pStr->length-nCount; - if ( pNewSubStr ) - nNewLen += pNewSubStr->length; - - /* Alloc New Buffer */ - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen ); - OSL_ASSERT(*ppThis != NULL); - pBuffer = (*ppThis)->buffer; - if ( nIndex ) - { - rtl_str_ImplCopy( pBuffer, pStr->buffer, nIndex ); - pBuffer += nIndex; - } - if ( pNewSubStr && pNewSubStr->length ) - { - rtl_str_ImplCopy( pBuffer, pNewSubStr->buffer, pNewSubStr->length ); - pBuffer += pNewSubStr->length; - } - rtl_str_ImplCopy( pBuffer, pStr->buffer+nIndex+nCount, pStr->length-nIndex-nCount ); - - /* must be done at least, if pStr or pNewSubStr == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); - } -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newReplace )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr, - IMPL_RTL_STRCODE cOld, - IMPL_RTL_STRCODE cNew ) -{ - IMPL_RTL_STRINGDATA* pOrg = *ppThis; - int bChanged = 0; - sal_Int32 nLen = pStr->length; - const IMPL_RTL_STRCODE* pCharStr = pStr->buffer; - - while ( nLen > 0 ) - { - if ( *pCharStr == cOld ) - { - /* Copy String */ - IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer ); - - /* replace/copy rest of the string */ - if ( pNewCharStr ) - { - *pNewCharStr = cNew; - pNewCharStr++; - pCharStr++; - nLen--; - - while ( nLen > 0 ) - { - if ( *pCharStr == cOld ) - *pNewCharStr = cNew; - else - *pNewCharStr = *pCharStr; - - pNewCharStr++; - pCharStr++; - nLen--; - } - } - - bChanged = 1; - break; - } - - pCharStr++; - nLen--; - } - - if ( !bChanged ) - { - *ppThis = pStr; - IMPL_RTL_AQUIRE( pStr ); - } - - /* must be done at least, if pStr == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiLowerCase )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr ) -{ - IMPL_RTL_STRINGDATA* pOrg = *ppThis; - int bChanged = 0; - sal_Int32 nLen = pStr->length; - const IMPL_RTL_STRCODE* pCharStr = pStr->buffer; - - while ( nLen > 0 ) - { - /* Between A-Z (65-90), than to lowercase (+32) */ - if ( (*pCharStr >= 65) && (*pCharStr <= 90) ) - { - /* Copy String */ - IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer ); - - /* replace/copy rest of the string */ - if ( pNewCharStr ) - { - /* to lowercase (+32) */ - *pNewCharStr = *pCharStr+32; - pNewCharStr++; - pCharStr++; - nLen--; - - while ( nLen > 0 ) - { - /* Between A-Z (65-90), than to lowercase (+32) */ - if ( (*pCharStr >= 65) && (*pCharStr <= 90) ) - *pNewCharStr = *pCharStr+32; - else - *pNewCharStr = *pCharStr; - - pNewCharStr++; - pCharStr++; - nLen--; - } - } - - bChanged = 1; - break; - } - - pCharStr++; - nLen--; - } - - if ( !bChanged ) - { - *ppThis = pStr; - IMPL_RTL_AQUIRE( pStr ); - } - - /* must be done at least, if pStr == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiUpperCase )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr ) -{ - IMPL_RTL_STRINGDATA* pOrg = *ppThis; - int bChanged = 0; - sal_Int32 nLen = pStr->length; - const IMPL_RTL_STRCODE* pCharStr = pStr->buffer; - - while ( nLen > 0 ) - { - /* Between a-z (97-122), than to uppercase (-32) */ - if ( (*pCharStr >= 97) && (*pCharStr <= 122) ) - { - /* Copy String */ - IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer ); - - /* replace/copy rest of the string */ - if ( pNewCharStr ) - { - /* to uppercase (-32) */ - *pNewCharStr = *pCharStr-32; - pNewCharStr++; - pCharStr++; - nLen--; - - while ( nLen > 0 ) - { - /* Between a-z (97-122), than to uppercase (-32) */ - if ( (*pCharStr >= 97) && (*pCharStr <= 122) ) - *pNewCharStr = *pCharStr-32; - else - *pNewCharStr = *pCharStr; - - pNewCharStr++; - pCharStr++; - nLen--; - } - } - - bChanged = 1; - break; - } - - pCharStr++; - nLen--; - } - - if ( !bChanged ) - { - *ppThis = pStr; - IMPL_RTL_AQUIRE( pStr ); - } - - /* must be done at least, if pStr == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL IMPL_RTL_STRINGNAME( newTrim )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr ) -{ - IMPL_RTL_STRINGDATA* pOrg = *ppThis; - const IMPL_RTL_STRCODE* pCharStr = pStr->buffer; - sal_Int32 nPreSpaces = 0; - sal_Int32 nPostSpaces = 0; - sal_Int32 nLen = pStr->length; - sal_Int32 nIndex = nLen-1; - - while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nPreSpaces)) ) ) - nPreSpaces++; - - while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nIndex)) ) ) - { - nPostSpaces++; - nIndex--; - } - - if ( !nPreSpaces && !nPostSpaces ) - { - *ppThis = pStr; - IMPL_RTL_AQUIRE( pStr ); - } - else - { - nLen -= nPostSpaces+nPreSpaces; - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen ); - OSL_ASSERT(*ppThis != NULL); - if ( *ppThis ) - rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer+nPreSpaces, nLen ); - } - - /* must be done at least, if pStr == *ppThis */ - if ( pOrg ) - IMPL_RTL_STRINGNAME( release )( pOrg ); -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getToken )( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr, - sal_Int32 nToken, - IMPL_RTL_STRCODE cTok, - sal_Int32 nIndex ) -{ - const IMPL_RTL_STRCODE* pCharStr = pStr->buffer; - const IMPL_RTL_STRCODE* pCharStrStart; - const IMPL_RTL_STRCODE* pOrgCharStr; - sal_Int32 nLen = pStr->length-nIndex; - sal_Int32 nTokCount = 0; - - // Set ppThis to an empty string and return -1 if either nToken or nIndex is - // negative: - if (nIndex < 0) { - nToken = -1; - } - - pCharStr += nIndex; - pOrgCharStr = pCharStr; - pCharStrStart = pCharStr; - while ( nLen > 0 ) - { - if ( *pCharStr == cTok ) - { - nTokCount++; - - if ( nTokCount == nToken ) - pCharStrStart = pCharStr+1; - else - { - if ( nTokCount > nToken ) - break; - } - } - - pCharStr++; - nLen--; - } - - if ( (nToken < 0) || (nTokCount < nToken) || (pCharStr == pCharStrStart) ) - { - IMPL_RTL_STRINGNAME( new )( ppThis ); - if( (nToken < 0) || (nTokCount < nToken ) ) - return -1; - else if( nLen > 0 ) - return nIndex+(pCharStr-pOrgCharStr)+1; - else return -1; - } - else - { - IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pCharStrStart, pCharStr-pCharStrStart ); - if ( nLen ) - return nIndex+(pCharStr-pOrgCharStr)+1; - else - return -1; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/surrogates.h b/sal/rtl/source/surrogates.h deleted file mode 100644 index 3defb843c..000000000 --- a/sal/rtl/source/surrogates.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_SAL_RTL_SOURCE_SURROGATES_H -#define INCLUDED_SAL_RTL_SOURCE_SURROGATES_H - -#include "sal/config.h" - -#define SAL_RTL_FIRST_HIGH_SURROGATE 0xD800 -#define SAL_RTL_LAST_HIGH_SURROGATE 0xDBFF -#define SAL_RTL_FIRST_LOW_SURROGATE 0xDC00 -#define SAL_RTL_LAST_LOW_SURROGATE 0xDFFF - -#define SAL_RTL_IS_HIGH_SURROGATE(utf16) \ - ((utf16) >= SAL_RTL_FIRST_HIGH_SURROGATE && \ - (utf16) <= SAL_RTL_LAST_HIGH_SURROGATE) - -#define SAL_RTL_IS_LOW_SURROGATE(utf16) \ - ((utf16) >= SAL_RTL_FIRST_LOW_SURROGATE && \ - (utf16) <= SAL_RTL_LAST_LOW_SURROGATE) - -#define SAL_RTL_COMBINE_SURROGATES(high, low) \ - ((((high) - SAL_RTL_FIRST_HIGH_SURROGATE) << 10) + \ - ((low) - SAL_RTL_FIRST_LOW_SURROGATE) + 0x10000) - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/tres.c b/sal/rtl/source/tres.c deleted file mode 100644 index 2041a00ef..000000000 --- a/sal/rtl/source/tres.c +++ /dev/null @@ -1,688 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <stdio.h> -#include <rtl/tres.h> -#include <osl/diagnose.h> -#include <osl/time.h> - - /* force an assertion on false state */ -#define TST_BOOM(c, m) OSL_ENSURE(c, m) - - -typedef struct _rtl_CmpState -{ - struct _rtl_CmpState* m_next; - struct _rtl_CmpState* m_prev; - - sal_Bool m_stat; - rtl_String* m_msg; - -} rtl_CmpState; - -typedef struct _rtl_FuncState -{ - struct _rtl_FuncState* m_next; - struct _rtl_FuncState* m_prev; - rtl_String* m_name; - sal_uInt32 m_flags; - sal_uInt32 m_start; - sal_uInt32 m_stop; - struct _rtl_CmpState* m_cmp; - -} rtl_FuncState; - - - -typedef struct _rtl_TestResult_Data -{ - rtl_TestResult_vtable* m_funcs; - void* m_externaldata; - - rtl_FuncState* m_state; - -} rtl_TestResult_Data; - - - /** - * internal helper functions - */ - - /* ...to create, link, unlink and destroy allocated memory */ -rtl_FuncState* SAL_CALL rtl_tres_create_funcstate( const sal_Char* meth ); -rtl_FuncState* SAL_CALL rtl_tres_link_funcstate( rtl_FuncState* ptr, - rtl_FuncState* plink ); -rtl_FuncState* SAL_CALL rtl_tres_unlink_funcstate( rtl_FuncState* plink ); -rtl_CmpState* SAL_CALL rtl_tres_create_cmpstate( - sal_Bool state, - const sal_Char* msg - ); -rtl_CmpState* SAL_CALL rtl_tres_link_cmpstate( rtl_CmpState* ptr, - rtl_CmpState* plink ); -rtl_CmpState* SAL_CALL rtl_tres_unlink_cmpstate( rtl_CmpState* plink ); -sal_uInt32 SAL_CALL rtl_tres_timer(); -void SAL_CALL rtl_tres_destroy_funcstate( rtl_FuncState* pState_ ); -void SAL_CALL rtl_tres_destroy_funcstates( rtl_FuncState* pState_ ); -void SAL_CALL rtl_tres_destroy_cmpstates( rtl_CmpState* pState_ ); -void SAL_CALL rtl_tres_destroy_cmpstate( rtl_CmpState* pState_ ); - - - /* set and clear single bits */ -static void SAL_CALL rtl_tres_setbit( rtl_FuncState* pState_, - sal_uInt32 flag ); -static void SAL_CALL rtl_tres_clearbit( rtl_FuncState* pState_, - sal_uInt32 flag ); - - /** - * forward declarations of concrete function implementations overloadable - * and accessible via vtable - */ -static sal_Bool SAL_CALL rtl_tres_state( - rtl_TestResult* pThis_, - sal_Bool state, - const sal_Char* msg, - const sal_Char* sub, - sal_Bool v - ); - -static void SAL_CALL rtl_tres_end( rtl_TestResult* pThis_, - const sal_Char* msg ); - -static rtl_funcstate SAL_CALL rtl_tres_funcstate( rtl_TestResult* pThis_ ); - -static sal_Bool SAL_CALL rtl_tres_ispassed( rtl_TestResult* pThis_ ); -static sal_Bool SAL_CALL rtl_tres_isok( rtl_TestResult* pThis_ ); - -static sal_Bool SAL_CALL rtl_tres_isbit( rtl_TestResult* pThis_, - sal_uInt32 flag ); - -static rtl_funcstate SAL_CALL rtl_tres_getnextfuncstate( rtl_funcstate ); -static rtl_funcstate SAL_CALL rtl_tres_getprevfuncstate( rtl_funcstate ); -static sal_uInt32 SAL_CALL rtl_tres_getflags( rtl_funcstate ); -sal_uInt32 SAL_CALL rtl_tres_getstarttime( rtl_funcstate ); -sal_uInt32 SAL_CALL rtl_tres_getstoptime( rtl_funcstate ); -static rtl_cmpstate SAL_CALL rtl_tres_getcmpstate( rtl_funcstate ); - -static sal_Bool SAL_CALL rtl_tres_getstat( rtl_cmpstate ); -rtl_String* SAL_CALL rtl_tres_getname( rtl_funcstate ); -rtl_String* SAL_CALL rtl_tres_getmsg( rtl_cmpstate ); -static rtl_cmpstate SAL_CALL rtl_tres_getnextcmpstate( rtl_cmpstate ); - - - /** - * initialize vtable with function pointers - */ -static rtl_TestResult_vtable trVTable = -{ - sizeof(rtl_TestResult_vtable), - rtl_tres_state, - rtl_tres_end, - rtl_tres_ispassed, - rtl_tres_isok, - rtl_tres_funcstate, - rtl_tres_isbit, - rtl_tres_getnextfuncstate, - rtl_tres_getprevfuncstate, - rtl_tres_getflags, - rtl_tres_getname, - rtl_tres_getstarttime, - rtl_tres_getstoptime, - rtl_tres_getcmpstate, - rtl_tres_getstat, - rtl_tres_getmsg, - rtl_tres_getnextcmpstate -}; - - /** - * rtl_tres_create - * create and initialize data struct for TestResult - * - * @param const sal_Char* meth = name of the method (entryname) - * @param sal_uInt32 flags = bitmap of comandline and status flags - * - * @return rtl_TestResult* = pointer to a new allocated testresult struct - */ -rtl_TestResult* rtl_tres_create( const sal_Char* meth, sal_uInt32 flags ) -{ - /* allocate memory for testresult data structure */ - rtl_TestResult_Data* pData = (rtl_TestResult_Data*) malloc( sizeof( - rtl_TestResult_Data ) ); - /* initialize members... */ - pData->m_funcs = &trVTable; /* ...vtableptr to vtbladr */ - pData->m_externaldata = 0; /* ...external data pointer */ - - /* allocate memory for state structure and initialize members */ - pData->m_state = rtl_tres_create_funcstate( meth ); - pData->m_state->m_flags = flags; /* ...option Bitmap */ - - /* set OK flag initial */ - rtl_tres_setbit( pData->m_state, rtl_tres_Flag_OK ); - - return (rtl_TestResult*)pData ; -} - -/** - * rtl_tres_create_funcstate - * allocates and initializes a structure to represent the status of a test - * entry or its substates - * - * @param const sal_Char* meth = the name of the method (entry or sub entry) - * - * @return rtl_FuncState* = pointer to a new allocated funcstate struct - */ -rtl_FuncState* SAL_CALL rtl_tres_create_funcstate( const sal_Char* meth ) -{ - rtl_FuncState* pStat = 0; /* status structure */ - - /* allocate memory for status structure */ - pStat = (rtl_FuncState*) malloc( sizeof( struct _rtl_FuncState ) ); - - if ( pStat ) - { - pStat->m_next = pStat; /* init ptr to next struct */ - pStat->m_prev = pStat; /* init ptr to prev struct */ - - pStat->m_name = 0; /* init name */ - pStat->m_flags = 0; /* init flags */ - pStat->m_start = rtl_tres_timer(); /* init start milliseconds */ - pStat->m_stop = 0; /* init stop milliseconds */ - pStat->m_cmp = 0; /* init ptr to msg struct */ - rtl_string_newFromStr( &pStat->m_name, meth );/* copy meth to name */ - - /* set ok flag initially */ - rtl_tres_setbit(pStat, rtl_tres_Flag_OK); - } - - return ( pStat ); -} - /** - * rtl_tres_link_funcstate - * link initialized funcstate structure to a circular double linked list - * - * @param rtl_FuncState* ptr = pointer to a funcstate where to link in new - * @param rtl_FuncState* plink = pointer to a funcstate to link in list - * - * @return rtl_FuncState* = pointer to structure linked in new - */ -rtl_FuncState* SAL_CALL rtl_tres_link_funcstate( rtl_FuncState* ptr, - rtl_FuncState* plink ) -{ - ptr->m_next->m_prev = plink; - ptr->m_next->m_prev->m_next = ptr->m_next; - ptr->m_next->m_prev->m_prev = ptr; - ptr->m_next = plink; - return ( plink ); -} - - /** - * rtl_tres_unlink_funcstate - * unlink funcstate structure from a circular double linked list - * - * @param rtl_FuncState* plink = pointer to a funcstate to unlink from list - * - * @return rtl_FuncState* = pointer to funcstate struct unlinked from - * list - */ -rtl_FuncState* SAL_CALL rtl_tres_unlink_funcstate( rtl_FuncState* plink ) -{ - plink->m_next->m_prev = plink->m_prev; - plink->m_prev->m_next = plink->m_next; - plink->m_next = plink; - plink->m_prev = plink; - return ( plink ); -} - - /** - * rtl_tres_link_cmpstate - * link initialized cmpstate structure to a circular double linked list - * - * @param rtl_CmpState* ptr = pointer to a cmpstate where to link in new - * @param rtl_CmpState* plink = pointer to a cmpstate to link in list - * - * @return rtl_CmpState* = pointer to cmpstate struct linked in new - */ -rtl_CmpState* SAL_CALL rtl_tres_link_cmpstate( rtl_CmpState* ptr, - rtl_CmpState* plink ) -{ - ptr->m_next->m_prev = plink; - ptr->m_next->m_prev->m_next = ptr->m_next; - ptr->m_next->m_prev->m_prev = ptr; - ptr->m_next = plink; - return ( plink ); -} - /** - * rtl_tres_unlink_cmpstate - * unlink cmpstate structure from a circular double linked list - * - * @param rtl_CmpState* plink = pointer to a cmpstate to unlink from list - * - * @return rtl_CmpState* = pointer to cmpstate struct unlinked from list - */ -rtl_CmpState* SAL_CALL rtl_tres_unlink_cmpstate( rtl_CmpState* plink ) -{ - plink->m_next->m_prev = plink->m_prev; - plink->m_prev->m_next = plink->m_next; - plink->m_next = plink; - plink->m_prev = plink; - return ( plink ); -} - - /** - * rtl_tres_create_cmpstate - * allocates and initializes a structure to represent the status of a test - * comparison - * - * @param sal_Bool state = compare state - * @param sal_Char* msg = message for logging and debug purposes - * - * @return rtl_CmpState* = pointer to the new allocated struct - */ -rtl_CmpState* SAL_CALL rtl_tres_create_cmpstate( - sal_Bool state, - const sal_Char* msg - ) -{ - /* allocate memory for cmpstate struct */ - rtl_CmpState* pStat = (rtl_CmpState*) malloc( sizeof( rtl_CmpState ) ); - - /* initialize if memory could be allocated */ - if ( pStat ) - { - pStat->m_next = pStat; /* init next with this */ - pStat->m_prev = pStat; /* init prev with this */ - pStat->m_msg = 0; - pStat->m_stat = state; /* boolean state */ - rtl_string_newFromStr( &pStat->m_msg, msg ); /* copy message */ - } - return ( pStat ); -} - - /** - * rtl_tres_destroy - * free allocated memory of testresult data struct - * - * @param rtl_TestResult* pThis_ = ponter to a valid testresult struct - */ -void SAL_CALL rtl_tres_destroy( rtl_TestResult* pThis_ ) -{ - /* cast to implementation representation structure */ - rtl_TestResult_Data* pData = (rtl_TestResult_Data*) pThis_; - - /* destroy all funcstates */ - if ( pData->m_state ) - rtl_tres_destroy_funcstates( pData->m_state ); - - /* free allocted memory and reinitialize to zero */ - /* to be able to prevent dangling pointer access*/ - free( pData ); pData = 0; -} - - /** - * rtl_tres_destroy_funcstates - * free allocated memory occupied by the list of funcstate data structs - * (iterates through next pointers) - * - * @param rtl_FuncState* pState_ = pointer to a valid funcstate struct - */ -void SAL_CALL rtl_tres_destroy_funcstates( rtl_FuncState* pState_ ) -{ - rtl_FuncState* plink = pState_->m_next; - while ( plink != plink->m_next ) - { - rtl_tres_destroy_funcstate( rtl_tres_unlink_funcstate( plink ) ); - plink = pState_->m_next; - } - rtl_tres_destroy_funcstate( plink ); -} - - /** - * rtl_tres_destroy_cmpstates - * free allocated memory occupied by the list of cmpstate data structs - * (iterates through next pointers) - * - * @param rtl_CmpState* pState_ = pointer to a valid cmpstate struct - */ -void SAL_CALL rtl_tres_destroy_cmpstates( rtl_CmpState* pState_ ) -{ - rtl_CmpState* plink = pState_->m_next; - while ( plink != plink->m_next ) - { - rtl_tres_destroy_cmpstate( rtl_tres_unlink_cmpstate( plink ) ); - plink = pState_->m_next; - } - rtl_tres_destroy_cmpstate( plink ); -} - - - /** - * rtl_tres_destroy_funcstate - * free allocated memory occupied by one funcstate and it's list - * of cmpstate data structs - * - * @param rtl_FuncState* pState_ = pointer to a valid funcstate struct - */ -void SAL_CALL rtl_tres_destroy_funcstate( rtl_FuncState* pState_ ) -{ - rtl_FuncState* plink = pState_; - - if ( plink->m_cmp ) - rtl_tres_destroy_cmpstates( plink->m_cmp ); - - if ( plink->m_name ) - { - rtl_string_release( plink->m_name ); - plink->m_name = 0; - } - plink->m_flags = 0; - free( plink ); - plink = 0; -} - - /** - * rtl_tres_destroy_cmpstate - * free allocated memory of a cmpstate data struct - * - * @param rtl_CmpState* pState_ = pointer to cmpstate struct to destroy - */ -void SAL_CALL rtl_tres_destroy_cmpstate( rtl_CmpState* pState_ ) -{ - - rtl_CmpState* plink = pState_; - - if ( plink->m_msg ) - { - rtl_string_release( plink->m_msg ); - plink->m_msg = 0; - } - free( plink ); - plink = 0; -} - /** - * central function to call in tests - * - * @param rtl_TestResult* pThis_ = self pointer to TestResult structure - * @param sal_Bool state = boolean result of statement comparison - * @param const sal_Char* msg = message for actual statementcomparison - * @param const sal_Char* sub = name of sub testfunction - * @param sal_Bool v = boolean verbose parameter - * - * @return sal_Bool = determines if statement comparison - * was positive or not - */ -static sal_Bool SAL_CALL rtl_tres_state( - rtl_TestResult* pThis_, - sal_Bool state, - const sal_Char* msg, - const sal_Char* sub, - sal_Bool v - ) -{ - - /* cast pointer to testresult data implementation struct*/ - rtl_TestResult_Data* pData = (rtl_TestResult_Data*)pThis_; - - /* initialize funcstate pointer with masterstate */ - rtl_FuncState* pFunc = pData->m_state; - - /* if substate required */ - if ( sub ) - { - /* link new created function state to last item */ - pFunc = rtl_tres_link_funcstate( pFunc->m_prev, - rtl_tres_create_funcstate( sub ) ); - - /* indicate this state as substate */ - rtl_tres_setbit( pFunc, rtl_tres_Flag_SUB ); - - /* indicate prvious state as passed if no masterstate */ - if ( pFunc->m_prev != pData->m_state ) - rtl_tres_setbit( pFunc->m_prev, rtl_tres_Flag_PASSED ); - } - - - /* test failed */ - if( ! state ) - { - /* determine if assertion should be thrown */ - if ( rtl_tres_isbit( pThis_, rtl_tres_Flag_BOOM ) ) - { - /* if message available */ - if ( msg ) - TST_BOOM( state, msg ); - else - TST_BOOM( state, "no msg available" ); - } - - /* clear this state ok flag and masterstate ok flag */ - rtl_tres_clearbit( pFunc, rtl_tres_Flag_OK ); - rtl_tres_clearbit( pData->m_state, rtl_tres_Flag_OK ); - } - /* message available */ - if( msg ) - { - /* append a new comparison state */ - if (! pFunc->m_cmp ) - pFunc->m_cmp = rtl_tres_create_cmpstate( state, msg ); - else - rtl_tres_link_cmpstate( pFunc->m_cmp, - rtl_tres_create_cmpstate(state, msg ) ); - - /* message to stderr required ? */ - if ( v || ( pFunc->m_next->m_flags & rtl_tres_Flag_VERBOSE ) ) - fprintf( stderr, "%s\n", msg ); - } - - pFunc->m_stop = rtl_tres_timer(); - return ( state ); -} - - /** - * rtl_tres_timer - * function to get actual timevalue - * this has to be replaced by a high resolution timer - */ -sal_uInt32 SAL_CALL rtl_tres_timer() -{ - sal_uInt32 val = 0; - TimeValue* tmv = (TimeValue*)malloc( sizeof( TimeValue ) ); - osl_getSystemTime( tmv ); - val = tmv->Nanosec/1000L; - free( tmv ); - return ( val ); -} - - -static void SAL_CALL rtl_tres_end( rtl_TestResult* pThis_, - const sal_Char* msg ) -{ - rtl_TestResult_Data* pData = (rtl_TestResult_Data*) pThis_; - - if( msg ) - { - if (! pData->m_state->m_cmp ) - pData->m_state->m_cmp = rtl_tres_create_cmpstate( sal_True, msg ); - else - rtl_tres_link_cmpstate( pData->m_state->m_cmp, - rtl_tres_create_cmpstate( sal_True, msg ) ); - } - pData->m_state->m_prev->m_flags |= rtl_tres_Flag_PASSED; - pData->m_state->m_flags |= rtl_tres_Flag_PASSED; - pData->m_state->m_stop = rtl_tres_timer(); -} - - -static sal_Bool SAL_CALL rtl_tres_ispassed( rtl_TestResult* pThis_ ) -{ - return rtl_tres_isbit( pThis_, rtl_tres_Flag_PASSED ); -} - -static sal_Bool SAL_CALL rtl_tres_isok( rtl_TestResult* pThis_ ) -{ - return rtl_tres_isbit( pThis_, rtl_tres_Flag_OK ); -} - /** - * return pointer to funcstate structure - */ -static rtl_funcstate SAL_CALL rtl_tres_funcstate( rtl_TestResult* pThis_ ) -{ - - rtl_TestResult_Data* pThis = (rtl_TestResult_Data*) pThis_; - return (rtl_funcstate)pThis->m_state; -} - - /** - * determine if a flag is set or not - */ -static sal_Bool SAL_CALL rtl_tres_isbit( rtl_TestResult* pThis_, - sal_uInt32 flag ) -{ - return (sal_Bool) - ((((rtl_TestResult_Data *) pThis_)->m_state->m_flags & flag) == flag); -} - /** - * set one single bit - */ -static void SAL_CALL rtl_tres_setbit( rtl_FuncState* pState_, - sal_uInt32 flag ) -{ - pState_->m_flags |= flag; -} - /** - * clear one single bit - */ -static void SAL_CALL rtl_tres_clearbit( rtl_FuncState* pState_, - sal_uInt32 flag ) -{ - pState_->m_flags = pState_->m_flags & ( ~flag ); -} - - /** - * returns next pointer of passed funcstate structure - */ -rtl_funcstate SAL_CALL rtl_tres_getnextfuncstate( rtl_funcstate fstate ) -{ - rtl_FuncState* fs = (rtl_FuncState*)fstate; - return( (rtl_funcstate)fs->m_next ); - -} - /** - * returns previous pointer of passed funcstate structure - */ -rtl_funcstate SAL_CALL rtl_tres_getprevfuncstate( rtl_funcstate fstate ) -{ - rtl_FuncState* fs = (rtl_FuncState*)fstate; - return( (rtl_funcstate)fs->m_prev ); - -} - /** - * returns flag value of passed funcstate structure - */ -sal_uInt32 SAL_CALL rtl_tres_getflags( rtl_funcstate fstate ) -{ - rtl_FuncState* fs = (rtl_FuncState*)fstate; - return( fs->m_flags ); -} - /** - * returns name of passed funcstate structure - */ -rtl_String* SAL_CALL rtl_tres_getname( rtl_funcstate fstate ) -{ - rtl_FuncState* fs = (rtl_FuncState*)fstate; - return( fs->m_name ); -} - /** - * returns starttime of passed funcstate structure - */ -sal_uInt32 SAL_CALL rtl_tres_getstarttime( rtl_funcstate fstate ) -{ - rtl_FuncState* fs = (rtl_FuncState*)fstate; - return( fs->m_start ); -} - - /** - * returns stoptime of passed funcstate structure - */ -sal_uInt32 SAL_CALL rtl_tres_getstoptime( rtl_funcstate fstate ) -{ - rtl_FuncState* fs = (rtl_FuncState*)fstate; - return( fs->m_stop ); -} - - /** - * returns pointer to cmpstate of passed funcstate structure - */ -rtl_cmpstate SAL_CALL rtl_tres_getcmpstate( rtl_funcstate fstate) -{ - rtl_FuncState* fs = (rtl_FuncState*)fstate; - return( (rtl_cmpstate)fs->m_cmp ); - -} - /** - * returns boolean state of passed cmpstate structure - */ -sal_Bool SAL_CALL rtl_tres_getstat( rtl_cmpstate cstate) -{ - rtl_CmpState* cs = (rtl_CmpState*)cstate; - return( cs->m_stat ); -} - /** - * returns message of passed cmpstate structure - */ -rtl_String* SAL_CALL rtl_tres_getmsg( rtl_cmpstate cstate) -{ - rtl_CmpState* cs = (rtl_CmpState*)cstate; - return( cs->m_msg ); -} - /** - * returns next pointer of passed cmpstate structure - */ -rtl_cmpstate SAL_CALL rtl_tres_getnextcmpstate( rtl_cmpstate cstate) -{ - rtl_CmpState* cs = (rtl_CmpState*)cstate; - return( (rtl_cmpstate)cs->m_next ); -} - -/* -// <method_logPrintf> -//inline void logPrintf ( const sal_Bool bTestCaseState, -// const char *pFormatStr, ... -// ) -//{ -// if( m_pFunctions && m_pFunctions->pLogPrintf ) -// { -// va_list vArgumentList; -// va_start ( vArgumentList, pFormatStr ); - -// m_pFunctions->pLogPrintf( this, bTestCaseState, pFormatStr, vArgumentList ); - -// va_end ( vArgumentList ); -// } -//} // </method_logPrintf> - */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/unload.cxx b/sal/rtl/source/unload.cxx deleted file mode 100644 index 8785baf50..000000000 --- a/sal/rtl/source/unload.cxx +++ /dev/null @@ -1,416 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" -#include <rtl/unload.h> -#include <rtl/alloc.h> -#include <rtl/ustring.hxx> -#include <rtl/instance.hxx> -#include <osl/mutex.hxx> -#include <boost/unordered_map.hpp> -#include "rtl/allocator.hxx" - -#include <functional> -#include <list> -#include <deque> - -using osl::MutexGuard; - -//---------------------------------------------------------------------------- - -static void rtl_notifyUnloadingListeners(); - -static sal_Bool isEqualTimeValue ( const TimeValue* time1, const TimeValue* time2) -{ - if( time1->Seconds == time2->Seconds && - time1->Nanosec == time2->Nanosec) - return sal_True; - else - return sal_False; -} - -static sal_Bool isGreaterTimeValue( const TimeValue* time1, const TimeValue* time2) -{ - sal_Bool retval= sal_False; - if ( time1->Seconds > time2->Seconds) - retval= sal_True; - else if ( time1->Seconds == time2->Seconds) - { - if( time1->Nanosec > time2->Nanosec) - retval= sal_True; - } - return retval; -} - -static sal_Bool isGreaterEqualTimeValue( const TimeValue* time1, const TimeValue* time2) -{ - if( isEqualTimeValue( time1, time2) ) - return sal_True; - else if( isGreaterTimeValue( time1, time2)) - return sal_True; - else - return sal_False; -} - -static void addTimeValue( const TimeValue* value1, const TimeValue* value2, TimeValue* result) -{ - sal_uInt64 sum; - result->Nanosec=0; - result->Seconds=0; - - sum= value1->Nanosec + value2->Nanosec; - if( sum >= 1000000000 ) - { - result->Seconds=1; - sum -= 1000000000; - } - result->Nanosec= (sal_uInt32)sum; - result->Seconds += value1->Seconds + value2->Seconds; -} - - -static sal_Bool hasEnoughTimePassed( const TimeValue* unusedSince, const TimeValue* timespan) -{ - sal_Bool retval= sal_False; - TimeValue currentTime; - if( osl_getSystemTime( ¤tTime)) - { - TimeValue addedTime; - addTimeValue( unusedSince, timespan, &addedTime); - if( isGreaterEqualTimeValue( ¤tTime, &addedTime)) - retval= sal_True; - } - - return retval; -} - -namespace -{ - class theUnloadingMutex : public rtl::Static<osl::Mutex, theUnloadingMutex>{}; -} - -static osl::Mutex& getUnloadingMutex() -{ - return theUnloadingMutex::get(); -} - -extern "C" void rtl_moduleCount_acquire(rtl_ModuleCount * that ) -{ - rtl_StandardModuleCount* pMod= (rtl_StandardModuleCount*)that; - osl_incrementInterlockedCount( &pMod->counter); -} - -extern "C" void rtl_moduleCount_release( rtl_ModuleCount * that ) -{ - rtl_StandardModuleCount* pMod= (rtl_StandardModuleCount*)that; - OSL_ENSURE( pMod->counter >0 , "library counter incorrect" ); - osl_decrementInterlockedCount( &pMod->counter); - if( pMod->counter == 0) - { - MutexGuard guard( getUnloadingMutex()); - - if( sal_False == osl_getSystemTime( &pMod->unusedSince) ) - { - // set the time to 0 if we could not get the time - pMod->unusedSince.Seconds= 0; - pMod->unusedSince.Nanosec= 0; - } - } -} - - -struct hashModule -{ - size_t operator()( const oslModule& rkey) const - { - return (size_t)rkey; - } -}; - -typedef boost::unordered_map< - oslModule, - std::pair<sal_uInt32, component_canUnloadFunc>, - hashModule, - std::equal_to<oslModule>, - rtl::Allocator<oslModule> -> ModuleMap; - -typedef ModuleMap::iterator Mod_IT; - -static ModuleMap& getModuleMap() -{ - static ModuleMap * g_pMap= NULL; - if (!g_pMap) - { - MutexGuard guard( getUnloadingMutex() ); - if (!g_pMap) - { - static ModuleMap g_aModuleMap; - g_pMap= &g_aModuleMap; - } - } - return *g_pMap; -} - -extern "C" sal_Bool rtl_moduleCount_canUnload( rtl_StandardModuleCount * that, TimeValue * libUnused) -{ - if (that->counter == 0) - { - MutexGuard guard( getUnloadingMutex()); - if (libUnused && (that->counter == 0)) - { - rtl_copyMemory(libUnused, &that->unusedSince, sizeof(TimeValue)); - } - } - return (that->counter == 0); -} - - -extern "C" sal_Bool SAL_CALL rtl_registerModuleForUnloading( oslModule module) -{ - MutexGuard guard( getUnloadingMutex()); - ModuleMap& moduleMap= getModuleMap(); - sal_Bool ret= sal_True; - - // If the module has been registered before, then find it and increment - // its reference cout - Mod_IT it= moduleMap.find( module); - if( it != moduleMap.end()) - { - //module already registered, increment ref count - it->second.first++; - } - else - { - // Test if the module supports unloading (exports component_canUnload) - rtl::OUString name(RTL_CONSTASCII_USTRINGPARAM( COMPONENT_CANUNLOAD)); - component_canUnloadFunc pFunc= - (component_canUnloadFunc)osl_getFunctionSymbol( module, name.pData); - if (pFunc) - { - //register module for the first time, set ref count to 1 - moduleMap[module]= std::make_pair((sal_uInt32)1, pFunc); - } - else - ret= sal_False; - } - return ret; -} - -extern "C" void SAL_CALL rtl_unregisterModuleForUnloading( oslModule module) -{ - MutexGuard guard( getUnloadingMutex()); - - ModuleMap& moduleMap= getModuleMap(); - Mod_IT it= moduleMap.find( module); - if( it != moduleMap.end() ) - { - // The module is registered, decrement ref count. - it->second.first --; - - // If the refcount == 0 then remove the module from the map - if( it->second.first == 0) - moduleMap.erase( it); - } -} - -extern "C" void SAL_CALL rtl_unloadUnusedModules( TimeValue* libUnused) -{ - MutexGuard guard( getUnloadingMutex()); - - typedef std::list< oslModule, rtl::Allocator<oslModule> > list_type; - list_type unloadedModulesList; - - ModuleMap& moduleMap= getModuleMap(); - Mod_IT it_e= moduleMap.end(); - - // notify all listeners - rtl_notifyUnloadingListeners(); - - // prepare default TimeValue if argumetn is NULL - TimeValue nullTime={0,0}; - TimeValue* pLibUnused= libUnused? libUnused : &nullTime; - - Mod_IT it= moduleMap.begin(); - for (; it != it_e; ++it) - { - //can the module be unloaded? - component_canUnloadFunc func= it->second.second; - TimeValue unusedSince= {0, 0}; - - if( func( &unusedSince) ) - { - // module can be unloaded if it has not been used at least for the time - // specified by the argument libUnused - if( hasEnoughTimePassed( &unusedSince, pLibUnused)) - { - // get the reference count and unload the module as many times - sal_uInt32 refCount= it->second.first; - - for ( sal_uInt32 i=0; i < refCount; i++) - osl_unloadModule( it->first); - - // mark the module for later removal - unloadedModulesList.push_front( it->first); - } - } - } - - // remove all entries containing invalid (unloaded) modules - list_type::const_iterator un_it= unloadedModulesList.begin(); - for (; un_it != unloadedModulesList.end(); ++un_it) - { - moduleMap.erase( *un_it); - } -} - - -// ============================================================================== -// Unloading Listener Administration -//=============================================================================== -struct hashListener -{ - size_t operator()( const sal_Int32& rkey) const - { - return (size_t)rkey; - } -}; - -typedef boost::unordered_map< - sal_Int32, - std::pair<rtl_unloadingListenerFunc, void*>, - hashListener, - std::equal_to<sal_Int32>, - rtl::Allocator<sal_Int32> -> ListenerMap; - -typedef ListenerMap::iterator Lis_IT; - -static ListenerMap& getListenerMap() -{ - static ListenerMap * g_pListeners= NULL; - if (!g_pListeners) - { - MutexGuard guard( getUnloadingMutex() ); - if (!g_pListeners) - { - static ListenerMap g_aListenerMap; - g_pListeners= &g_aListenerMap; - } - } - return *g_pListeners; -} - - -// This queue contains cookies which have been passed out by rtl_addUnloadingListener and -// which have been regainded by rtl_removeUnloadingListener. When rtl_addUnloadingListener -// is called then a cookie has to be returned. First we look into the set if there is one -// availabe. Otherwise a new cookie will be provided. -// not a new value is returned. - -typedef std::deque< - sal_Int32, - rtl::Allocator<sal_Int32> -> queue_type; - -static queue_type& getCookieQueue() -{ - static queue_type * g_pCookies= NULL; - if (!g_pCookies) - { - MutexGuard guard( getUnloadingMutex() ); - if (!g_pCookies) - { - static queue_type g_aCookieQueue; - g_pCookies= &g_aCookieQueue; - } - } - return *g_pCookies; -} - -static sal_Int32 getCookie() -{ - static sal_Int32 cookieValue= 1; - - sal_Int32 retval; - queue_type& regainedCookies= getCookieQueue(); - if( regainedCookies.empty() ) - retval= cookieValue++; - else - { - retval= regainedCookies.front(); - regainedCookies.pop_front(); - } - return retval; -} - -static inline void recycleCookie( sal_Int32 i) -{ - getCookieQueue().push_back(i); -} - - -// calling the function twice with the same arguments will return tow different cookies. -// The listener will then notified twice. - -extern "C" -sal_Int32 SAL_CALL rtl_addUnloadingListener( rtl_unloadingListenerFunc callback, void* _this) -{ - MutexGuard guard( getUnloadingMutex()); - - sal_Int32 cookie= getCookie(); - ListenerMap& listenerMap= getListenerMap(); - listenerMap[ cookie]= std::make_pair( callback, _this); - return cookie; -} - - -extern "C" -void SAL_CALL rtl_removeUnloadingListener( sal_Int32 cookie ) -{ - MutexGuard guard( getUnloadingMutex()); - - ListenerMap& listenerMap= getListenerMap(); - size_t removedElements= listenerMap.erase( cookie); - if( removedElements ) - recycleCookie( cookie); -} - - -static void rtl_notifyUnloadingListeners() -{ - ListenerMap& listenerMap= getListenerMap(); - for( Lis_IT it= listenerMap.begin(); it != listenerMap.end(); ++it) - { - rtl_unloadingListenerFunc callbackFunc= it->second.first; - callbackFunc( it->second.second); - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/uri.cxx b/sal/rtl/source/uri.cxx deleted file mode 100644 index b27f93e39..000000000 --- a/sal/rtl/source/uri.cxx +++ /dev/null @@ -1,803 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include "rtl/uri.h" - -#include "surrogates.h" - -#include "osl/diagnose.h" -#include "rtl/strbuf.hxx" -#include "rtl/textenc.h" -#include "rtl/textcvt.h" -#include "rtl/uri.h" -#include "rtl/ustrbuf.h" -#include "rtl/ustrbuf.hxx" -#include "rtl/ustring.h" -#include "rtl/ustring.hxx" -#include "sal/types.h" -#include "sal/macros.h" - -#include <cstddef> - -namespace { - -std::size_t const nCharClassSize = 128; - -sal_Unicode const cEscapePrefix = 0x25; // '%' - -inline bool isDigit(sal_uInt32 nUtf32) -{ - return nUtf32 >= 0x30 && nUtf32 <= 0x39; // '0'--'9' -} - -inline bool isAlpha(sal_uInt32 nUtf32) -{ - // 'A'--'Z', 'a'--'z' - return ( - (nUtf32 >= 0x41 && nUtf32 <= 0x5A) || - (nUtf32 >= 0x61 && nUtf32 <= 0x7A) - ); -} - -inline bool isHighSurrogate(sal_uInt32 nUtf16) -{ - return SAL_RTL_IS_HIGH_SURROGATE(nUtf16); -} - -inline bool isLowSurrogate(sal_uInt32 nUtf16) -{ - return SAL_RTL_IS_LOW_SURROGATE(nUtf16); -} - -inline sal_uInt32 combineSurrogates(sal_uInt32 high, sal_uInt32 low) -{ - return SAL_RTL_COMBINE_SURROGATES(high, low); -} - -inline int getHexWeight(sal_uInt32 nUtf32) -{ - return nUtf32 >= 0x30 && nUtf32 <= 0x39 ? // '0'--'9' - static_cast< int >(nUtf32 - 0x30) : - nUtf32 >= 0x41 && nUtf32 <= 0x46 ? // 'A'--'F' - static_cast< int >(nUtf32 - 0x41 + 10) : - nUtf32 >= 0x61 && nUtf32 <= 0x66 ? // 'a'--'f' - static_cast< int >(nUtf32 - 0x61 + 10) : - -1; // not a hex digit -} - -inline bool isValid(sal_Bool const * pCharClass, sal_uInt32 nUtf32) -{ - return nUtf32 < nCharClassSize && pCharClass[nUtf32]; -} - -inline void writeUnicode(rtl_uString ** pBuffer, sal_Int32 * pCapacity, - sal_Unicode cChar) -{ - rtl_uStringbuffer_insert(pBuffer, pCapacity, (*pBuffer)->length, &cChar, 1); -} - -enum EscapeType -{ - EscapeNo, - EscapeChar, - EscapeOctet -}; - -/* Read any of the following: - - - sequence of escape sequences representing character from eCharset, - translated to single UCS4 character; or - - - pair of UTF-16 surrogates, translated to single UCS4 character; or - - _ single UTF-16 character, extended to UCS4 character. - */ -sal_uInt32 readUcs4(sal_Unicode const ** pBegin, sal_Unicode const * pEnd, - bool bEncoded, rtl_TextEncoding eCharset, - EscapeType * pType) -{ - sal_uInt32 nChar = *(*pBegin)++; - int nWeight1; - int nWeight2; - if (nChar == cEscapePrefix && bEncoded && pEnd - *pBegin >= 2 - && (nWeight1 = getHexWeight((*pBegin)[0])) >= 0 - && (nWeight2 = getHexWeight((*pBegin)[1])) >= 0) - { - *pBegin += 2; - nChar = static_cast< sal_uInt32 >(nWeight1 << 4 | nWeight2); - if (nChar <= 0x7F) - *pType = EscapeChar; - else if (eCharset == RTL_TEXTENCODING_UTF8) - { - if (nChar >= 0xC0 && nChar <= 0xF4) - { - sal_uInt32 nEncoded; - int nShift; - sal_uInt32 nMin; - if (nChar <= 0xDF) - { - nEncoded = (nChar & 0x1F) << 6; - nShift = 0; - nMin = 0x80; - } - else if (nChar <= 0xEF) - { - nEncoded = (nChar & 0x0F) << 12; - nShift = 6; - nMin = 0x800; - } - else - { - nEncoded = (nChar & 0x07) << 18; - nShift = 12; - nMin = 0x10000; - } - sal_Unicode const * p = *pBegin; - bool bUTF8 = true; - for (; nShift >= 0; nShift -= 6) - { - if (pEnd - p < 3 || p[0] != cEscapePrefix - || (nWeight1 = getHexWeight(p[1])) < 8 - || nWeight1 > 11 - || (nWeight2 = getHexWeight(p[2])) < 0) - { - bUTF8 = sal_False; - break; - } - p += 3; - nEncoded |= ((nWeight1 & 3) << 4 | nWeight2) << nShift; - } - if (bUTF8 && nEncoded >= nMin && !isHighSurrogate(nEncoded) - && !isLowSurrogate(nEncoded) && nEncoded <= 0x10FFFF) - { - *pBegin = p; - *pType = EscapeChar; - return nEncoded; - } - } - *pType = EscapeOctet; - } - else - { - rtl::OStringBuffer aBuf; - aBuf.append(static_cast< char >(nChar)); - rtl_TextToUnicodeConverter aConverter - = rtl_createTextToUnicodeConverter(eCharset); - sal_Unicode const * p = *pBegin; - for (;;) - { - sal_Unicode aDst[2]; - sal_uInt32 nInfo; - sal_Size nConverted; - sal_Size nDstSize = rtl_convertTextToUnicode( - aConverter, 0, aBuf.getStr(), aBuf.getLength(), aDst, - SAL_N_ELEMENTS( aDst ), - (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR - | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR - | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR), - &nInfo, &nConverted); - if (nInfo == 0) - { - OSL_ASSERT( - nConverted - == sal::static_int_cast< sal_uInt32 >( - aBuf.getLength())); - rtl_destroyTextToUnicodeConverter(aConverter); - *pBegin = p; - *pType = EscapeChar; - OSL_ASSERT( - nDstSize == 1 - || (nDstSize == 2 && isHighSurrogate(aDst[0]) - && isLowSurrogate(aDst[1]))); - return nDstSize == 1 - ? aDst[0] : combineSurrogates(aDst[0], aDst[1]); - } - else if (nInfo == RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL - && pEnd - p >= 3 && p[0] == cEscapePrefix - && (nWeight1 = getHexWeight(p[1])) >= 0 - && (nWeight2 = getHexWeight(p[2])) >= 0) - { - p += 3; - aBuf.append(static_cast< char >(nWeight1 << 4 | nWeight2)); - } - else if (nInfo == RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL - && p != pEnd && *p <= 0x7F) - { - aBuf.append(static_cast< char >(*p++)); - } - else - { - OSL_ASSERT( - (nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL) - == 0); - break; - } - } - rtl_destroyTextToUnicodeConverter(aConverter); - *pType = EscapeOctet; - } - return nChar; - } - else - { - *pType = EscapeNo; - return isHighSurrogate(nChar) && *pBegin < pEnd - && isLowSurrogate(**pBegin) ? - combineSurrogates(nChar, *(*pBegin)++) : nChar; - } -} - -void writeUcs4(rtl_uString ** pBuffer, sal_Int32 * pCapacity, sal_uInt32 nUtf32) -{ - OSL_ENSURE(nUtf32 <= 0x10FFFF, "bad UTF-32 char"); - if (nUtf32 <= 0xFFFF) { - writeUnicode( - pBuffer, pCapacity, static_cast< sal_Unicode >(nUtf32)); - } else { - nUtf32 -= 0x10000; - writeUnicode( - pBuffer, pCapacity, - static_cast< sal_Unicode >(nUtf32 >> 10 | 0xD800)); - writeUnicode( - pBuffer, pCapacity, - static_cast< sal_Unicode >((nUtf32 & 0x3FF) | 0xDC00)); - } -} - -void writeEscapeOctet(rtl_uString ** pBuffer, sal_Int32 * pCapacity, - sal_uInt32 nOctet) -{ - OSL_ENSURE(nOctet <= 0xFF, "bad octet"); - - static sal_Unicode const aHex[16] - = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }; /* '0'--'9', 'A'--'F' */ - - writeUnicode(pBuffer, pCapacity, cEscapePrefix); - writeUnicode(pBuffer, pCapacity, aHex[nOctet >> 4]); - writeUnicode(pBuffer, pCapacity, aHex[nOctet & 15]); -} - -bool writeEscapeChar(rtl_uString ** pBuffer, sal_Int32 * pCapacity, - sal_uInt32 nUtf32, rtl_TextEncoding eCharset, bool bStrict) -{ - OSL_ENSURE(nUtf32 <= 0x10FFFF, "bad UTF-32 char"); - if (eCharset == RTL_TEXTENCODING_UTF8) { - if (nUtf32 < 0x80) - writeEscapeOctet(pBuffer, pCapacity, nUtf32); - else if (nUtf32 < 0x800) - { - writeEscapeOctet(pBuffer, pCapacity, nUtf32 >> 6 | 0xC0); - writeEscapeOctet(pBuffer, pCapacity, (nUtf32 & 0x3F) | 0x80); - } - else if (nUtf32 < 0x10000) - { - writeEscapeOctet(pBuffer, pCapacity, nUtf32 >> 12 | 0xE0); - writeEscapeOctet(pBuffer, pCapacity, (nUtf32 >> 6 & 0x3F) | 0x80); - writeEscapeOctet(pBuffer, pCapacity, (nUtf32 & 0x3F) | 0x80); - } - else - { - writeEscapeOctet(pBuffer, pCapacity, nUtf32 >> 18 | 0xF0); - writeEscapeOctet(pBuffer, pCapacity, (nUtf32 >> 12 & 0x3F) | 0x80); - writeEscapeOctet(pBuffer, pCapacity, (nUtf32 >> 6 & 0x3F) | 0x80); - writeEscapeOctet(pBuffer, pCapacity, (nUtf32 & 0x3F) | 0x80); - } - } else { - rtl_UnicodeToTextConverter aConverter - = rtl_createUnicodeToTextConverter(eCharset); - sal_Unicode aSrc[2]; - sal_Size nSrcSize; - if (nUtf32 <= 0xFFFF) - { - aSrc[0] = static_cast< sal_Unicode >(nUtf32); - nSrcSize = 1; - } - else - { - aSrc[0] = static_cast< sal_Unicode >( - ((nUtf32 - 0x10000) >> 10) | 0xD800); - aSrc[1] = static_cast< sal_Unicode >( - ((nUtf32 - 0x10000) & 0x3FF) | 0xDC00); - nSrcSize = 2; - } - sal_Char aDst[32]; // FIXME random value - sal_uInt32 nInfo; - sal_Size nConverted; - sal_Size nDstSize = rtl_convertUnicodeToText( - aConverter, 0, aSrc, nSrcSize, aDst, sizeof aDst, - RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR - | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR - | RTL_UNICODETOTEXT_FLAGS_FLUSH, - &nInfo, &nConverted); - OSL_ASSERT((nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL) == 0); - rtl_destroyUnicodeToTextConverter(aConverter); - if (nInfo == 0) { - OSL_ENSURE(nConverted == nSrcSize, "bad rtl_convertUnicodeToText"); - for (sal_Size i = 0; i < nDstSize; ++i) - writeEscapeOctet(pBuffer, pCapacity, - static_cast< unsigned char >(aDst[i])); - // FIXME all octets are escaped, even if there is no need - } else { - if (bStrict) { - return false; - } else { - writeUcs4(pBuffer, pCapacity, nUtf32); - } - } - } - return true; -} - -struct Component -{ - sal_Unicode const * pBegin; - sal_Unicode const * pEnd; - - inline Component(): pBegin(0), pEnd(0) {} - - inline bool isPresent() const { return pBegin != 0; } - - inline sal_Int32 getLength() const; -}; - -inline sal_Int32 Component::getLength() const -{ - OSL_ENSURE(isPresent(), "taking length of non-present component"); - return static_cast< sal_Int32 >(pEnd - pBegin); -} - -struct Components -{ - Component aScheme; - Component aAuthority; - Component aPath; - Component aQuery; - Component aFragment; -}; - -void parseUriRef(rtl_uString const * pUriRef, Components * pComponents) -{ - // This algorithm is liberal and accepts various forms of illegal input. - - sal_Unicode const * pBegin = pUriRef->buffer; - sal_Unicode const * pEnd = pBegin + pUriRef->length; - sal_Unicode const * pPos = pBegin; - - if (pPos != pEnd && isAlpha(*pPos)) - for (sal_Unicode const * p = pPos + 1; p != pEnd; ++p) - if (*p == ':') - { - pComponents->aScheme.pBegin = pBegin; - pComponents->aScheme.pEnd = ++p; - pPos = p; - break; - } - else if (!isAlpha(*p) && !isDigit(*p) && *p != '+' && *p != '-' - && *p != '.') - break; - - if (pEnd - pPos >= 2 && pPos[0] == '/' && pPos[1] == '/') - { - pComponents->aAuthority.pBegin = pPos; - pPos += 2; - while (pPos != pEnd && *pPos != '/' && *pPos != '?' && *pPos != '#') - ++pPos; - pComponents->aAuthority.pEnd = pPos; - } - - pComponents->aPath.pBegin = pPos; - while (pPos != pEnd && *pPos != '?' && * pPos != '#') - ++pPos; - pComponents->aPath.pEnd = pPos; - - if (pPos != pEnd && *pPos == '?') - { - pComponents->aQuery.pBegin = pPos++; - while (pPos != pEnd && * pPos != '#') - ++pPos; - pComponents->aQuery.pEnd = pPos; - } - - if (pPos != pEnd) - { - OSL_ASSERT(*pPos == '#'); - pComponents->aFragment.pBegin = pPos; - pComponents->aFragment.pEnd = pEnd; - } -} - -rtl::OUString joinPaths(Component const & rBasePath, Component const & rRelPath) -{ - OSL_ASSERT(rBasePath.isPresent() && *rBasePath.pBegin == '/'); - OSL_ASSERT(rRelPath.isPresent()); - - // The invariant of aBuffer is that it always starts and ends with a slash - // (until probably right at the end of the algorithm, when the last segment - // of rRelPath is added, which does not necessarily end in a slash): - rtl::OUStringBuffer aBuffer(rBasePath.getLength() + rRelPath.getLength()); - // XXX numeric overflow - - // Segments "." and ".." within rBasePath are not conisdered special (but - // are also not removed by ".." segments within rRelPath), RFC 2396 seems a - // bit unclear about this point: - sal_Int32 nFixed = 1; - sal_Unicode const * p = rBasePath.pBegin + 1; - for (sal_Unicode const * q = p; q != rBasePath.pEnd; ++q) - if (*q == '/') - { - if ( - (q - p == 1 && p[0] == '.') || - (q - p == 2 && p[0] == '.' && p[1] == '.') - ) - { - nFixed = q + 1 - rBasePath.pBegin; - } - p = q + 1; - } - aBuffer.append(rBasePath.pBegin, p - rBasePath.pBegin); - - p = rRelPath.pBegin; - if (p != rRelPath.pEnd) - for (;;) - { - sal_Unicode const * q = p; - sal_Unicode const * r; - for (;;) - { - if (q == rRelPath.pEnd) - { - r = q; - break; - } - if (*q == '/') - { - r = q + 1; - break; - } - ++q; - } - if (q - p == 2 && p[0] == '.' && p[1] == '.') - { - // Erroneous excess segments ".." within rRelPath are left - // intact, as the examples in RFC 2396, section C.2, suggest: - sal_Int32 i = aBuffer.getLength() - 1; - if (i < nFixed) - { - aBuffer.append(p, r - p); - nFixed += 3; - } - else - { - while (aBuffer.charAt(i - 1) != '/') - --i; - aBuffer.setLength(i); - } - } - else if (q - p != 1 || *p != '.') - aBuffer.append(p, r - p); - if (q == rRelPath.pEnd) - break; - p = q + 1; - } - - return aBuffer.makeStringAndClear(); -} - -} - -sal_Bool const * SAL_CALL rtl_getUriCharClass(rtl_UriCharClass eCharClass) - SAL_THROW_EXTERN_C() -{ - static sal_Bool const aCharClass[][nCharClassSize] - = {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* None */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* !"#$%&'()*+,-./*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*0123456789:;<=>?*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*@ABCDEFGHIJKLMNO*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*PQRSTUVWXYZ[\]^_*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*`abcdefghijklmno*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /*pqrstuvwxyz{|}~ */ - }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Uric */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* !"#$%&'()*+,-./*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, /*0123456789:;<=>?*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, /*PQRSTUVWXYZ[\]^_*/ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */ - }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* UricNoSlash */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, /*0123456789:;<=>?*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */ - }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* RelSegment */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, /*0123456789:;<=>?*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */ - }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* RegName */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, /*0123456789:;<=>?*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */ - }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Userinfo */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, /*0123456789:;<=>?*/ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */ - }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Pchar */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, /*0123456789:;<=>?*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */ - }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* UnoParamValue */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, /* !"#$%&'()*+,-./*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*0123456789:;<=>?*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */ - }}; - OSL_ENSURE( - (eCharClass >= 0 - && (sal::static_int_cast< std::size_t >(eCharClass) - < SAL_N_ELEMENTS(aCharClass))), - "bad eCharClass"); - return aCharClass[eCharClass]; -} - -void SAL_CALL rtl_uriEncode(rtl_uString * pText, sal_Bool const * pCharClass, - rtl_UriEncodeMechanism eMechanism, - rtl_TextEncoding eCharset, rtl_uString ** pResult) - SAL_THROW_EXTERN_C() -{ - OSL_ENSURE(!pCharClass[0x25], "bad pCharClass"); - // make sure the percent sign is encoded... - - sal_Unicode const * p = pText->buffer; - sal_Unicode const * pEnd = p + pText->length; - sal_Int32 nCapacity = 0; - rtl_uString_new(pResult); - while (p < pEnd) - { - EscapeType eType; - sal_uInt32 nUtf32 = readUcs4( - &p, pEnd, - (eMechanism == rtl_UriEncodeKeepEscapes - || eMechanism == rtl_UriEncodeCheckEscapes - || eMechanism == rtl_UriEncodeStrictKeepEscapes), - eCharset, &eType); - switch (eType) - { - case EscapeNo: - if (isValid(pCharClass, nUtf32)) // implies nUtf32 <= 0x7F - writeUnicode(pResult, &nCapacity, - static_cast< sal_Unicode >(nUtf32)); - else if (!writeEscapeChar( - pResult, &nCapacity, nUtf32, eCharset, - (eMechanism == rtl_UriEncodeStrict - || eMechanism == rtl_UriEncodeStrictKeepEscapes))) - { - rtl_uString_new(pResult); - return; - } - break; - - case EscapeChar: - if (eMechanism == rtl_UriEncodeCheckEscapes - && isValid(pCharClass, nUtf32)) // implies nUtf32 <= 0x7F - writeUnicode(pResult, &nCapacity, - static_cast< sal_Unicode >(nUtf32)); - else if (!writeEscapeChar( - pResult, &nCapacity, nUtf32, eCharset, - (eMechanism == rtl_UriEncodeStrict - || eMechanism == rtl_UriEncodeStrictKeepEscapes))) - { - rtl_uString_new(pResult); - return; - } - break; - - case EscapeOctet: - writeEscapeOctet(pResult, &nCapacity, nUtf32); - break; - } - } -} - -void SAL_CALL rtl_uriDecode(rtl_uString * pText, - rtl_UriDecodeMechanism eMechanism, - rtl_TextEncoding eCharset, rtl_uString ** pResult) - SAL_THROW_EXTERN_C() -{ - switch (eMechanism) - { - case rtl_UriDecodeNone: - rtl_uString_assign(pResult, pText); - break; - - case rtl_UriDecodeToIuri: - eCharset = RTL_TEXTENCODING_UTF8; - default: // rtl_UriDecodeWithCharset, rtl_UriDecodeStrict - { - sal_Unicode const * p = pText->buffer; - sal_Unicode const * pEnd = p + pText->length; - sal_Int32 nCapacity = 0; - rtl_uString_new(pResult); - while (p < pEnd) - { - EscapeType eType; - sal_uInt32 nUtf32 = readUcs4(&p, pEnd, true, eCharset, &eType); - switch (eType) - { - case EscapeChar: - if (nUtf32 <= 0x7F && eMechanism == rtl_UriDecodeToIuri) - { - writeEscapeOctet(pResult, &nCapacity, nUtf32); - break; - } - case EscapeNo: - writeUcs4(pResult, &nCapacity, nUtf32); - break; - - case EscapeOctet: - if (eMechanism == rtl_UriDecodeStrict) { - rtl_uString_new(pResult); - return; - } - writeEscapeOctet(pResult, &nCapacity, nUtf32); - break; - } - } - } - break; - } -} - -sal_Bool SAL_CALL rtl_uriConvertRelToAbs(rtl_uString * pBaseUriRef, - rtl_uString * pRelUriRef, - rtl_uString ** pResult, - rtl_uString ** pException) - SAL_THROW_EXTERN_C() -{ - // If pRelUriRef starts with a scheme component it is an absolute URI - // reference, and we are done (i.e., this algorithm does not support - // backwards-compatible relative URIs starting with a scheme component, see - // RFC 2396, section 5.2, step 3): - Components aRelComponents; - parseUriRef(pRelUriRef, &aRelComponents); - if (aRelComponents.aScheme.isPresent()) - { - rtl_uString_assign(pResult, pRelUriRef); - return true; - } - - // Parse pBaseUriRef; if the scheme component is not present or not valid, - // or the path component is not empty and starts with anything but a slash, - // an exception is raised: - Components aBaseComponents; - parseUriRef(pBaseUriRef, &aBaseComponents); - if (!aBaseComponents.aScheme.isPresent()) - { - rtl::OUString aMessage(pBaseUriRef); - aMessage += rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - " does not start with a scheme component")); - rtl_uString_assign(pException, - const_cast< rtl::OUString & >(aMessage).pData); - return false; - } - if (aBaseComponents.aPath.pBegin != aBaseComponents.aPath.pEnd - && *aBaseComponents.aPath.pBegin != '/') - { - rtl::OUString aMessage(pBaseUriRef); - aMessage += rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "path component does not start with slash")); - rtl_uString_assign(pException, aMessage.pData); - return false; - } - - // Use the algorithm from RFC 2396, section 5.2, to turn the relative URI - // into an absolute one (if the relative URI is a reference to the "current - // document," the "current document" is here taken to be the base URI): - rtl::OUStringBuffer aBuffer; - aBuffer.append(aBaseComponents.aScheme.pBegin, - aBaseComponents.aScheme.getLength()); - if (aRelComponents.aAuthority.isPresent()) - { - aBuffer.append(aRelComponents.aAuthority.pBegin, - aRelComponents.aAuthority.getLength()); - aBuffer.append(aRelComponents.aPath.pBegin, - aRelComponents.aPath.getLength()); - if (aRelComponents.aQuery.isPresent()) - aBuffer.append(aRelComponents.aQuery.pBegin, - aRelComponents.aQuery.getLength()); - } - else - { - if (aBaseComponents.aAuthority.isPresent()) - aBuffer.append(aBaseComponents.aAuthority.pBegin, - aBaseComponents.aAuthority.getLength()); - if (aRelComponents.aPath.pBegin == aRelComponents.aPath.pEnd - && !aRelComponents.aQuery.isPresent()) - { - aBuffer.append(aBaseComponents.aPath.pBegin, - aBaseComponents.aPath.getLength()); - if (aBaseComponents.aQuery.isPresent()) - aBuffer.append(aBaseComponents.aQuery.pBegin, - aBaseComponents.aQuery.getLength()); - } - else - { - if (*aRelComponents.aPath.pBegin == '/') - aBuffer.append(aRelComponents.aPath.pBegin, - aRelComponents.aPath.getLength()); - else - aBuffer.append(joinPaths(aBaseComponents.aPath, - aRelComponents.aPath)); - if (aRelComponents.aQuery.isPresent()) - aBuffer.append(aRelComponents.aQuery.pBegin, - aRelComponents.aQuery.getLength()); - } - } - if (aRelComponents.aFragment.isPresent()) - aBuffer.append(aRelComponents.aFragment.pBegin, - aRelComponents.aFragment.getLength()); - rtl_uString_assign(pResult, aBuffer.makeStringAndClear().pData); - return true; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/ustrbuf.c b/sal/rtl/source/ustrbuf.c deleted file mode 100644 index 638b27eeb..000000000 --- a/sal/rtl/source/ustrbuf.c +++ /dev/null @@ -1,239 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <osl/interlck.h> - -#ifndef _RTL_STRING_HXX_ -#include <rtl/ustrbuf.hxx> -#endif -#include <rtl/memory.h> - -/* -#include <rtl/alloc.h> -*/ - - - -/************************************************************************* - * rtl_uStringbuffer_newFromStr_WithLength - */ -void SAL_CALL rtl_uStringbuffer_newFromStr_WithLength( rtl_uString ** newStr, - const sal_Unicode * value, - sal_Int32 count) -{ - if (!value) - { - rtl_uString_new_WithLength( newStr, 16 ); - return; - } - - rtl_uString_new_WithLength( newStr, count + 16 ); - (*newStr)->length = count; - rtl_copyMemory( (*newStr)->buffer, value, count * sizeof(sal_Unicode)); - return; -} - -/************************************************************************* - * rtl_uStringbuffer_newFromStringBuffer - */ -sal_Int32 SAL_CALL rtl_uStringbuffer_newFromStringBuffer( rtl_uString ** newStr, - sal_Int32 capacity, - rtl_uString * oldStr ) -{ - sal_Int32 newCapacity = capacity; - - if (newCapacity < oldStr->length) - newCapacity = oldStr->length; - - rtl_uString_new_WithLength( newStr, newCapacity ); - - if (oldStr->length > 0) { - (*newStr)->length = oldStr->length; - rtl_copyMemory( (*newStr)->buffer, oldStr->buffer, oldStr->length * sizeof(sal_Unicode)); - } - return newCapacity; -} - -/************************************************************************* - * rtl_uStringbuffer_ensureCapacity - */ -void SAL_CALL rtl_uStringbuffer_ensureCapacity - (rtl_uString ** This, sal_Int32* capacity, sal_Int32 minimumCapacity) -{ - if (minimumCapacity > *capacity) - { - rtl_uString * pTmp = *This; - rtl_uString * pNew = NULL; - *capacity = ((*This)->length + 1) * 2; - if (minimumCapacity > *capacity) - /* still lower, set to the minimum capacity */ - *capacity = minimumCapacity; - - rtl_uString_new_WithLength(&pNew, *capacity); - pNew->length = (*This)->length; - *This = pNew; - - rtl_copyMemory( (*This)->buffer, pTmp->buffer, pTmp->length * sizeof(sal_Unicode) ); - rtl_uString_release( pTmp ); - } -} - -/************************************************************************* - * rtl_uStringbuffer_insert - */ -void SAL_CALL rtl_uStringbuffer_insert( rtl_uString ** This, - sal_Int32 * capacity, - sal_Int32 offset, - const sal_Unicode * str, - sal_Int32 len) -{ - sal_Int32 nOldLen; - sal_Unicode * pBuf; - sal_Int32 n; - if( len != 0 ) - { - if (*capacity < (*This)->length + len) - rtl_uStringbuffer_ensureCapacity( This, capacity, (*This)->length + len ); - - /* - if( len == 1 ) - This->buffer - */ - nOldLen = (*This)->length; - pBuf = (*This)->buffer; - - /* copy the tail */ - n = (nOldLen - offset); - if( n == 1 ) - /* optimized for 1 character */ - pBuf[offset + len] = pBuf[offset]; - else if( n > 1 ) - rtl_moveMemory( pBuf + offset + len, pBuf + offset, n * sizeof(sal_Unicode) ); - - /* insert the new characters */ - if( len == 1 ) - /* optimized for 1 character */ - pBuf[offset] = *str; - else if( len > 1 ) - rtl_copyMemory( pBuf + offset, str, len * sizeof(sal_Unicode) ); - (*This)->length = nOldLen + len; - pBuf[ nOldLen + len ] = 0; - } -} - -void rtl_uStringbuffer_insertUtf32( - rtl_uString ** pThis, sal_Int32 * capacity, sal_Int32 offset, sal_uInt32 c) -{ - sal_Unicode buf[2]; - sal_Int32 len; - OSL_ASSERT(c <= 0x10FFFF && !(c >= 0xD800 && c <= 0xDFFF)); - if (c <= 0xFFFF) { - buf[0] = (sal_Unicode) c; - len = 1; - } else { - c -= 0x10000; - buf[0] = (sal_Unicode) ((c >> 10) | 0xD800); - buf[1] = (sal_Unicode) ((c & 0x3FF) | 0xDC00); - len = 2; - } - rtl_uStringbuffer_insert(pThis, capacity, offset, buf, len); -} - -/************************************************************************* - * rtl_uStringbuffer_insert_ascii - */ -void SAL_CALL rtl_uStringbuffer_insert_ascii( /*inout*/rtl_uString ** This, - /*inout*/sal_Int32 * capacity, - sal_Int32 offset, - const sal_Char * str, - sal_Int32 len) -{ - sal_Int32 nOldLen; - sal_Unicode * pBuf; - sal_Int32 n; - if( len != 0 ) - { - if (*capacity < (*This)->length + len) - rtl_uStringbuffer_ensureCapacity( This, capacity, (*This)->length + len ); - - nOldLen = (*This)->length; - pBuf = (*This)->buffer; - - /* copy the tail */ - n = (nOldLen - offset); - if( n == 1 ) - /* optimized for 1 character */ - pBuf[offset + len] = pBuf[offset]; - else if( n > 1 ) - rtl_moveMemory( pBuf + offset + len, pBuf + offset, n * sizeof(sal_Unicode) ); - - /* insert the new characters */ - for( n = 0; n < len; n++ ) - { - /* Check ASCII range */ - OSL_ENSURE( (*str & 0x80) == 0, "Found ASCII char > 127"); - - pBuf[offset + n] = (sal_Unicode)*(str++); - } - - (*This)->length = nOldLen + len; - pBuf[ nOldLen + len ] = 0; - } -} - -/************************************************************************* - * rtl_uStringbuffer_remove - */ -void SAL_CALL rtl_uStringbuffer_remove( rtl_uString ** This, - sal_Int32 start, - sal_Int32 len ) -{ - sal_Int32 nTailLen; - sal_Unicode * pBuf; - - if (len > (*This)->length - start) - len = (*This)->length - start; - - //remove nothing - if (!len) - return; - - pBuf = (*This)->buffer; - nTailLen = (*This)->length - ( start + len ); - - if (nTailLen) - { - /* move the tail */ - rtl_moveMemory(pBuf + start, pBuf + start + len, nTailLen * sizeof(sal_Unicode)); - } - - (*This)->length-=len; - pBuf[ (*This)->length ] = 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/ustring.c b/sal/rtl/source/ustring.c deleted file mode 100644 index 89ba0a8bf..000000000 --- a/sal/rtl/source/ustring.c +++ /dev/null @@ -1,983 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#pragma warning(disable:4738) // storing 32-bit float result in memory, possible loss of performance -#endif - -#include <rtl/memory.h> -#include <osl/diagnose.h> -#include <osl/interlck.h> -#include <rtl/alloc.h> -#include <osl/mutex.h> -#include <osl/doublecheckedlocking.h> -#include <rtl/tencinfo.h> - -#include <string.h> -#include <sal/alloca.h> - -#include "hash.h" -#include "strimp.h" -#include "surrogates.h" -#include <rtl/ustring.h> - -#include "rtl/math.h" -#include "rtl/tencinfo.h" - -/* ======================================================================= */ - -/* static data to be referenced by all empty strings - * the refCount is predefined to 1 and must never become 0 ! - */ -static rtl_uString const aImplEmpty_rtl_uString = -{ - (sal_Int32) (SAL_STRING_INTERN_FLAG|SAL_STRING_STATIC_FLAG|1), /*sal_Int32 refCount; */ - 0, /*sal_Int32 length; */ - { 0 } /*sal_Unicode buffer[1];*/ -}; - -/* ======================================================================= */ - -#define IMPL_RTL_STRCODE sal_Unicode -#define IMPL_RTL_USTRCODE( c ) (c) -#define IMPL_RTL_STRNAME( n ) rtl_ustr_ ## n - -#define IMPL_RTL_STRINGNAME( n ) rtl_uString_ ## n -#define IMPL_RTL_STRINGDATA rtl_uString -#define IMPL_RTL_EMPTYSTRING aImplEmpty_rtl_uString -#define IMPL_RTL_INTERN -static void internRelease (rtl_uString *pThis); - -/* ======================================================================= */ - -/* Include String/UString template code */ - -#include "strtmpl.c" - -sal_Int32 rtl_ustr_indexOfAscii_WithLength( - sal_Unicode const * str, sal_Int32 len, - char const * subStr, sal_Int32 subLen) -{ - if (subLen > 0 && subLen <= len) { - sal_Int32 i; - for (i = 0; i <= len - subLen; ++i) { - if (rtl_ustr_asciil_reverseEquals_WithLength( - str + i, subStr, subLen)) - { - return i; - } - } - } - return -1; -} - -sal_Int32 rtl_ustr_lastIndexOfAscii_WithLength( - sal_Unicode const * str, sal_Int32 len, - char const * subStr, sal_Int32 subLen) -{ - if (subLen > 0 && subLen <= len) { - sal_Int32 i; - for (i = len - subLen; i >= 0; --i) { - if (rtl_ustr_asciil_reverseEquals_WithLength( - str + i, subStr, subLen)) - { - return i; - } - } - } - return -1; -} - -sal_Int32 SAL_CALL rtl_ustr_valueOfFloat(sal_Unicode * pStr, float f) -{ - rtl_uString * pResult = NULL; - sal_Int32 nLen; - rtl_math_doubleToUString( - &pResult, 0, 0, f, rtl_math_StringFormat_G, - RTL_USTR_MAX_VALUEOFFLOAT - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0, - 0, sal_True); - nLen = pResult->length; - OSL_ASSERT(nLen < RTL_USTR_MAX_VALUEOFFLOAT); - rtl_copyMemory(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Unicode)); - rtl_uString_release(pResult); - return nLen; -} - -sal_Int32 SAL_CALL rtl_ustr_valueOfDouble(sal_Unicode * pStr, double d) -{ - rtl_uString * pResult = NULL; - sal_Int32 nLen; - rtl_math_doubleToUString( - &pResult, 0, 0, d, rtl_math_StringFormat_G, - RTL_USTR_MAX_VALUEOFDOUBLE - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0, - 0, sal_True); - nLen = pResult->length; - OSL_ASSERT(nLen < RTL_USTR_MAX_VALUEOFDOUBLE); - rtl_copyMemory(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Unicode)); - rtl_uString_release(pResult); - return nLen; -} - -float SAL_CALL rtl_ustr_toFloat(sal_Unicode const * pStr) -{ - return (float) rtl_math_uStringToDouble(pStr, - pStr + rtl_ustr_getLength(pStr), - '.', 0, 0, 0); -} - -double SAL_CALL rtl_ustr_toDouble(sal_Unicode const * pStr) -{ - return rtl_math_uStringToDouble(pStr, pStr + rtl_ustr_getLength(pStr), '.', - 0, 0, 0); -} - -/* ======================================================================= */ - -sal_Int32 SAL_CALL rtl_ustr_ascii_compare( const sal_Unicode* pStr1, - const sal_Char* pStr2 ) -{ - sal_Int32 nRet; - while ( ((nRet = ((sal_Int32)(*pStr1))- - ((sal_Int32)((unsigned char)(*pStr2)))) == 0) && - *pStr2 ) - { - pStr1++; - pStr2++; - } - - return nRet; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL rtl_ustr_ascii_compare_WithLength( const sal_Unicode* pStr1, - sal_Int32 nStr1Len, - const sal_Char* pStr2 ) -{ - sal_Int32 nRet = 0; - while( ((nRet = (nStr1Len ? (sal_Int32)(*pStr1) : 0)- - ((sal_Int32)((unsigned char)(*pStr2)))) == 0) && - nStr1Len && *pStr2 ) - { - pStr1++; - pStr2++; - nStr1Len--; - } - - return nRet; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompare_WithLength( const sal_Unicode* pStr1, - sal_Int32 nStr1Len, - const sal_Char* pStr2, - sal_Int32 nShortenedLength ) -{ - const sal_Unicode* pStr1End = pStr1 + nStr1Len; - sal_Int32 nRet; - while ( (nShortenedLength > 0) && - (pStr1 < pStr1End) && *pStr2 ) - { - /* Check ASCII range */ - OSL_ENSURE( (*pStr2 & 0x80) == 0, "Found ASCII char > 127"); - - nRet = ((sal_Int32)*pStr1)- - ((sal_Int32)(unsigned char)*pStr2); - if ( nRet != 0 ) - return nRet; - - nShortenedLength--; - pStr1++; - pStr2++; - } - - if ( nShortenedLength <= 0 ) - return 0; - - if ( *pStr2 ) - { - OSL_ENSURE( pStr1 == pStr1End, "pStr1 == pStr1End failed" ); - // first is a substring of the second string => less (negative value) - nRet = -1; - } - else - { - // greater or equal - nRet = pStr1End - pStr1; - } - - return nRet; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL rtl_ustr_asciil_reverseCompare_WithLength( const sal_Unicode* pStr1, - sal_Int32 nStr1Len, - const sal_Char* pStr2, - sal_Int32 nStr2Len ) -{ - const sal_Unicode* pStr1Run = pStr1+nStr1Len; - const sal_Char* pStr2Run = pStr2+nStr2Len; - sal_Int32 nRet; - while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) ) - { - pStr1Run--; - pStr2Run--; - nRet = ((sal_Int32)*pStr1Run)-((sal_Int32)*pStr2Run); - if ( nRet ) - return nRet; - } - - return nStr1Len - nStr2Len; -} - -/* ----------------------------------------------------------------------- */ - -sal_Bool SAL_CALL rtl_ustr_asciil_reverseEquals_WithLength( const sal_Unicode* pStr1, - const sal_Char* pStr2, - sal_Int32 nStrLen ) -{ - const sal_Unicode* pStr1Run = pStr1+nStrLen; - const sal_Char* pStr2Run = pStr2+nStrLen; - while ( pStr1 < pStr1Run ) - { - pStr1Run--; - pStr2Run--; - if( *pStr1Run != (sal_Unicode)*pStr2Run ) - return sal_False; - } - - return sal_True; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase( const sal_Unicode* pStr1, - const sal_Char* pStr2 ) -{ - sal_Int32 nRet; - sal_Int32 c1; - sal_Int32 c2; - do - { - /* If character between 'A' and 'Z', than convert it to lowercase */ - c1 = (sal_Int32)*pStr1; - c2 = (sal_Int32)((unsigned char)*pStr2); - if ( (c1 >= 65) && (c1 <= 90) ) - c1 += 32; - if ( (c2 >= 65) && (c2 <= 90) ) - c2 += 32; - nRet = c1-c2; - if ( nRet != 0 ) - return nRet; - - pStr1++; - pStr2++; - } - while ( c2 ); - - return 0; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( const sal_Unicode* pStr1, - sal_Int32 nStr1Len, - const sal_Char* pStr2 ) -{ - sal_Int32 nRet; - sal_Int32 c1; - sal_Int32 c2; - do - { - if ( !nStr1Len ) - return *pStr2 == '\0' ? 0 : -1; - - /* If character between 'A' and 'Z', than convert it to lowercase */ - c1 = (sal_Int32)*pStr1; - c2 = (sal_Int32)((unsigned char)*pStr2); - if ( (c1 >= 65) && (c1 <= 90) ) - c1 += 32; - if ( (c2 >= 65) && (c2 <= 90) ) - c2 += 32; - nRet = c1-c2; - if ( nRet != 0 ) - return nRet; - - pStr1++; - pStr2++; - nStr1Len--; - } - while( c2 ); - - return 0; -} - -sal_Int32 rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths( - sal_Unicode const * first, sal_Int32 firstLen, - char const * second, sal_Int32 secondLen) -{ - sal_Int32 i; - sal_Int32 len = firstLen < secondLen ? firstLen : secondLen; - for (i = 0; i < len; ++i) { - sal_Int32 c1 = *first++; - sal_Int32 c2 = (unsigned char) *second++; - sal_Int32 d; - if (c1 >= 65 && c1 <= 90) { - c1 += 32; - } - if (c2 >= 65 && c2 <= 90) { - c2 += 32; - } - d = c1 - c2; - if (d != 0) { - return d; - } - } - return firstLen - secondLen; -} - -/* ----------------------------------------------------------------------- */ - -sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( const sal_Unicode* pStr1, - sal_Int32 nStr1Len, - const sal_Char* pStr2, - sal_Int32 nShortenedLength ) -{ - const sal_Unicode* pStr1End = pStr1 + nStr1Len; - sal_Int32 nRet; - sal_Int32 c1; - sal_Int32 c2; - while ( (nShortenedLength > 0) && - (pStr1 < pStr1End) && *pStr2 ) - { - /* Check ASCII range */ - OSL_ENSURE( (*pStr2 & 0x80) == 0, "Found ASCII char > 127"); - - /* If character between 'A' and 'Z', than convert it to lowercase */ - c1 = (sal_Int32)*pStr1; - c2 = (sal_Int32)((unsigned char)*pStr2); - if ( (c1 >= 65) && (c1 <= 90) ) - c1 += 32; - if ( (c2 >= 65) && (c2 <= 90) ) - c2 += 32; - nRet = c1-c2; - if ( nRet != 0 ) - return nRet; - - nShortenedLength--; - pStr1++; - pStr2++; - } - - if ( nShortenedLength <= 0 ) - return 0; - - if ( *pStr2 ) - { - OSL_ENSURE( pStr1 == pStr1End, "pStr1 == pStr1End failed" ); - // first is a substring of the second string => less (negative value) - nRet = -1; - } - else - { - // greater or equal - nRet = pStr1End - pStr1; - } - - return nRet; -} - -/* ----------------------------------------------------------------------- */ - -void SAL_CALL rtl_uString_newFromAscii( rtl_uString** ppThis, - const sal_Char* pCharStr ) -{ - sal_Int32 nLen; - - if ( pCharStr ) - { - const sal_Char* pTempStr = pCharStr; - while( *pTempStr ) - pTempStr++; - nLen = pTempStr-pCharStr; - } - else - nLen = 0; - - if ( !nLen ) - { - IMPL_RTL_STRINGNAME( new )( ppThis ); - return; - } - - if ( *ppThis ) - IMPL_RTL_STRINGNAME( release )( *ppThis ); - - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen ); - OSL_ASSERT(*ppThis != NULL); - if ( (*ppThis) ) - { - IMPL_RTL_STRCODE* pBuffer = (*ppThis)->buffer; - do - { - /* Check ASCII range */ - OSL_ENSURE( ((unsigned char)*pCharStr) <= 127, - "rtl_uString_newFromAscii() - Found ASCII char > 127" ); - - *pBuffer = *pCharStr; - pBuffer++; - pCharStr++; - } - while ( *pCharStr ); - } -} - -void SAL_CALL rtl_uString_newFromCodePoints( - rtl_uString ** newString, sal_uInt32 const * codePoints, - sal_Int32 codePointCount) -{ - sal_Int32 n; - sal_Int32 i; - sal_Unicode * p; - OSL_ASSERT( - newString != NULL && - (codePoints != NULL || codePointCount == 0) && - codePointCount >= 0); - if (codePointCount == 0) { - rtl_uString_new(newString); - return; - } - if (*newString != NULL) { - rtl_uString_release(*newString); - } - n = codePointCount; - for (i = 0; i < codePointCount; ++i) { - OSL_ASSERT(codePoints[i] <= 0x10FFFF); - if (codePoints[i] >= 0x10000) { - ++n; - } - } - /* Builds on the assumption that sal_Int32 uses 32 bit two's complement - representation with wrap around (the necessary number of UTF-16 code - units will be no larger than 2 * SAL_MAX_INT32, represented as - sal_Int32 -2): */ - if (n < 0) { - *newString = NULL; - return; - } - *newString = rtl_uString_ImplAlloc(n); - if (*newString == NULL) { - return; - } - p = (*newString)->buffer; - for (i = 0; i < codePointCount; ++i) { - sal_uInt32 c = codePoints[i]; - if (c < 0x10000) { - *p++ = (sal_Unicode) c; - } else { - c -= 0x10000; - *p++ = (sal_Unicode) ((c >> 10) | SAL_RTL_FIRST_HIGH_SURROGATE); - *p++ = (sal_Unicode) ((c & 0x3FF) | SAL_RTL_FIRST_LOW_SURROGATE); - } - } -} - -/* ======================================================================= */ - -static int rtl_ImplGetFastUTF8UnicodeLen( const sal_Char* pStr, sal_Int32 nLen ) -{ - int n; - sal_uChar c; - const sal_Char* pEndStr; - - n = 0; - pEndStr = pStr+nLen; - while ( pStr < pEndStr ) - { - c = (sal_uChar)*pStr; - - if ( !(c & 0x80) ) - pStr++; - else if ( (c & 0xE0) == 0xC0 ) - pStr += 2; - else if ( (c & 0xF0) == 0xE0 ) - pStr += 3; - else if ( (c & 0xF8) == 0xF0 ) - pStr += 4; - else if ( (c & 0xFC) == 0xF8 ) - pStr += 5; - else if ( (c & 0xFE) == 0xFC ) - pStr += 6; - else - pStr++; - - n++; - } - - return n; -} - -/* ----------------------------------------------------------------------- */ - -static void rtl_string2UString_status( rtl_uString** ppThis, - const sal_Char* pStr, - sal_Int32 nLen, - rtl_TextEncoding eTextEncoding, - sal_uInt32 nCvtFlags, - sal_uInt32 *pInfo ) -{ - OSL_ENSURE(nLen == 0 || rtl_isOctetTextEncoding(eTextEncoding), - "rtl_string2UString_status() - Wrong TextEncoding" ); - - if ( !nLen ) - { - rtl_uString_new( ppThis ); - if (pInfo != NULL) { - *pInfo = 0; - } - } - else - { - if ( *ppThis ) - IMPL_RTL_STRINGNAME( release )( *ppThis ); - - /* Optimization for US-ASCII */ - if ( eTextEncoding == RTL_TEXTENCODING_ASCII_US ) - { - IMPL_RTL_STRCODE* pBuffer; - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen ); - if (*ppThis == NULL) { - if (pInfo != NULL) { - *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR | - RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL; - } - return; - } - pBuffer = (*ppThis)->buffer; - do - { - /* Check ASCII range */ - OSL_ENSURE( ((unsigned char)*pStr) <= 127, - "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ); - - *pBuffer = *pStr; - pBuffer++; - pStr++; - nLen--; - } - while ( nLen ); - if (pInfo != NULL) { - *pInfo = 0; - } - } - else - { - rtl_uString* pTemp; - rtl_uString* pTemp2 = NULL; - rtl_TextToUnicodeConverter hConverter; - sal_uInt32 nInfo; - sal_Size nSrcBytes; - sal_Size nDestChars; - sal_Size nNewLen; - - /* Optimization for UTF-8 - we try to calculate the exact length */ - /* For all other encoding we try the maximum - and reallocate - the buffer if needed */ - if ( eTextEncoding == RTL_TEXTENCODING_UTF8 ) - { - nNewLen = rtl_ImplGetFastUTF8UnicodeLen( pStr, nLen ); - /* Includes the string only ASCII, then we could copy - the buffer faster */ - if ( nNewLen == (sal_Size)nLen ) - { - IMPL_RTL_STRCODE* pBuffer; - *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen ); - if (*ppThis == NULL) - { - if (pInfo != NULL) { - *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR | - RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL; - } - return; - } - pBuffer = (*ppThis)->buffer; - do - { - /* Check ASCII range */ - OSL_ENSURE( ((unsigned char)*pStr) <= 127, - "rtl_string2UString_status() - UTF8 test encoding is wrong" ); - - *pBuffer = *pStr; - pBuffer++; - pStr++; - nLen--; - } - while ( nLen ); - if (pInfo != NULL) { - *pInfo = 0; - } - return; - } - } - else - nNewLen = nLen; - - nCvtFlags |= RTL_TEXTTOUNICODE_FLAGS_FLUSH; - hConverter = rtl_createTextToUnicodeConverter( eTextEncoding ); - - pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen ); - if (pTemp == NULL) { - if (pInfo != NULL) { - *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR | - RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL; - } - return; - } - nDestChars = rtl_convertTextToUnicode( hConverter, 0, - pStr, nLen, - pTemp->buffer, nNewLen, - nCvtFlags, - &nInfo, &nSrcBytes ); - - /* Buffer not big enough, try again with enough space */ - /* Shouldn't be the case, but if we get textencoding which - could results in more unicode characters we have this - code here. Could be the case for apple encodings */ - while ( nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL ) - { - rtl_freeMemory( pTemp ); - nNewLen += 8; - pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen ); - if (pTemp == NULL) { - if (pInfo != NULL) { - *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR | - RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL; - } - return; - } - nDestChars = rtl_convertTextToUnicode( hConverter, 0, - pStr, nLen, - pTemp->buffer, nNewLen, - nCvtFlags, - &nInfo, &nSrcBytes ); - } - - if (pInfo) - *pInfo = nInfo; - - /* Set the buffer to the correct size or if there is too - much overhead, reallocate to the correct size */ - if ( nNewLen > nDestChars+8 ) - { - pTemp2 = IMPL_RTL_STRINGNAME( ImplAlloc )( nDestChars ); - } - if (pTemp2 != NULL) - { - rtl_str_ImplCopy(pTemp2->buffer, pTemp->buffer, nDestChars); - rtl_freeMemory(pTemp); - pTemp = pTemp2; - } - else - { - pTemp->length = nDestChars; - pTemp->buffer[nDestChars] = 0; - } - - rtl_destroyTextToUnicodeConverter( hConverter ); - *ppThis = pTemp; - - /* Results the conversion in an empty buffer - - create an empty string */ - if ( pTemp && !nDestChars ) - rtl_uString_new( ppThis ); - } - } -} - -void SAL_CALL rtl_string2UString( rtl_uString** ppThis, - const sal_Char* pStr, - sal_Int32 nLen, - rtl_TextEncoding eTextEncoding, - sal_uInt32 nCvtFlags ) -{ - rtl_string2UString_status( ppThis, pStr, nLen, eTextEncoding, - nCvtFlags, NULL ); -} - -/* ----------------------------------------------------------------------- */ - -typedef enum { - CANNOT_RETURN, - CAN_RETURN = 1 -} StrLifecycle; - -static oslMutex -getInternMutex() -{ - static oslMutex pPoolGuard = NULL; - if( !pPoolGuard ) - { - oslMutex pGlobalGuard; - pGlobalGuard = *osl_getGlobalMutex(); - osl_acquireMutex( pGlobalGuard ); - if( !pPoolGuard ) - { - oslMutex p = osl_createMutex(); - OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); - pPoolGuard = p; - } - osl_releaseMutex( pGlobalGuard ); - } - else - { - OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); - } - - return pPoolGuard; -} - -/* returns true if we found a dup in the pool */ -static void rtl_ustring_intern_internal( rtl_uString ** newStr, - rtl_uString * str, - StrLifecycle can_return ) -{ - oslMutex pPoolMutex; - - pPoolMutex = getInternMutex(); - - osl_acquireMutex( pPoolMutex ); - - *newStr = rtl_str_hash_intern (str, can_return); - - osl_releaseMutex( pPoolMutex ); - - if( can_return && *newStr != str ) - { /* we dupped, then found a match */ - rtl_freeMemory( str ); - } -} - -void SAL_CALL rtl_uString_intern( rtl_uString ** newStr, - rtl_uString * str) -{ - if (SAL_STRING_IS_INTERN(str)) - { - IMPL_RTL_AQUIRE( str ); - *newStr = str; - } - else - { - rtl_uString *pOrg = *newStr; - *newStr = NULL; - rtl_ustring_intern_internal( newStr, str, CANNOT_RETURN ); - if (pOrg) - rtl_uString_release (pOrg); - } -} - -static int rtl_canGuessUOutputLength( int len, rtl_TextEncoding eTextEncoding ) -{ - // FIXME: Maybe we should use a bit flag in the higher bits of the - // eTextEncoding value itself to determine the encoding type. But if we - // do, be sure to mask the value in certain places that expect the values - // to be numbered serially from 0 and up. One such place is - // Impl_getTextEncodingData(). - - switch ( eTextEncoding ) - { - // 1 to 1 (with no zero elements) - case RTL_TEXTENCODING_IBM_437: - case RTL_TEXTENCODING_IBM_850: - case RTL_TEXTENCODING_IBM_860: - case RTL_TEXTENCODING_IBM_861: - case RTL_TEXTENCODING_IBM_863: - case RTL_TEXTENCODING_IBM_865: - return len; - break; - } - return 0; -} - -void SAL_CALL rtl_uString_internConvert( rtl_uString ** newStr, - const sal_Char * str, - sal_Int32 len, - rtl_TextEncoding eTextEncoding, - sal_uInt32 convertFlags, - sal_uInt32 * pInfo ) -{ - rtl_uString *scratch; - - if (*newStr) - { - rtl_uString_release (*newStr); - *newStr = NULL; - } - - if ( len < 256 ) - { // try various optimisations - sal_Int32 ulen; - if ( len < 0 ) - len = strlen( str ); - if ( eTextEncoding == RTL_TEXTENCODING_ASCII_US ) - { - int i; - rtl_uString *pScratch; - pScratch = alloca( sizeof( rtl_uString ) - + len * sizeof (IMPL_RTL_STRCODE ) ); - for (i = 0; i < len; i++) - { - /* Check ASCII range */ - OSL_ENSURE( ((unsigned char)str[i]) <= 127, - "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ); - pScratch->buffer[i] = str[i]; - } - pScratch->length = len; - rtl_ustring_intern_internal( newStr, pScratch, CANNOT_RETURN ); - return; - } - else if ( (ulen = rtl_canGuessUOutputLength(len, eTextEncoding)) != 0 ) - { - rtl_uString *pScratch; - rtl_TextToUnicodeConverter hConverter; - sal_Size nSrcBytes; - sal_uInt32 nInfo; - - pScratch = alloca( sizeof(rtl_uString) + ulen * sizeof (IMPL_RTL_STRCODE) ); - - hConverter = rtl_createTextToUnicodeConverter( eTextEncoding ); - rtl_convertTextToUnicode( - hConverter, 0, str, len, pScratch->buffer, ulen, convertFlags, &nInfo, &nSrcBytes ); - rtl_destroyTextToUnicodeConverter( hConverter ); - - if (pInfo) - *pInfo = nInfo; - - pScratch->length = ulen; - rtl_ustring_intern_internal( newStr, pScratch, CANNOT_RETURN ); - return; - } - - /* FIXME: we want a nice UTF-8 / alloca shortcut here */ - } - - scratch = NULL; - rtl_string2UString_status( &scratch, str, len, eTextEncoding, convertFlags, - pInfo ); - if (!scratch) { - return; - } - rtl_ustring_intern_internal( newStr, scratch, CAN_RETURN ); -} - -static void -internRelease (rtl_uString *pThis) -{ - oslMutex pPoolMutex; - - rtl_uString *pFree = NULL; - if ( SAL_STRING_REFCOUNT( - osl_decrementInterlockedCount( &(pThis->refCount) ) ) == 0) - { - pPoolMutex = getInternMutex(); - osl_acquireMutex( pPoolMutex ); - - rtl_str_hash_remove (pThis); - - /* May have been separately acquired */ - if ( SAL_STRING_REFCOUNT( - osl_incrementInterlockedCount( &(pThis->refCount) ) ) == 1 ) - { - /* we got the last ref */ - pFree = pThis; - } - else /* very unusual */ - { - internRelease (pThis); - } - - osl_releaseMutex( pPoolMutex ); - } - if (pFree) - rtl_freeMemory (pFree); -} - -sal_uInt32 SAL_CALL rtl_uString_iterateCodePoints( - rtl_uString const * string, sal_Int32 * indexUtf16, - sal_Int32 incrementCodePoints) -{ - sal_Int32 n; - sal_Unicode cu; - sal_uInt32 cp; - OSL_ASSERT(string != NULL && indexUtf16 != NULL); - n = *indexUtf16; - OSL_ASSERT(n >= 0 && n <= string->length); - while (incrementCodePoints < 0) { - OSL_ASSERT(n > 0); - cu = string->buffer[--n]; - if (SAL_RTL_IS_LOW_SURROGATE(cu) && n != 0 && - SAL_RTL_IS_HIGH_SURROGATE(string->buffer[n - 1])) - { - --n; - } - ++incrementCodePoints; - } - OSL_ASSERT(n >= 0 && n < string->length); - cu = string->buffer[n]; - if (SAL_RTL_IS_HIGH_SURROGATE(cu) && string->length - n >= 2 && - SAL_RTL_IS_LOW_SURROGATE(string->buffer[n + 1])) - { - cp = SAL_RTL_COMBINE_SURROGATES(cu, string->buffer[n + 1]); - } else { - cp = cu; - } - while (incrementCodePoints > 0) { - OSL_ASSERT(n < string->length); - cu = string->buffer[n++]; - if (SAL_RTL_IS_HIGH_SURROGATE(cu) && n != string->length && - SAL_RTL_IS_LOW_SURROGATE(string->buffer[n])) - { - ++n; - } - --incrementCodePoints; - } - OSL_ASSERT(n >= 0 && n <= string->length); - *indexUtf16 = n; - return cp; -} - -sal_Bool rtl_convertStringToUString( - rtl_uString ** target, char const * source, sal_Int32 length, - rtl_TextEncoding encoding, sal_uInt32 flags) SAL_THROW_EXTERN_C() -{ - sal_uInt32 info; - rtl_string2UString_status(target, source, length, encoding, flags, &info); - return (sal_Bool) ((info & RTL_TEXTTOUNICODE_INFO_ERROR) == 0); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/rtl/source/uuid.cxx b/sal/rtl/source/uuid.cxx deleted file mode 100644 index d824cea88..000000000 --- a/sal/rtl/source/uuid.cxx +++ /dev/null @@ -1,182 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include <string.h> -#include <stdlib.h> - -#include <osl/mutex.hxx> -#include <rtl/random.h> -#include <rtl/uuid.h> -#include <rtl/digest.h> - -#define SWAP_INT32_TO_NETWORK(x)\ - { sal_uInt32 y = x;\ - sal_uInt8 *p = (sal_uInt8 * )&(x); \ - p[0] = (sal_uInt8) ( ( y >> 24 ) & 0xff );\ - p[1] = (sal_uInt8) ( ( y >> 16 ) & 0xff );\ - p[2] = (sal_uInt8) ( ( y >> 8 ) & 0xff );\ - p[3] = (sal_uInt8) ( ( y ) & 0xff);\ - } -#define SWAP_INT16_TO_NETWORK(x)\ - { sal_uInt16 y = x;\ - sal_uInt8 *p = (sal_uInt8 * )&(x); \ - p[0] = (sal_uInt8) ( ( y >> 8 ) & 0xff );\ - p[1] = (sal_uInt8) ( ( y ) & 0xff);\ - } - -#define SWAP_NETWORK_TO_INT16(x)\ - { sal_uInt16 y = x;\ - sal_uInt8 *p = (sal_uInt8 * )&(y);\ - x = ( ( ((sal_uInt16)p[0]) & 0xff) << 8 ) |\ - ( ( (sal_uInt16)p[1]) & 0xff);\ - } -#define SWAP_NETWORK_TO_INT32(x)\ - { sal_uInt32 y = x;\ - sal_uInt8 *p = (sal_uInt8 * )&(y); \ - x = ( ( ((sal_uInt32)p[0]) & 0xff) << 24 ) |\ - ( ( ((sal_uInt32)p[1]) & 0xff) << 16 ) |\ - ( ( ((sal_uInt32)p[2]) & 0xff) << 8 ) |\ - ( ( (sal_uInt32)p[3]) & 0xff);\ - } - -typedef struct _UUID -{ - sal_uInt32 time_low; - sal_uInt16 time_mid; - sal_uInt16 time_hi_and_version; - sal_uInt8 clock_seq_hi_and_reserved; - sal_uInt8 clock_seq_low; - sal_uInt8 node[6]; -} UUID; - -static void write_v3( sal_uInt8 *pUuid ) -{ - UUID uuid; - // copy to avoid alignment problems - memcpy( &uuid , pUuid , 16 ); - - SWAP_NETWORK_TO_INT32( uuid.time_low ); - SWAP_NETWORK_TO_INT16( uuid.time_mid ); - SWAP_NETWORK_TO_INT16( uuid.time_hi_and_version ); - - /* put in the variant and version bits */ - uuid.time_hi_and_version &= 0x0FFF; - uuid.time_hi_and_version |= (3 << 12); - uuid.clock_seq_hi_and_reserved &= 0x3F; - uuid.clock_seq_hi_and_reserved |= 0x80; - - SWAP_INT32_TO_NETWORK( uuid.time_low ); - SWAP_INT16_TO_NETWORK( uuid.time_mid ); - SWAP_INT16_TO_NETWORK( uuid.time_hi_and_version ); - - memcpy( pUuid , &uuid , 16 ); -} - - -extern "C" void SAL_CALL rtl_createUuid( sal_uInt8 *pTargetUUID , - const sal_uInt8 *, sal_Bool ) -{ - { - osl::MutexGuard g(osl::Mutex::getGlobalMutex()); - static rtlRandomPool pool = NULL; - if (pool == NULL) { - pool = rtl_random_createPool(); - if (pool == NULL) { - abort(); - // only possible way to signal failure here (rtl_createUuid - // being part of a fixed C API) - } - } - if (rtl_random_getBytes(pool, pTargetUUID, 16) != rtl_Random_E_None) { - abort(); - // only possible way to signal failure here (rtl_createUuid - // being part of a fixed C API) - } - } - // See ITU-T Recommendation X.667: - pTargetUUID[6] &= 0x0F; - pTargetUUID[6] |= 0x40; - pTargetUUID[8] &= 0x3F; - pTargetUUID[8] |= 0x80; -} - - -extern "C" void SAL_CALL rtl_createNamedUuid( sal_uInt8 *pTargetUUID, - const sal_uInt8 *pNameSpaceUUID, - const rtl_String *pName ) -{ - rtlDigest digest = rtl_digest_createMD5 (); - - rtl_digest_updateMD5( digest, pNameSpaceUUID , 16 ); - rtl_digest_updateMD5( digest, pName->buffer , pName->length ); - - rtl_digest_getMD5( digest, pTargetUUID , 16 ); - rtl_digest_destroyMD5 (digest); - - write_v3(pTargetUUID); -} - - - -extern "C" sal_Int32 SAL_CALL rtl_compareUuid( const sal_uInt8 *pUUID1 , const sal_uInt8 *pUUID2 ) -{ - int i; - UUID u1; - UUID u2; - memcpy( &u1 , pUUID1 , 16 ); - memcpy( &u2 , pUUID2 , 16 ); - - SWAP_NETWORK_TO_INT32( u1.time_low ); - SWAP_NETWORK_TO_INT16( u1.time_mid ); - SWAP_NETWORK_TO_INT16( u1.time_hi_and_version ); - - SWAP_NETWORK_TO_INT32( u2.time_low ); - SWAP_NETWORK_TO_INT16( u2.time_mid ); - SWAP_NETWORK_TO_INT16( u2.time_hi_and_version ); - -#define CHECK(f1, f2) if (f1 != f2) return f1 < f2 ? -1 : 1; - CHECK(u1.time_low, u2.time_low); - CHECK(u1.time_mid, u2.time_mid); - CHECK(u1.time_hi_and_version, u2.time_hi_and_version); - CHECK(u1.clock_seq_hi_and_reserved, u2.clock_seq_hi_and_reserved); - CHECK(u1.clock_seq_low, u2.clock_seq_low); - for (i = 0; i < 6; i++) - { - if (u1.node[i] < u2.node[i]) - return -1; - if (u1.node[i] > u2.node[i]) - return 1; - } - return 0; - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |