xref: /haiku/src/add-ons/kernel/file_systems/udf/UdfString.h (revision 820dca4df6c7bf955c46e8f6521b9408f50b2900)
1 //----------------------------------------------------------------------
2 //  This software is part of the OpenBeOS distribution and is covered
3 //  by the OpenBeOS license.
4 //
5 //  Copyright (c) 2003 Tyler Dauwalder, tyler@dauwalder.net
6 //---------------------------------------------------------------------
7 
8 #ifndef _UDF_STRING_H
9 #define _UDF_STRING_H
10 
11 #include <stdio.h>
12 
13 
14 #include "Array.h"
15 #include "UdfDebug.h"
16 
17 #include <string.h>
18 
19 #include <util/kernel_cpp.h>
20 /*! \brief UdfString class that takes as input either a UTF8 string or a
21 	CS0 unicode string and then provides access to said string in both
22 	formats.
23 
24 	For CS0 info, see: ECMA-167 1/7.2.2 (not very helpful), UDF-2.01 2.1.1
25 */
26 class UdfString {
27 public:
28 						UdfString();
29 						UdfString(const char *utf8);
30 						UdfString(const char *cs0, uint32 length);
31 
32 	template <uint32 length>
33 						UdfString(const array<char, length> &dString);
34 						~UdfString();
35 
36 	void				SetTo(const char *utf8);
37 	void				SetTo(const char *cs0, uint32 length);
38 	template <uint32 length>
39 	void				SetTo(const array<char, length> &dString);
40 
41 	template <uint32 length>
42 	UdfString&			operator=(const array<char, length> &dString);
43 
44 	const char			*Cs0() const { return fCs0String; }
45 	const char			*Utf8() const { return fUtf8String; }
46 	uint32				Cs0Length() const { return fCs0Length; }
47 	uint32				Utf8Length() const { return fUtf8String ? strlen(fUtf8String) : 0; }
48 
49 private:
50 	void				_Clear();
51 
52 	char				*fCs0String;
53 	uint32				fCs0Length;
54 	char				*fUtf8String;
55 };
56 
57 /*! \brief Creates a new UdfString object from the given d-string.
58 */
59 template <uint32 length>
60 UdfString::UdfString(const array<char, length> &dString)
61 	: fCs0String(NULL)
62 	, fUtf8String(NULL)
63 {
64 	TRACE(("UdfString::UdfString: dString.length(): %ld", dString.length()));
65 	SetTo(dString);
66 }
67 
68 /*! \brief Assignment from a d-string.
69 
70 	The last byte of a d-string specifies the data length of the
71 	enclosed Cs0 string.
72 */
73 template <uint32 length>
74 void
75 UdfString::SetTo(const array<char, length> &dString)
76 {
77 	uint8 dataLength = dString.length() == 0
78 		? 0 : reinterpret_cast<const uint8 *>(dString.data)[dString.length() - 1];
79 	if (dataLength == 0
80 		|| dataLength == 1 /* technically illegal, but... */) {
81 		SetTo(NULL);
82 	} else {
83 		if (dataLength > dString.length() - 1)
84 			dataLength = dString.length() - 1;
85 		SetTo(reinterpret_cast<const char *>(dString.data), dataLength);
86 	}
87 }
88 
89 /*! \brief Assignment from a d-string.
90 */
91 template <uint32 length>
92 UdfString&
93 UdfString::operator=(const array<char, length> &dString)
94 {
95 	SetTo(dString);
96 	return *this;
97 }
98 
99 #endif	// _UDF_STRING_H
100