diff options
Diffstat (limited to 'sip/qt/qstring.sip')
-rw-r--r-- | sip/qt/qstring.sip | 525 |
1 files changed, 211 insertions, 314 deletions
diff --git a/sip/qt/qstring.sip b/sip/qt/qstring.sip index ab30fa4..581bb0a 100644 --- a/sip/qt/qstring.sip +++ b/sip/qt/qstring.sip @@ -195,53 +195,8 @@ public: static const TQChar replacement; static const TQChar byteOrderMark; static const TQChar byteOrderSwapped; -%If (TQt_2_2_0 -) static const TQChar nbsp; -%End -%If (- TQt_3_0_0) - enum Category { - NoCategory, - - Mark_NonSpacing, - Mark_SpacingCombining, - Mark_Enclosing, - - Number_DecimalDigit, - Number_Letter, - Number_Other, - - Separator_Space, - Separator_Line, - Separator_Paragraph, - - Other_Control, - Other_Format, - Other_Surrogate, - Other_PrivateUse, - Other_NotAssigned, - - Letter_Uppercase, - Letter_Lowercase, - Letter_Titlecase, - Letter_Modifier, - Letter_Other, - - Punctuation_Connector, - Punctuation_Dask, - Punctuation_Open, - Punctuation_Close, - Punctuation_InitialQuote, - Punctuation_FinalQuote, - Punctuation_Other, - - Symbol_Math, - Symbol_Currency, - Symbol_Modifier, - Symbol_Other - }; -%End -%If (TQt_3_0_0 -) enum Category { NoCategory, @@ -282,24 +237,7 @@ public: Symbol_Modifier, Symbol_Other }; -%End -%If (- TQt_3_0_0) - enum Direction { - DirL, - DirR, - DirEN, - DirES, - DirET, - DirAN, - DirCS, - DirB, - DirS, - DirWS, - DirON - }; -%End -%If (TQt_3_0_0 -) enum Direction { DirL, DirR, @@ -321,7 +259,6 @@ public: DirNSM, DirBN }; -%End enum Decomposition { Single, @@ -351,7 +288,6 @@ public: Center }; -%If (TQt_3_0_0 -) enum CombiningClass { Combining_BelowLeftAttached, Combining_BelowAttached, @@ -375,7 +311,6 @@ public: Combining_DoubleAbove, Combining_IotaSubscript }; -%End int digitValue() const; TQChar lower() const; @@ -385,19 +320,10 @@ public: Direction direction() const; Joining joining() const; bool mirrored() const; -%If (TQt_2_1_0 -) TQChar mirroredChar() const; -%End -%If (- TQt_3_0_0) - TQString decomposition() const; -%End -%If (TQt_3_0_0 -) const TQString &decomposition() const; -%End Decomposition decompositionTag() const; -%If (TQt_3_0_0 -) unsigned char combiningClass() const; -%End char latin1() const; ushort unicode() const; @@ -409,22 +335,16 @@ public: bool isMark() const; bool isLetter() const; bool isNumber() const; -%If (TQt_2_1_0 -) bool isLetterOrNumber() const; -%End bool isDigit() const; -%If (TQt_3_0_0 -) bool isSymbol() const; -%End // uchar& cell(); // uchar& row(); uchar cell() const; uchar row() const; -%If (TQt_3_0_0 -) void setCell(uchar); void setRow(uchar); -%End static bool networkOrdered(); }; @@ -447,6 +367,7 @@ class TQString { %TypeHeaderCode #include <tqstring.h> +#include <tqtextcodec.h> %End public: @@ -457,18 +378,14 @@ public: // TQString(const TQChar *,uint); // TQString(const char *); -%If (TQt_2_1_0 -) // This is how we implement TQUrl::operator TQString() const. TQString(const TQUrl &); -%End -%If (TQt_3_0_0 -) // This is how we implement TQKeySequence::operator TQString() const. TQString(const TQKeySequence &); // This is how we implement TQUuid::operator TQString() const. TQString(const TQUuid &); -%End static const TQString null; @@ -476,20 +393,13 @@ public: bool isEmpty() const; uint length() const; void truncate(uint); -%If (- TQt_3_0_0) - void fill(TQChar,int = -1); -%End -%If (TQt_3_0_0 -) TQString &fill(TQChar,int = -1); -%End TQString copy() const; TQString arg(int /Constrained/,int = 0,int = 10) const; TQString arg(double /Constrained/,int = 0,char = 'g',int = -1) const; -%If (TQt_3_2_0 -) // TQString arg(TQ_LLONG,int = 0,int = 10) const; // TQString arg(TQ_ULLONG,int = 0,int = 10) const; -%End TQString arg(long,int = 0,int = 10) const; TQString arg(ulong,int = 0,int = 10) const; // TQString arg(uint,int = 0,int = 10) const; @@ -498,12 +408,10 @@ public: TQString arg(char,int = 0) const; TQString arg(TQChar,int = 0) const; TQString arg(const TQString&,int = 0) const; -%If (TQt_3_2_0 -) TQString arg(const TQString &,const TQString &) const; TQString arg(const TQString &,const TQString &,const TQString &) const; TQString arg(const TQString &,const TQString &,const TQString &, const TQString &) const; -%End // TQString &sprintf(const char *,...); @@ -523,7 +431,6 @@ public: int contains(const TQString &,bool = 1) const; int contains(const TQRegExp &) const; -%If (TQt_3_0_0 -) enum SectionFlags { SectionDefault, SectionSkipEmpty, @@ -540,7 +447,6 @@ public: int = SectionDefault) const; TQString section(const TQRegExp &,int,int = 0xffffffff, int = SectionDefault) const; -%End TQString left(uint) const; TQString right(uint) const; @@ -553,56 +459,36 @@ public: TQString simplifyWhiteSpace() const; TQString &insert(uint,const TQString &); -%If (TQt_3_2_0 -) TQString &insert(uint,const TQByteArray &); // TQString &insert(uint,const char *); -%End TQString &insert(uint,TQChar *,uint); TQString &insert(uint,TQChar); TQString &insert(uint,char); TQString &append(char); -%If (TQt_2_2_0 -) TQString &append(TQChar); -%End TQString &append(const TQString &); TQString &prepend(char); -%If (TQt_2_2_0 -) TQString &prepend(TQChar); -%End TQString &prepend(const TQString &); TQString &remove(uint,uint); -%If (TQt_3_1_0 -) TQString &remove(const TQString &); -%If (TQt_3_2_0 -) TQString &remove(const TQString &,bool); -%End TQString &remove(TQChar); TQString &remove(char); TQString &remove(const TQRegExp &); -%End TQString &replace(uint,uint,const TQString &); TQString &replace(uint,uint,const TQChar *,uint); -%If (TQt_3_1_0 -) TQString &replace(uint,uint,TQChar); TQString &replace(uint,uint,char); TQString &replace(TQChar,const TQString &); -%If (TQt_3_2_0 -) TQString &replace(TQChar,const TQString &,bool); -%End TQString &replace(char,const TQString &); -%If (TQt_3_2_0 -) TQString &replace(char,const TQString &,bool); -%End TQString &replace(const TQString &,const TQString &); -%If (TQt_3_2_0 -) TQString &replace(const TQString &,const TQString &,bool); -%End -%End TQString &replace(const TQRegExp &,const TQString &); -%If (TQt_3_1_0 -) TQString &replace(TQChar,TQChar); -%End short toShort(bool * = 0,int = 10) const; ushort toUShort(bool * = 0,int = 10) const; @@ -610,10 +496,8 @@ public: uint toUInt(bool * = 0,int = 10) const; long toLong(bool * = 0,int = 10) const; ulong toULong(bool * = 0,int = 10) const; -%If (TQt_3_2_0 -) // TQ_LLONG toLongLong(bool * = 0,int = 10) const; // TQ_ULLONG toULongLong(bool * = 0,int = 10) const; -%End float toFloat(bool * = 0) const; double toDouble(bool * = 0) const; @@ -624,28 +508,22 @@ public: // TQString &setNum(uint,int = 10); TQString &setNum(long,int = 10); TQString &setNum(ulong,int = 10); -%If (TQt_3_2_0 -) // TQString &setNum(TQ_LLONG,int = 10); // TQString &setNum(TQ_ULLONG,int = 10); -%End // TQString &setNum(float,char = 'g',int = 6); static TQString number(int /Constrained/,int = 10); static TQString number(double /Constrained/,char = 'g',int = 6); static TQString number(long,int = 10); static TQString number(ulong,int = 10); -%If (TQt_3_2_0 -) // static TQString number(TQ_LLONG,int = 10); // static TQString number(TQ_ULLONG,int = 10); -%End // static TQString number(uint,int = 10); void setExpand(uint,TQChar); TQString &operator+=(const TQString &); -%If (TQt_3_3_0 -) TQString &operator+=(const TQByteArray &); -%End TQString &operator+=(TQChar); //TQString &operator+=(char); @@ -673,9 +551,7 @@ public: // TQChar &ref(uint); // const TQChar *unicode() const; const char *ascii() const; -%If (TQt_3_1_0 -) static TQString fromAscii(const char *,int = -1); -%End const char *latin1() const; static TQString fromLatin1(const char *,int = -1); TQCString utf8() const; @@ -683,62 +559,34 @@ public: TQCString local8Bit() const; static TQString fromLocal8Bit(const char *,int = -1); -%If (TQt_3_1_0 -) // static TQString fromUcs2(const unsigned short *); // const unsigned short *ucs2() const; -%End -%If (TQt_2_1_0 -) // TQString &setUnicode(const TQChar *,uint); // TQString &setUnicodeCodes(const ushort *,uint); -%End -%If (TQt_3_1_0 -) TQString &setAscii(const char *,int = -1); -%End -%If (TQt_2_1_0 -) TQString &setLatin1(const char *,int = -1); -%End int compare(const TQString &) const; static int compare(const TQString &,const TQString &); -%If (TQt_3_0_0 -) int localeAwareCompare(const TQString &) const; static int localeAwareCompare(const TQString &,const TQString &); -%End void compose(); -%If (- TQt_3_0_0) - TQChar::Direction basicDirection(); - TQString visual(int = 0,int = -1); -%End -%If (TQt_2_2_0 -) bool startsWith(const TQString &) const; -%End -%If (TQt_3_2_0 -) bool startsWith(const TQString &,bool) const; -%End -%If (TQt_3_0_0 -) bool endsWith(const TQString &) const; -%End -%If (TQt_3_2_0 -) bool endsWith(const TQString &,bool) const; -%End -%If (TQt_3_0_0 -) void setLength(uint); -%End -%If (TQt_3_2_0 -) uint capacity() const; void reserve(uint); void squeeze(); -%End -%If (TQt_3_0_0 -) bool simpleText() const; bool isRightToLeft() const; -%End // Force the numeric interpretation so that str + TQString gets handled // as we want. @@ -792,81 +640,12 @@ public: SIP_PYOBJECT __unicode__(); %MethodCode -#if PY_VERSION_HEX >= 0x01060000 - sipRes = TQStringToPyUnicode(sipCpp); -#else - Py_INCREF(Py_None); - sipRes = Py_None; -#endif + sipRes = PyTQt_qt_PyObject_FromTQString(sipCpp); %End SIP_PYOBJECT __str__(); %MethodCode -#if PY_VERSION_HEX >= 0x01060000 - sipRes = TQStringToPyUnicode(sipCpp); -#else - const char *s; - - Py_BEGIN_ALLOW_THREADS - s = *sipCpp; - Py_END_ALLOW_THREADS - - if (s == NULL) - s = ""; - - sipRes = PyString_FromString(s); -#endif -%End - -%TypeCode -#include <tqtextcodec.h> - -#if PY_VERSION_HEX >= 0x01060000 -// Convenience function for converting a TQString to a Python Unicode object. -static PyObject *TQStringToPyUnicode(TQString *qs) -{ - PyObject *uobj; - - if ((uobj = PyUnicode_FromUnicode(NULL,qs -> length())) == NULL) - return NULL; - - Py_UNICODE *pyu = PyUnicode_AS_UNICODE(uobj); - - for (uint i = 0; i < qs -> length(); ++i) - *pyu++ = (qs -> at(i)).unicode(); - - return uobj; -} -#endif - -// Convenience function for converting a Python unicode or string object to a -// TQString on the heap. -static TQString *PyUnicodeStringToTQString(PyObject *py) -{ -#if PY_VERSION_HEX >= 0x01060000 - if (PyUnicode_Check(py)) - { - TQString *qs = new TQString; - -#if defined(Py_UNICODE_WIDE) - PY_UNICODE_TYPE *ucode = PyUnicode_AS_UNICODE(py); - int len = PyUnicode_GET_SIZE(py); - - for (int i = 0; i < len; ++i) - qs->ref(i) = (uint)ucode[i]; -#else - qs -> setUnicodeCodes((ushort *)PyUnicode_AS_UNICODE(py),PyUnicode_GET_SIZE(py)); -#endif - - return qs; - } -#endif - - if (PyString_Check(py)) - return new TQString(PyString_AS_STRING(py)); - - return 0; -} + sipRes = PyTQt_qt_PyObject_FromTQString(sipCpp); %End %ConvertToTypeCode @@ -874,13 +653,11 @@ static TQString *PyUnicodeStringToTQString(PyObject *py) // expected. if (sipIsErr == NULL) - return (PyString_Check(sipPy) || -#if PY_VERSION_HEX >= 0x01060000 + return (SIPBytes_Check(sipPy) || PyUnicode_Check(sipPy) || -#endif sipCanConvertToInstance(sipPy,sipClass_TQString,SIP_NO_CONVERTORS)); - *sipCppPtr = PyUnicodeStringToTQString(sipPy); + *sipCppPtr = PyTQt_qt_PyObject_AsTQString(sipPy); if (*sipCppPtr) return sipGetState(sipTransferObj); @@ -942,7 +719,7 @@ static TQString *PyUnicodeStringToTQString(PyObject *py) enc = codec->fromUnicode(*sipCpp); - if ((encobj = PyString_FromString(enc.data())) != NULL) + if ((encobj = SIPBytes_FromString(enc.data())) != NULL) { *sipPtrPtr = (void *)PyString_AS_STRING(encobj); sipRes = PyString_GET_SIZE(encobj); @@ -973,107 +750,227 @@ bool operator>=(const TQString &,const TQString &); %End -%If (- TQt_2_00) +%ModuleHeaderCode +extern PyObject *PyTQt_qt_PyObject_FromTQString(const TQString *qstr); +%End -class TQString : TQByteArray +%ModuleCode +// Convert a QString to a Python Unicode object. +PyObject *PyTQt_qt_PyObject_FromTQString(const TQString *qstr) { -%TypeHeaderCode -#include <tqstring.h> + PyObject *obj; + +#if PY_VERSION_HEX >= 0x03030000 + // We have to work out exactly which kind to use. We assume ASCII while we + // are checking so that we only go through the string once in the most + // common case. Note that we can't use PyUnicode_FromKindAndData() because + // it doesn't handle surrogates in UCS2 strings. + + int qt_len = qstr->length(); + Py_UCS4 maxchar = 0x007f; + + for (int qt_i = 0; qt_i < qt_len && maxchar < 0xffff; ++qt_i) + { + Py_UCS4 uch = qstr->at(qt_i).unicode(); + + if (uch > 0x00ff) + { + maxchar = 0xffff; + } + else if (uch > 0x007f) + { + maxchar = 0x00ff; + } + } + + // Create the correctly sized object. + if ((obj = PyUnicode_New(qt_len, maxchar)) == NULL) + return NULL; + + int kind = PyUnicode_KIND(obj); + void *data = PyUnicode_DATA(obj); + + for (int qt_i = 0; qt_i < qt_len; ++qt_i) + { + Py_UCS4 uch = qstr->at(qt_i).unicode(); + PyUnicode_WRITE(kind, data, qt_i, uch); + } +#elif defined(Py_UNICODE_WIDE) + // Note that this doesn't handle code points greater than 0xffff. It could + // but it's only an issue for old versions of Qt. + + if ((obj = PyUnicode_FromUnicode(NULL, qstr->length())) == NULL) + return NULL; + + Py_UNICODE *pyu = PyUnicode_AS_UNICODE(obj); + + for (unsigned int i = 0; i < qstr->length(); ++i) + *pyu++ = (qstr->at(i)).unicode(); +#else + if ((obj = PyUnicode_FromUnicode(NULL, qstr->length())) == NULL) + return NULL; + + memcpy(PyUnicode_AS_UNICODE(obj), qstr->ucs2(), + qstr->length() * sizeof (Py_UNICODE)); +#endif + + return obj; +} %End -public: - TQString(); - TQString(int); - TQString(const TQString &); - TQString(const char *); - TQString(const char *,uint); - bool isNull() const; - bool isEmpty() const; - uint length() const; - bool resize(uint); - bool truncate(uint); - bool fill(char,int = -1); - TQString copy() const; -// TQString &sprintf(const char *,...); - int find(char,int = 0,bool = 1) const; - int find(const char *,int = 0,bool = 1) const; - int find(const TQRegExp &,int = 0) const; - int findRev(char,int = -1,bool = 1) const; - int findRev(const char *,int = -1,bool = 1) const; - int findRev(const TQRegExp &,int = -1) const; - int contains(char,bool = 1) const; - int contains(const char *,bool = 1) const; - int contains(const TQRegExp &) const; - TQString left(uint) const; - TQString right(uint) const; - TQString mid(uint,uint) const; - TQString leftJustify(uint,char = ' ',bool = 0) const; - TQString rightJustify(uint,char = ' ',bool = 0) const; - TQString lower() const; - TQString upper() const; - TQString stripWhiteSpace() const; - TQString simplifyWhiteSpace() const; - TQString &insert(uint,const char *); - TQString &insert(uint,char); - TQString &append(const char *); - TQString &prepend(const char *); - TQString &remove(uint,uint); - TQString &replace(uint,uint,const char *); - TQString &replace(const TQRegExp &,const char *); - - short toShort(bool * = 0) const; - ushort toUShort(bool * = 0) const; - int toInt(bool * = 0) const; - uint toUInt(bool * = 0) const; - long toLong(bool * = 0) const; - ulong toULong(bool * = 0) const; - float toFloat(bool * = 0) const; - double toDouble(bool * = 0) const; +%ModuleHeaderCode +extern TQString *PyTQt_qt_PyObject_AsTQString(PyObject *obj); +%End - TQString &setStr(const char *); -// TQString &setNum(short); -// TQString &setNum(ushort); - TQString &setNum(int /Constrained/); -// TQString &setNum(uint); -// TQString &setNum(long); -// TQString &setNum(ulong); -// TQString &setNum(float,char = 'g',int = 6); - TQString &setNum(double,char = 'g',int = 6); - bool setExpand(uint,char); +%ModuleCode +// Convert a Python Unicode object to a QString. +TQString *PyTQt_qt_PyObject_AsTQString(PyObject *obj) +{ + if (PyUnicode_Check(obj)) + { +#if PY_VERSION_HEX >= 0x03030000 + SIP_SSIZE_T len = PyUnicode_GET_LENGTH(obj); - SIP_PYOBJECT __str__(); -%MethodCode - const char *s; + switch (PyUnicode_KIND(obj)) + { + case PyUnicode_1BYTE_KIND: + return new TQString(TQString::fromLatin1((char *)PyUnicode_1BYTE_DATA(obj), len)); - Py_BEGIN_ALLOW_THREADS - s = *sipCpp; - Py_END_ALLOW_THREADS + case PyUnicode_2BYTE_KIND: + // The (TQChar *) cast should be safe. + return new TQString((TQChar *)PyUnicode_2BYTE_DATA(obj), len); - if (s == NULL) - s = ""; + case PyUnicode_4BYTE_KIND: + // Note that this doesn't handle code points greater than 0xffff. It + // could but it's only an issue for old versions of Qt. - sipRes = PyString_FromString(s); -%End + TQString *qstr = new TQString; -%ConvertToTypeCode - // Allow a Python string whenever a TQString is expected. + Py_UCS4 *ucode = PyUnicode_4BYTE_DATA(obj); - if (sipIsErr == NULL) - return (PyString_Check(sipPy) || - sipCanConvertToInstance(sipPy,sipClass_TQString,SIP_NO_CONVERTORS)); + for (SIP_SSIZE_T i = 0; i < len; ++i) + qstr->append(TQChar((uint)ucode[i])); - if (PyString_Check(sipPy)) - { - *sipCppPtr = new TQString(PyString_AS_STRING(sipPy)); + return qstr; + } - return sipGetState(sipTransferObj); - } + return NULL; +#else + TQString *qstr = new TQString; - *sipCppPtr = reinterpret_cast<TQString *>(sipConvertToInstance(sipPy,sipClass_TQString,sipTransferObj,SIP_NO_CONVERTORS,0,sipIsErr)); +# ifdef Py_UNICODE_WIDE + Py_UNICODE *ucode = PyUnicode_AS_UNICODE(obj); + SIP_SSIZE_T len = PyUnicode_GET_SIZE(obj); - return 0; + for (SIP_SSIZE_T i = 0; i < len; ++i) + qstr->append(TQChar((uint)ucode[i])); +# else + qstr->setUnicodeCodes((ushort *)PyUnicode_AS_UNICODE(obj),PyUnicode_GET_SIZE(obj)); +# endif + + return qstr; +#endif + } + else if (PyBytes_Check(obj)) + { + return new TQString(SIPBytes_AS_STRING(obj)); + } +#if PY_MAJOR_VERSION < 3 + else if (PyString_Check(obj)) + { + return new TQString(PyString_AS_STRING(obj)); + } +#endif + + return NULL; +} +%End + + +%ModuleHeaderCode +extern const char *PyTQt_qt_encode(PyObject **s, TQApplication::Encoding encoding); %End -}; +%ModuleCode +// Convert a Python unicode/string/bytes object to a character string encoded +// according to the given encoding. Update the object with a new reference to +// the object that owns the data. +const char *PyTQt_qt_encode(PyObject **s, TQApplication::Encoding encoding) +{ + PyObject *obj = *s; + const char *es = 0; + SIP_SSIZE_T sz; + + if (PyUnicode_Check(obj)) + { + if (encoding == TQApplication::UnicodeUTF8) + { + obj = PyUnicode_AsUTF8String(obj); + } + else + { + TQTextCodec *codec = TQTextCodec::codecForTr(); + + if (codec) + { + // Use the Qt codec to get to a byte string, and then to a + // Python object. + TQString *qstr = PyTQt_qt_PyObject_AsTQString(obj); + TQString qs = *qstr; + TQByteArray ba = codec->fromUnicode(qs); + delete qstr; + +#if PY_MAJOR_VERSION >= 3 + obj = PyBytes_FromStringAndSize(ba.data(), ba.size()); +#else + obj = PyString_FromStringAndSize(ba.data(), ba.size()); +#endif + } + else + { + obj = PyUnicode_AsLatin1String(obj); + } + } + + if (obj) + { +#if PY_MAJOR_VERSION >= 3 + es = PyBytes_AS_STRING(obj); +#else + es = PyString_AS_STRING(obj); +#endif + } + } +#if PY_MAJOR_VERSION >= 3 + else if (PyBytes_Check(obj)) + { + es = PyBytes_AS_STRING(obj); + Py_INCREF(obj); + } +#else + else if (PyString_Check(obj)) + { + es = PyString_AS_STRING(obj); + Py_INCREF(obj); + } +#endif + else if (PyObject_AsCharBuffer(obj, &es, &sz) >= 0) + { + Py_INCREF(obj); + } + + if (es) + { + *s = obj; + } + else + { + PyErr_Format(PyExc_UnicodeEncodeError, + "unable to convert '%s' to requested encoding", + Py_TYPE(*s)->tp_name); + } + + return es; +} %End |