Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "OVR_String.h"
00017 #include "OVR_UTF8Util.h"
00018
00019 namespace OVR {
00020
00021
00022
00023
00024
00025 void ScanFilePath(const char* url, const char** pfilename, const char** pext)
00026 {
00027 const char* urlStart = url;
00028 const char *filename = 0;
00029 const char *lastDot = 0;
00030
00031 UInt32 charVal = UTF8Util::DecodeNextChar(&url);
00032
00033 while (charVal != 0)
00034 {
00035 if ((charVal == '/') || (charVal == '\\'))
00036 {
00037 filename = url;
00038 lastDot = 0;
00039 }
00040 else if (charVal == '.')
00041 {
00042 lastDot = url - 1;
00043 }
00044
00045 charVal = UTF8Util::DecodeNextChar(&url);
00046 }
00047
00048 if (pfilename)
00049 {
00050
00051 if (urlStart && (*urlStart != '.') && *urlStart)
00052 *pfilename = urlStart;
00053 else
00054 *pfilename = filename;
00055 }
00056
00057 if (pext)
00058 {
00059 *pext = lastDot;
00060 }
00061 }
00062
00063
00064
00065
00066 const char* ScanPathProtocol(const char* url)
00067 {
00068 UInt32 charVal = UTF8Util::DecodeNextChar(&url);
00069 UInt32 charVal2;
00070
00071 while (charVal != 0)
00072 {
00073
00074 if (charVal == ':')
00075 {
00076 charVal2 = UTF8Util::DecodeNextChar(&url);
00077 charVal = UTF8Util::DecodeNextChar(&url);
00078 if ((charVal == '/') && (charVal2 == '\\'))
00079 return url;
00080 }
00081 charVal = UTF8Util::DecodeNextChar(&url);
00082 }
00083 return 0;
00084 }
00085
00086
00087
00088
00089
00090 bool String::HasAbsolutePath(const char* url)
00091 {
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 if (!url || !*url)
00108 return true;
00109
00110 UInt32 charVal = UTF8Util::DecodeNextChar(&url);
00111
00112
00113 if ((charVal == '/') || (charVal == '\\'))
00114 return true;
00115
00116 while (charVal != 0)
00117 {
00118
00119 if (charVal == ':')
00120 {
00121 charVal = UTF8Util::DecodeNextChar(&url);
00122
00123 if ((charVal == '/') || (charVal == '\\'))
00124 return true;
00125 }
00126 else if ((charVal == '/') || (charVal == '\\'))
00127 {
00128
00129
00130 break;
00131 }
00132
00133 charVal = UTF8Util::DecodeNextChar(&url);
00134 }
00135
00136
00137 return false;
00138 }
00139
00140
00141 bool String::HasExtension(const char* path)
00142 {
00143 const char* ext = 0;
00144 ScanFilePath(path, 0, &ext);
00145 return ext != 0;
00146 }
00147 bool String::HasProtocol(const char* path)
00148 {
00149 return ScanPathProtocol(path) != 0;
00150 }
00151
00152
00153 String String::GetPath() const
00154 {
00155 const char* filename = 0;
00156 ScanFilePath(ToCStr(), &filename, 0);
00157
00158
00159
00160
00161 return String(ToCStr(), filename ? (filename-ToCStr()) : GetSize());
00162 }
00163
00164 String String::GetProtocol() const
00165 {
00166 const char* protocolEnd = ScanPathProtocol(ToCStr());
00167 return String(ToCStr(), protocolEnd ? (protocolEnd-ToCStr()) : 0);
00168 }
00169
00170 String String::GetFilename() const
00171 {
00172 const char* filename = 0;
00173 ScanFilePath(ToCStr(), &filename, 0);
00174 return String(filename);
00175 }
00176 String String::GetExtension() const
00177 {
00178 const char* ext = 0;
00179 ScanFilePath(ToCStr(), 0, &ext);
00180 return String(ext);
00181 }
00182
00183 void String::StripExtension()
00184 {
00185 const char* ext = 0;
00186 ScanFilePath(ToCStr(), 0, &ext);
00187 if (ext)
00188 {
00189 *this = String(ToCStr(), ext-ToCStr());
00190 }
00191 }
00192
00193 void String::StripProtocol()
00194 {
00195 const char* protocol = ScanPathProtocol(ToCStr());
00196 if (protocol)
00197 AssignString(protocol, OVR_strlen(protocol));
00198 }
00199
00200 }