2 *******************************************************************************
4 * Copyright (C) 2003, 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
);
136 syntaxError( const UChar
* rules
,
139 UParseError
* parseError
){
141 if(parseError
== NULL
){
144 if(pos
== rulesLen
&& rulesLen
>0){
147 parseError
->offset
= pos
;
148 parseError
->line
= 0 ; /* we are not using line numbers */
150 /* for pre-context */
151 start
= (pos
<=U_PARSE_CONTEXT_LEN
)? 0 : (pos
- (U_PARSE_CONTEXT_LEN
-1));
154 u_memcpy(parseError
->preContext
,rules
+start
,stop
-start
);
155 /* null terminate the buffer */
156 parseError
->preContext
[stop
-start
] = 0;
158 /* for post-context */
161 U16_FWD_1(rules
, start
, rulesLen
);
164 stop
= ((pos
+U_PARSE_CONTEXT_LEN
)<= rulesLen
)? (pos
+(U_PARSE_CONTEXT_LEN
)) :
167 u_memcpy(parseError
->postContext
,rules
+start
,stop
-start
);
168 /* null terminate the buffer */
169 parseError
->postContext
[stop
-start
]= 0;
175 /* sorted array for binary search*/
176 static const char* special_prefixes
[]={
177 "\x0041\x004e\x004f\x004e\x0059\x004d\x004f\x0055\x0053",
178 "\x0041\x0055\x0054\x0048\x0045\x004e\x0054\x0049\x0043\x0041\x0054\x0045\x0044",
179 "\x0042\x0041\x0054\x0043\x0048",
180 "\x0044\x0049\x0041\x004c\x0055\x0050",
181 "\x0045\x0056\x0045\x0052\x0059\x004f\x004e\x0045",
182 "\x0047\x0052\x004f\x0055\x0050",
183 "\x0049\x004e\x0054\x0045\x0052\x0041\x0043\x0054\x0049\x0056\x0045",
184 "\x004e\x0045\x0054\x0057\x004f\x0052\x004b",
185 "\x004f\x0057\x004e\x0045\x0052",
189 /* binary search the sorted array */
191 findStringIndex(const char* const *sortedArr
, int32_t sortedArrLen
, const char* target
, int32_t targetLen
){
193 int left
, middle
, right
,rc
;
196 right
= sortedArrLen
-1;
198 while(left
<= right
){
199 middle
= (left
+right
)/2;
200 rc
=strncmp(sortedArr
[middle
],target
, targetLen
);
214 getPrefixSuffix(const char *src
, int32_t srcLength
,
215 const char **prefix
, int32_t *prefixLen
,
216 const char **suffix
, int32_t *suffixLen
,
222 if(src
[i
] == PREFIX_SUFFIX_SEPARATOR
){
223 if((i
+1) == srcLength
){
224 /* we reached the end of the string */
229 i
++;/* the prefix contains the separator */
236 *suffixLen
= srcLength
- i
;
237 /* special prefixes must not be followed by suffixes! */
238 if((findStringIndex(special_prefixes
,LENGTHOF(special_prefixes
), *prefix
, *prefixLen
-1) != -1) && (*suffix
!= NULL
)){
239 *status
= U_PARSE_ERROR
;
246 nfs4_mixed_prepare( const char* src
, int32_t srcLength
,
247 char* dest
, int32_t destCapacity
,
248 UParseError
* parseError
,
251 const char *prefix
= NULL
, *suffix
= NULL
;
252 int32_t prefixLen
=0, suffixLen
=0;
253 char pStack
[NFS4_MAX_BUFFER_SIZE
],
254 sStack
[NFS4_MAX_BUFFER_SIZE
];
255 char *p
=pStack
, *s
=sStack
;
256 int32_t pLen
=0, sLen
=0, reqLen
=0,
257 pCapacity
= NFS4_MAX_BUFFER_SIZE
,
258 sCapacity
= NFS4_MAX_BUFFER_SIZE
;
261 if(status
==NULL
|| U_FAILURE(*status
)){
264 if((src
==NULL
) || (srcLength
< -1) || (destCapacity
<0) || (!dest
&& destCapacity
> 0)){
265 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
269 srcLength
= (int32_t)strlen(src
);
271 getPrefixSuffix(src
, srcLength
, &prefix
, &prefixLen
, &suffix
, &suffixLen
, status
);
273 /* prepare the prefix */
274 pLen
= nfs4_prepare(prefix
, prefixLen
, p
, pCapacity
, NFS4_MIXED_PREP_PREFIX
, parseError
, status
);
275 if(*status
== U_BUFFER_OVERFLOW_ERROR
){
276 *status
= U_ZERO_ERROR
;
277 p
= (char*) malloc(pLen
);
279 *status
= U_MEMORY_ALLOCATION_ERROR
;
282 pLen
= nfs4_prepare(prefix
, prefixLen
, p
, pLen
, NFS4_MIXED_PREP_PREFIX
, parseError
, status
);
285 /* prepare the suffix */
287 sLen
= nfs4_prepare(suffix
, suffixLen
, s
, sCapacity
, NFS4_MIXED_PREP_SUFFIX
, parseError
, status
);
288 if(*status
== U_BUFFER_OVERFLOW_ERROR
){
289 *status
= U_ZERO_ERROR
;
290 s
= (char*) malloc(pLen
);
292 *status
= U_MEMORY_ALLOCATION_ERROR
;
295 sLen
= nfs4_prepare(suffix
, suffixLen
, s
, sLen
, NFS4_MIXED_PREP_SUFFIX
, parseError
, status
);
298 reqLen
= pLen
+sLen
+1 /* for the delimiter */;
299 if(dest
!= NULL
&& reqLen
<= destCapacity
){
300 memmove(dest
, p
, pLen
);
303 dest
[pLen
++] = PREFIX_SUFFIX_SEPARATOR
;
304 memmove(dest
+pLen
, s
, sLen
);
316 return u_terminateChars(dest
, destCapacity
, reqLen
, status
);
320 nfs4_cis_prepare( const char* src
, int32_t srcLength
,
321 char* dest
, int32_t destCapacity
,
322 UParseError
* parseError
,
324 return nfs4_prepare(src
, srcLength
, dest
, destCapacity
, NFS4_CIS_PREP
, parseError
, status
);
329 nfs4_cs_prepare( const char* src
, int32_t srcLength
,
330 char* dest
, int32_t destCapacity
,
331 UBool isCaseSensitive
,
332 UParseError
* parseError
,
335 return nfs4_prepare(src
, srcLength
, dest
, destCapacity
, NFS4_CS_PREP_CS
, parseError
, status
);
337 return nfs4_prepare(src
, srcLength
, dest
, destCapacity
, NFS4_CS_PREP_CI
, parseError
, status
);
343 * Hey, Emacs, please set the following:
346 * indent-tabs-mode: nil