Browse Source

Add QTextCodec subclass wrapping libticonv, start using it.

git-svn-id: file:///var/svn/tigccpp/trunk@1013 9552661e-59e3-4036-b4f2-dbe53926924f
kevinkofler 17 years ago
parent
commit
09dd392bab
3 changed files with 52 additions and 21 deletions
  1. 3 0
      ktigcc/ktigcc.cpp
  2. 37 21
      ktigcc/tpr.cpp
  3. 12 0
      ktigcc/tpr.h

+ 3 - 0
ktigcc/ktigcc.cpp

@@ -39,6 +39,7 @@
 #include <kconfig.h>
 #include <glib.h>
 #include "mainform.h"
+#include "tpr.h"
 using namespace std;
 
 static KCmdLineOptions options[] =
@@ -66,6 +67,8 @@ static void log_eater(const gchar *log_domain __attribute__((unused)),
 
 int main(int argc, char *argv[])
 {
+  // Create the libticonv text codec.
+  new TiconvTextCodec();
   // Match the locale for the default C string <-> QString conversions.
   // Hopefully it is a .UTF-8 locale, if it isn't, don't complain about
   // characters lost converting!

+ 37 - 21
ktigcc/tpr.cpp

@@ -36,6 +36,7 @@
 #include <kurl.h>
 #include <QString>
 #include <QStringList>
+#include <QByteArray>
 #include <Q3CString>
 #include <QRegExp>
 #include <QTextCodec>
@@ -46,6 +47,32 @@
 #include "tpr.h"
 #include "preferences.h"
 
+TiconvTextCodec *TiconvTextCodec::instance=NULL;
+
+QByteArray TiconvTextCodec::convertFromUnicode(const QChar *input, int number,
+                                               ConverterState *state __attribute__((unused))) const
+{
+  QString inputNullTerminated(input,number);
+  const unsigned short *utf16=inputNullTerminated.utf16();
+  if (!utf16) return QByteArray();
+  char *ti=ticonv_charset_utf16_to_ti(CALC_TI89,utf16);
+  QByteArray result(ti);
+  g_free(ti);
+  return result;
+}
+
+QString TiconvTextCodec::convertToUnicode(const char *chars, int len,
+                                          ConverterState *state __attribute__((unused))) const
+{
+  QByteArray inputNullTerminated(chars,len);
+  const char *ti=inputNullTerminated.constData();
+  if (!ti) return QString();
+  unsigned short *utf16=ticonv_charset_ti_to_utf16(CALC_TI89,ti);
+  QString result=QString::fromUtf16(utf16);
+  g_free(utf16);
+  return result;
+}
+
 #define find_param(s_,t_) find_param_ex((s_),(t_),sizeof(t_)-1)
 
 static char *find_param_ex(char *s, const char *t, size_t l)
@@ -194,9 +221,7 @@ static int parse_file(FILE *f,TPRDataStruct *dest)
             if ( (p=find_param(buffer, token)) ) \
             { \
                 if (*p) { \
-                  unsigned short *utf16=ticonv_charset_ti_to_utf16(CALC_TI89,p); \
-                  dest->var = QString::fromUtf16(utf16); \
-                  g_free(utf16); \
+                  dest->var = TiconvTextCodec::instance->toUnicode(p); \
                 } \
                 continue; \
             } else
@@ -519,16 +544,11 @@ QString loadFileText(const char *fileName)
   } else {
     fclose(f);
     if (preferences.useCalcCharset) {
-      unsigned short *utf16=ticonv_charset_ti_to_utf16(CALC_TI89,buffer);
-      delete[] buffer;
-      if (!utf16)
-        return QString::null;
-      ret=QString::fromUtf16(utf16);
-      g_free(utf16);
+      ret=TiconvTextCodec::instance->toUnicode(buffer);
     } else {
       ret=buffer;
-      delete[] buffer;
     }
+    delete[] buffer;
   }
   if (!ret.isNull()) {
     // convert Windows line endings
@@ -572,10 +592,9 @@ static int save_tpr(FILE *f,TPRDataStruct *dest)
     
 #define boolean_param(token,setting) if (fprintf(f,token "%d\r\n",!!dest->settings.setting)<0) return -2;
 #define tistring_vparam(token,var) { \
-        const unsigned short *utf16=dest->var.utf16(); \
-        char *ti=utf16?ticonv_charset_utf16_to_ti(CALC_TI89,utf16):reinterpret_cast<char*>(g_malloc0(1)); \
-        if (fprintf(f,token "%s\r\n",ti)<0) {g_free(ti); return -2;} \
-        g_free(ti); \
+        const char *ti=TiconvTextCodec::instance->fromUnicode(dest->var).constData(); \
+        if (!ti) ti=""; \
+        if (fprintf(f,token "%s\r\n",ti)<0) return -2; \
     }
 #define tistring_param(token,setting) tistring_vparam(token,settings.setting)
 #define string_param(token,setting) if (fprintf(f,token "%s\r\n",smartAscii(dest->settings.setting))<0) return -2;
@@ -770,15 +789,12 @@ void mkdir_multi(const char *fileName)
 static int writeToFile(FILE *f, const QString &text)
 {
   if (preferences.useCalcCharset) {
-    const unsigned short *utf16=text.utf16();
-    if (utf16) {
-      char *s=ticonv_charset_utf16_to_ti(CALC_TI89,utf16);
-      size_t l=std::strlen(s);
-      if (fwrite(s,1,l,f)<l) {
-        g_free(s);
+    if (!text.isEmpty()) {
+      QByteArray s=TiconvTextCodec::instance->fromUnicode(text);
+      size_t l=s.length();
+      if (fwrite(s.constData(),1,l,f)<l) {
         return -2;
       }
-      g_free(s);
     }
   } else {
     const char *s=smartAscii(text);

+ 12 - 0
ktigcc/tpr.h

@@ -29,6 +29,7 @@ class KUrl;
 #include <Q3CString>
 #include <Q3ValueVector>
 #include <QPair>
+#include <QTextCodec>
 
 /*Structure definitions from tprbuilder source; slightly modified
     to work under C++
@@ -189,3 +190,14 @@ QStringList process_libopts(void);
 QStringList process_settings(const QString &prjNameUnicode,
                              Q3CString &projectName, Q3CString &dataVarName,
                              Q3CString &packFolder, Q3CString &packName);
+
+class TiconvTextCodec : public QTextCodec {
+  public:
+    static TiconvTextCodec *instance;
+    TiconvTextCodec() : QTextCodec() {instance=this;}
+    virtual QByteArray name() const {return "TI-89";}
+    virtual int mibEnum() const {return 0x71C0;}
+  protected:
+    virtual QByteArray convertFromUnicode(const QChar *input, int number, ConverterState *state) const;
+    virtual QString convertToUnicode(const char *chars, int len, ConverterState *state) const;
+};