2 *******************************************************************************
4 * Copyright (C) 2003-2007, International Business Machines
5 * Corporation and others. All Rights Reserved.
7 *******************************************************************************
10 * tab size: 8 (not used)
13 * created on: 2003jul11
14 * created by: Ram Viswanadha
17 #include "unicode/utypes.h"
25 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
26 #define NFS4_MAX_BUFFER_SIZE 1000
27 #define PREFIX_SUFFIX_SEPARATOR 0x0040 /* '@' */
30 const char* NFS4DataFileNames
[5] ={
40 nfs4_prepare( const char* src
, int32_t srcLength
,
41 char* dest
, int32_t destCapacity
,
42 NFS4ProfileState state
,
43 UParseError
* parseError
,
46 UChar b1Stack
[NFS4_MAX_BUFFER_SIZE
],
47 b2Stack
[NFS4_MAX_BUFFER_SIZE
];
48 char b3Stack
[NFS4_MAX_BUFFER_SIZE
];
50 /* initialize pointers to stack buffers */
51 UChar
*b1
= b1Stack
, *b2
= b2Stack
;
53 int32_t b1Len
=0, b2Len
=0, b3Len
=0,
54 b1Capacity
= NFS4_MAX_BUFFER_SIZE
,
55 b2Capacity
= NFS4_MAX_BUFFER_SIZE
,
56 b3Capacity
= NFS4_MAX_BUFFER_SIZE
,
59 UStringPrepProfile
* profile
= NULL
;
60 /* get the test data path */
61 const char *testdatapath
= NULL
;
63 if(status
==NULL
|| U_FAILURE(*status
)){
66 if((src
==NULL
) || (srcLength
< -1) || (destCapacity
<0) || (!dest
&& destCapacity
> 0)){
67 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
70 testdatapath
= loadTestData(status
);
72 /* convert the string from UTF-8 to UTF-16 */
73 u_strFromUTF8(b1
,b1Capacity
,&b1Len
,src
,srcLength
,status
);
74 if(*status
== U_BUFFER_OVERFLOW_ERROR
){
76 /* reset the status */
77 *status
= U_ZERO_ERROR
;
79 b1
= (UChar
*) malloc(b1Len
* U_SIZEOF_UCHAR
);
81 *status
= U_MEMORY_ALLOCATION_ERROR
;
86 u_strFromUTF8(b1
, b1Capacity
, &b1Len
, src
, srcLength
, status
);
89 /* open the profile */
90 profile
= usprep_open(testdatapath
, NFS4DataFileNames
[state
], status
);
91 /* prepare the string */
92 b2Len
= usprep_prepare(profile
, b1
, b1Len
, b2
, b2Capacity
, USPREP_DEFAULT
, parseError
, status
);
93 if(*status
== U_BUFFER_OVERFLOW_ERROR
){
94 *status
= U_ZERO_ERROR
;
95 b2
= (UChar
*) malloc(b2Len
* U_SIZEOF_UCHAR
);
97 *status
= U_MEMORY_ALLOCATION_ERROR
;
100 b2Len
= usprep_prepare(profile
, b1
, b1Len
, b2
, b2Len
, USPREP_DEFAULT
, parseError
, status
);
103 /* convert the string back to UTF-8 */
104 u_strToUTF8(b3
,b3Capacity
, &b3Len
, b2
, b2Len
, status
);
105 if(*status
== U_BUFFER_OVERFLOW_ERROR
){
106 *status
= U_ZERO_ERROR
;
107 b3
= (char*) malloc(b3Len
);
109 *status
= U_MEMORY_ALLOCATION_ERROR
;
113 u_strToUTF8(b3
,b3Capacity
, &b3Len
, b2
, b2Len
, status
);
117 if(dest
!=NULL
&& reqLength
<= destCapacity
){
118 memmove(dest
, b3
, reqLength
);
132 return u_terminateChars(dest
, destCapacity
, reqLength
, status
);
135 /* sorted array for binary search*/
136 static const char* special_prefixes
[]={
137 "\x0041\x004e\x004f\x004e\x0059\x004d\x004f\x0055\x0053",
138 "\x0041\x0055\x0054\x0048\x0045\x004e\x0054\x0049\x0043\x0041\x0054\x0045\x0044",
139 "\x0042\x0041\x0054\x0043\x0048",
140 "\x0044\x0049\x0041\x004c\x0055\x0050",
141 "\x0045\x0056\x0045\x0052\x0059\x004f\x004e\x0045",
142 "\x0047\x0052\x004f\x0055\x0050",
143 "\x0049\x004e\x0054\x0045\x0052\x0041\x0043\x0054\x0049\x0056\x0045",
144 "\x004e\x0045\x0054\x0057\x004f\x0052\x004b",
145 "\x004f\x0057\x004e\x0045\x0052",
149 /* binary search the sorted array */
151 findStringIndex(const char* const *sortedArr
, int32_t sortedArrLen
, const char* target
, int32_t targetLen
){
153 int left
, middle
, right
,rc
;
156 right
= sortedArrLen
-1;
158 while(left
<= right
){
159 middle
= (left
+right
)/2;
160 rc
=strncmp(sortedArr
[middle
],target
, targetLen
);
174 getPrefixSuffix(const char *src
, int32_t srcLength
,
175 const char **prefix
, int32_t *prefixLen
,
176 const char **suffix
, int32_t *suffixLen
,
182 if(src
[i
] == PREFIX_SUFFIX_SEPARATOR
){
183 if((i
+1) == srcLength
){
184 /* we reached the end of the string */
189 i
++;/* the prefix contains the separator */
196 *suffixLen
= srcLength
- i
;
197 /* special prefixes must not be followed by suffixes! */
198 if((findStringIndex(special_prefixes
,LENGTHOF(special_prefixes
), *prefix
, *prefixLen
-1) != -1) && (*suffix
!= NULL
)){
199 *status
= U_PARSE_ERROR
;
206 nfs4_mixed_prepare( const char* src
, int32_t srcLength
,
207 char* dest
, int32_t destCapacity
,
208 UParseError
* parseError
,
211 const char *prefix
= NULL
, *suffix
= NULL
;
212 int32_t prefixLen
=0, suffixLen
=0;
213 char pStack
[NFS4_MAX_BUFFER_SIZE
],
214 sStack
[NFS4_MAX_BUFFER_SIZE
];
215 char *p
=pStack
, *s
=sStack
;
216 int32_t pLen
=0, sLen
=0, reqLen
=0,
217 pCapacity
= NFS4_MAX_BUFFER_SIZE
,
218 sCapacity
= NFS4_MAX_BUFFER_SIZE
;
221 if(status
==NULL
|| U_FAILURE(*status
)){
224 if((src
==NULL
) || (srcLength
< -1) || (destCapacity
<0) || (!dest
&& destCapacity
> 0)){
225 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
229 srcLength
= (int32_t)strlen(src
);
231 getPrefixSuffix(src
, srcLength
, &prefix
, &prefixLen
, &suffix
, &suffixLen
, status
);
233 /* prepare the prefix */
234 pLen
= nfs4_prepare(prefix
, prefixLen
, p
, pCapacity
, NFS4_MIXED_PREP_PREFIX
, parseError
, status
);
235 if(*status
== U_BUFFER_OVERFLOW_ERROR
){
236 *status
= U_ZERO_ERROR
;
237 p
= (char*) malloc(pLen
);
239 *status
= U_MEMORY_ALLOCATION_ERROR
;
242 pLen
= nfs4_prepare(prefix
, prefixLen
, p
, pLen
, NFS4_MIXED_PREP_PREFIX
, parseError
, status
);
245 /* prepare the suffix */
247 sLen
= nfs4_prepare(suffix
, suffixLen
, s
, sCapacity
, NFS4_MIXED_PREP_SUFFIX
, parseError
, status
);
248 if(*status
== U_BUFFER_OVERFLOW_ERROR
){
249 *status
= U_ZERO_ERROR
;
250 s
= (char*) malloc(pLen
);
252 *status
= U_MEMORY_ALLOCATION_ERROR
;
255 sLen
= nfs4_prepare(suffix
, suffixLen
, s
, sLen
, NFS4_MIXED_PREP_SUFFIX
, parseError
, status
);
258 reqLen
= pLen
+sLen
+1 /* for the delimiter */;
259 if(dest
!= NULL
&& reqLen
<= destCapacity
){
260 memmove(dest
, p
, pLen
);
263 dest
[pLen
++] = PREFIX_SUFFIX_SEPARATOR
;
264 memmove(dest
+pLen
, s
, sLen
);
276 return u_terminateChars(dest
, destCapacity
, reqLen
, status
);
280 nfs4_cis_prepare( const char* src
, int32_t srcLength
,
281 char* dest
, int32_t destCapacity
,
282 UParseError
* parseError
,
284 return nfs4_prepare(src
, srcLength
, dest
, destCapacity
, NFS4_CIS_PREP
, parseError
, status
);
289 nfs4_cs_prepare( const char* src
, int32_t srcLength
,
290 char* dest
, int32_t destCapacity
,
291 UBool isCaseSensitive
,
292 UParseError
* parseError
,
295 return nfs4_prepare(src
, srcLength
, dest
, destCapacity
, NFS4_CS_PREP_CS
, parseError
, status
);
297 return nfs4_prepare(src
, srcLength
, dest
, destCapacity
, NFS4_CS_PREP_CI
, parseError
, status
);
303 * Hey, Emacs, please set the following:
306 * indent-tabs-mode: nil