/*! \internal */ int QJisCodec::heuristicNameMatch(const char* hint) const { int score = 0; bool ja = FALSE; if (qstrnicmp(hint, "ja_JP", 5) == 0 || qstrnicmp(hint, "japan", 5) == 0) { score += 3; ja = TRUE; } else if (qstrnicmp(hint, "ja", 2) == 0) { score += 2; ja = TRUE; } const char *p; if (ja) { p = strchr(hint, '.'); if (p == 0) { return score - 2; } p++; } else { p = hint; } if (p) { if ((qstricmp(p, "JIS") == 0) || (qstricmp(p, "JIS7") == 0) || (simpleHeuristicNameMatch("ISO-2022-JP", p) > 0)) { return score + 4; } } return QTextCodec::heuristicNameMatch(hint); }
/*! Returns the name of a local file equivalent to \a url, or a null string if \a url is not a local file. */ QString QUrlDrag::urlToLocalFile(const char* url) { QString result; if ( url && 0==qstrnicmp(url,"file:/",6) ) { url += 6; if ( url[0] != '/' || url[1] == '/' ) { // It is local. while (*url) { switch (*url) { case '|': result += ':'; break; case '+': result += ' '; break; case '%': { int ch = url[1]; if ( ch && url[2] ) { ch = htod(ch)*16 + htod(url[2]); result += ch; } } break; default: result += *url; } ++url; } } } return result; }
/*! Returns the name of a local file equivalent to \a uri, or a null string if \a uri is not a local file. \sa localFileToUri() */ QString QUriDrag::uriToLocalFile(const char* uri) { QString file; if ( uri && 0==qstrnicmp(uri,"file:/",6) ) { uri += 6; if ( uri[0] != '/' || uri[1] == '/' ) { // It is local. file = uriToUnicodeUri(uri); if ( uri[1] == '/' ) { file.remove(0,1); } else { file.insert(0,'/'); } #ifdef _WS_WIN_ if ( file.length() > 2 && file[0] == '/' && file[2] == '|' ) { file[2] = ':'; file.remove(0,1); } // Leave slash as slashes. #endif } } return file; }
int SCString::findRev( const char *str, int index, bool cs) const { int slen = qstrlen(str); uint len = length(); if ( index < 0 ) // neg index ==> start from end index = len-slen; else if ( (uint)index > len ) // bad index return -1; else if ( (uint)(index + slen) > len ) // str would be too long index = len - slen; if ( index < 0 ) return -1; register char *d = m_data + index; if ( cs ) // case sensitive { for ( int i=index; i>=0; i-- ) if ( qstrncmp(d--,str,slen)==0 ) return i; } else // case insensitive { for ( int i=index; i>=0; i-- ) if ( qstrnicmp(d--,str,slen)==0 ) return i; } return -1; }
int SCString::find( const char *str, int index, bool cs ) const { uint l = length(); if ( m_data==0 || (uint)index > l ) // index outside string return -1; if ( !str ) // no search string return -1; if ( !*str ) // zero-length search string return index; register const char *d; if ( cs ) // case sensitive { d = strstr( m_data+index, str ); } else // case insensitive { d = m_data+index; int len = qstrlen( str ); while ( *d ) { if ( qstrnicmp(d, str, len) == 0 ) break; d++; } if ( !*d ) // not found d = 0; } return d ? (int)(d - m_data) : -1; }
static QTextCodec *loadQtCodec(const char *name) { if (!strcmp(name, "UTF-8")) return new QUtf8Codec; if (!strcmp(name, "UTF-16")) return new QUtf16Codec; if (!strcmp(name, "ISO-8859-1")) return new QLatin1Codec; if (!strcmp(name, "UTF-16BE")) return new QUtf16BECodec; if (!strcmp(name, "UTF-16LE")) return new QUtf16LECodec; if (!strcmp(name, "UTF-32")) return new QUtf32Codec; if (!strcmp(name, "UTF-32BE")) return new QUtf32BECodec; if (!strcmp(name, "UTF-32LE")) return new QUtf32LECodec; #ifndef QT_NO_CODECS if (!strcmp(name, "TSCII")) return new QTsciiCodec; if (!qstrnicmp(name, "iscii", 5)) return QIsciiCodec::create(name); #endif return 0; }
/*! Returns TRUE if the information in \a e can be decoded into a QString. \sa decode() */ bool QTextDrag::canDecode( const QMimeSource* e ) { const char* f; for (int i=0; (f=e->format(i)); i++) { if ( 0==qstrnicmp(f,"text/",5) ) { return findcodec(e) != 0; } } return 0; }
QByteArray QImageDrag::encodedData(const char* fmt) const { if ( qstrnicmp( fmt, "image/", 6 )==0 ) { QString f = fmt+6; QByteArray data; QBuffer w( data ); w.open( IO_WriteOnly ); QImageIO io( &w, f.upper() ); io.setImage( img ); if ( !io.write() ) return QByteArray(); w.close(); return data; } else { return QByteArray(); } }
/*! \reimp */ QByteArray QTextDrag::encodedData(const char* mime) const { QCString r; if ( 0==qstrnicmp(mime,"text/",5) ) { QCString m(mime); m = m.lower(); QTextCodec *codec = findcharset(m); if ( !codec ) return r; r = codec->fromUnicode(d->txt); if (!codec || codec->mibEnum() != 1000) { // Don't include NUL in size (QCString::resize() adds NUL) ((QByteArray&)r).resize(r.length()); } } return r; }
int QCString::findRev( const char *str, int index, bool cs) const { int slen = qstrlen(str); int len = length(); if (index<0) index = len-slen; // start from end else if (index>len) return -1; // bad index else if (index+slen>len) index=len-slen; // str would be too long if (index<0) return -1; // no match possible register const char *pos = data()+index; if (cs) // case sensitive { for (int i=index; i>=0; i--) if (qstrncmp(pos--,str,slen)==0) return i; } else // case insensitive { for (int i=index; i>=0; i--) if (qstrnicmp(pos,str,slen)==0) return i; } return -1; }
int QCString::contains( const char *str, bool cs ) const { if (str==0 || length()==0) return 0; int count=0; const char *pos = data(); int len = qstrlen(str); while (*pos) { if (cs) { if (qstrncmp(pos,str,len)==0) count++; } else { if (qstrnicmp(pos,str,len)==0) count++; } pos++; } return count; }
/*! Attempts to decode the dropped information in \a e into \a str, returning TRUE if successful. If \a subtype is null, any text subtype is accepted, otherwise only that specified is accepted. \a subtype is set to the accepted subtype. \sa canDecode() */ bool QTextDrag::decode( const QMimeSource* e, QString& str, QCString& subtype ) { const char* mime; for (int i=0; (mime = e->format(i)); i++) { if ( 0==qstrnicmp(mime,"text/",5) ) { QCString m(mime); m = m.lower(); int semi = m.find(';'); if ( semi < 0 ) semi = m.length(); QCString foundst = m.mid(5,semi-5); if ( subtype.isNull() || foundst == subtype ) { QTextCodec* codec = findcharset(m); if ( codec ) { QByteArray payload; payload = e->encodedData(mime); if ( payload.size() ) { int l; if ( codec->mibEnum() != 1000) { // length is at NUL or payload.size() l = 0; while ( l < (int)payload.size() && payload[l] ) l++; } else { l = payload.size(); } str = codec->toUnicode(payload,l); if ( subtype.isNull() ) subtype = foundst; return TRUE; } } } } } return FALSE; }
bool qt_cl_has_extension(const char *list, size_t listLen, const char *name) { size_t nameLen = qstrlen(name); size_t tempLen; while (listLen > 0) { if (*list == '\0') { break; } else if (*list == ' ') { ++list; --listLen; continue; } tempLen = 0; while (tempLen < listLen && list[tempLen] != ' ' && list[tempLen] != '\0') ++tempLen; if (nameLen == tempLen && !qstrnicmp(list, name, nameLen)) return true; list += tempLen; listLen -= tempLen; } return false; }
int SCString::contains( const char *str, bool cs ) const { int count = 0; char *d = data(); if ( !d ) return 0; int len = qstrlen( str ); while ( *d ) // counts overlapping strings { if ( cs ) { if ( qstrncmp( d, str, len ) == 0 ) count++; } else { if ( qstrnicmp(d, str, len) == 0 ) count++; } d++; } return count; }
int QCString::find( const char *str, int index, bool cs ) const { int l = length(); if (index<0 || index>=l) return -1; // index outside string if (!str) return -1; // no string to search for if (!*str) return index; // empty string matching at index register const char *pos; if (cs) // case sensitive { pos = strstr(data()+index,str); } else // case insensitive { pos = data(); int len = qstrlen(str); while (*pos) { if (qstrnicmp(pos,str,len)==0) break; pos++; } if (!*pos) pos = 0; // not found } return pos ? (int)(pos - data()) : -1; }
int QKoi8Codec::heuristicNameMatch(const char* hint) const { if ( qstrnicmp(hint,"koi8",4)==0 ) return 2; return QTextCodec::heuristicNameMatch(hint); }
// Odd case where 'exec' is allowed to be 0, to accomodate a caller in WebCore. static double parseDateFromNullTerminatedCharacters(const char* dateString, bool& haveTZ, int& offset) { haveTZ = false; offset = 0; // This parses a date in the form: // Tuesday, 09-Nov-99 23:12:40 GMT // or // Sat, 01-Jan-2000 08:00:00 GMT // or // Sat, 01 Jan 2000 08:00:00 GMT // or // 01 Jan 99 22:00 +0100 (exceptions in rfc822/rfc2822) // ### non RFC formats, added for Javascript: // [Wednesday] January 09 1999 23:12:40 GMT // [Wednesday] January 09 23:12:40 GMT 1999 // // We ignore the weekday. // Skip leading space skipSpacesAndComments(dateString); long month = -1; const char *wordStart = dateString; // Check contents of first words if not number while (*dateString && !isASCIIDigit(*dateString)) { if (isASCIISpace(*dateString) || *dateString == '(') { if (dateString - wordStart >= 3) month = findMonth(wordStart); skipSpacesAndComments(dateString); wordStart = dateString; } else dateString++; } // Missing delimiter between month and day (like "January29")? if (month == -1 && wordStart != dateString) month = findMonth(wordStart); skipSpacesAndComments(dateString); if (!*dateString) return NaN; // ' 09-Nov-99 23:12:40 GMT' char* newPosStr; long day; if (!parseLong(dateString, &newPosStr, 10, &day)) return NaN; dateString = newPosStr; if (!*dateString) return NaN; if (day < 0) return NaN; long year = 0; if (day > 31) { // ### where is the boundary and what happens below? if (*dateString != '/') return NaN; // looks like a YYYY/MM/DD date if (!*++dateString) return NaN; year = day; if (!parseLong(dateString, &newPosStr, 10, &month)) return NaN; month -= 1; dateString = newPosStr; if (*dateString++ != '/' || !*dateString) return NaN; if (!parseLong(dateString, &newPosStr, 10, &day)) return NaN; dateString = newPosStr; } else if (*dateString == '/' && month == -1) { dateString++; // This looks like a MM/DD/YYYY date, not an RFC date. month = day - 1; // 0-based if (!parseLong(dateString, &newPosStr, 10, &day)) return NaN; if (day < 1 || day > 31) return NaN; dateString = newPosStr; if (*dateString == '/') dateString++; if (!*dateString) return NaN; } else { if (*dateString == '-') dateString++; skipSpacesAndComments(dateString); if (*dateString == ',') dateString++; if (month == -1) { // not found yet month = findMonth(dateString); if (month == -1) return NaN; while (*dateString && *dateString != '-' && *dateString != ',' && !isASCIISpace(*dateString)) dateString++; if (!*dateString) return NaN; // '-99 23:12:40 GMT' if (*dateString != '-' && *dateString != '/' && *dateString != ',' && !isASCIISpace(*dateString)) return NaN; dateString++; } } if (month < 0 || month > 11) return NaN; // '99 23:12:40 GMT' if (year <= 0 && *dateString) { if (!parseLong(dateString, &newPosStr, 10, &year)) return NaN; } // Don't fail if the time is missing. long hour = 0; long minute = 0; long second = 0; if (!*newPosStr) dateString = newPosStr; else { // ' 23:12:40 GMT' if (!(isASCIISpace(*newPosStr) || *newPosStr == ',')) { if (*newPosStr != ':') return NaN; // There was no year; the number was the hour. year = -1; } else { // in the normal case (we parsed the year), advance to the next number dateString = ++newPosStr; skipSpacesAndComments(dateString); } parseLong(dateString, &newPosStr, 10, &hour); // Do not check for errno here since we want to continue // even if errno was set becasue we are still looking // for the timezone! // Read a number? If not, this might be a timezone name. if (newPosStr != dateString) { dateString = newPosStr; if (hour < 0 || hour > 23) return NaN; if (!*dateString) return NaN; // ':12:40 GMT' if (*dateString++ != ':') return NaN; if (!parseLong(dateString, &newPosStr, 10, &minute)) return NaN; dateString = newPosStr; if (minute < 0 || minute > 59) return NaN; // ':40 GMT' if (*dateString && *dateString != ':' && !isASCIISpace(*dateString)) return NaN; // seconds are optional in rfc822 + rfc2822 if (*dateString ==':') { dateString++; if (!parseLong(dateString, &newPosStr, 10, &second)) return NaN; dateString = newPosStr; if (second < 0 || second > 59) return NaN; } skipSpacesAndComments(dateString); if (qstrnicmp(dateString, "AM", 2) == 0) { if (hour > 12) return NaN; if (hour == 12) hour = 0; dateString += 2; skipSpacesAndComments(dateString); } else if (qstrnicmp(dateString, "PM", 2) == 0) { if (hour > 12) return NaN; if (hour != 12) hour += 12; dateString += 2; skipSpacesAndComments(dateString); } } } // Don't fail if the time zone is missing. // Some websites omit the time zone (4275206). if (*dateString) { if (qstrnicmp(dateString, "GMT", 3) == 0 || qstrnicmp(dateString, "UTC", 3) == 0) { dateString += 3; haveTZ = true; } if (*dateString == '+' || *dateString == '-') { long o; if (!parseLong(dateString, &newPosStr, 10, &o)) return NaN; dateString = newPosStr; if (o < -9959 || o > 9959) return NaN; int sgn = (o < 0) ? -1 : 1; o = labs(o); if (*dateString != ':') { offset = ((o / 100) * 60 + (o % 100)) * sgn; } else { // GMT+05:00 long o2; if (!parseLong(dateString, &newPosStr, 10, &o2)) return NaN; dateString = newPosStr; offset = (o * 60 + o2) * sgn; } haveTZ = true; } else { for (int i = 0; i < int(sizeof(known_zones) / sizeof(KnownZone)); i++) { if (0 == qstrnicmp(dateString, known_zones[i].tzName, strlen(known_zones[i].tzName))) { offset = known_zones[i].tzOffset; dateString += strlen(known_zones[i].tzName); haveTZ = true; break; } } } } skipSpacesAndComments(dateString); if (*dateString && year == -1) { if (!parseLong(dateString, &newPosStr, 10, &year)) return NaN; dateString = newPosStr; } skipSpacesAndComments(dateString); // Trailing garbage if (*dateString) return NaN; // Y2K: Handle 2 digit years. if (year >= 0 && year < 100) { if (year < 50) year += 2000; else year += 1900; } return ymdhmsToSeconds(year, month + 1, day, hour, minute, second) * msPerSecond; }
/** * There is no overloads to QByteArray::startWith that takes Qt::CaseInsensitive. * Returns true if 'a' starts with 'b' in a case insensitive way */ static bool startsWithInsensitive(const QByteArray &a, const char *b) { int len = strlen(b); return a.size() >= len && qstrnicmp(a.constData(), b, len) == 0; }