1b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*******************************************************************************
38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius*   Copyright (C) 2011-2012, International Business Machines
4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   Corporation and others.  All Rights Reserved.
5b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*******************************************************************************
6b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   file name:  appendable.cpp
7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   encoding:   US-ASCII
8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   tab size:   8 (not used)
9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   indentation:4
10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*
11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   created on: 2010dec07
12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   created by: Markus W. Scherer
13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/
14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/utypes.h"
16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/appendable.h"
17103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/utf16.h"
18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_BEGIN
20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
21103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusAppendable::~Appendable() {}
22103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool
24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoAppendable::appendCodePoint(UChar32 c) {
25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(c<=0xffff) {
26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return appendCodeUnit((UChar)c);
27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return appendCodeUnit(U16_LEAD(c)) && appendCodeUnit(U16_TRAIL(c));
29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool
33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoAppendable::appendString(const UChar *s, int32_t length) {
34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(length<0) {
35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar c;
36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        while((c=*s++)!=0) {
37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(!appendCodeUnit(c)) {
38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return FALSE;
39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(length>0) {
42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const UChar *limit=s+length;
43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        do {
44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(!appendCodeUnit(*s++)) {
45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return FALSE;
46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } while(s<limit);
48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return TRUE;
50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool
53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoAppendable::reserveAppendCapacity(int32_t /*appendCapacity*/) {
54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return TRUE;
55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUChar *
58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoAppendable::getAppendBuffer(int32_t minCapacity,
59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            int32_t /*desiredCapacityHint*/,
60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            UChar *scratch, int32_t scratchCapacity,
61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            int32_t *resultCapacity) {
62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(minCapacity<1 || scratchCapacity<minCapacity) {
63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        *resultCapacity=0;
64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;
65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    *resultCapacity=scratchCapacity;
67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return scratch;
68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// UnicodeStringAppendable is implemented in unistr.cpp.
71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_END
73