Browse Source

Urlencode on-calc file names passed to ld-tigcc instead of passing raw calculator charset on the command line.

git-svn-id: file:///var/svn/tigccpp/trunk@1163 9552661e-59e3-4036-b4f2-dbe53926924f
kevinkofler 17 years ago
parent
commit
6c8eb6c84f
4 changed files with 45 additions and 30 deletions
  1. 2 0
      ktigcc/NEWS
  2. 6 8
      ktigcc/mainform.cpp
  3. 35 20
      ktigcc/tpr.cpp
  4. 2 2
      ktigcc/tpr.h

+ 2 - 0
ktigcc/NEWS

@@ -21,6 +21,8 @@ CVS HEAD (2007-06-17):
   for compressed files.
 * Now using the new ld-tigcc switch --output-data-var to set the data variable
   file name on the computer instead of the old renaming hack.
+* Non-ASCII characters in on-calc file names are now passed to ld-tigcc in
+  urlencoded form (more portable).
 
 
 KTIGCC 1.06 (2006-11-25):

+ 6 - 8
ktigcc/mainform.cpp

@@ -4469,10 +4469,11 @@ void MainForm::linkProject()
       errorsCompilingFlag=TRUE;
   } else {
     // Link executable using ld-tigcc.
-    QByteArray projectName, dataVarName, packFullName, packName;
+    QByteArray packName;
+    QString pstarterName; // urlencoded
     QStringList linkerOptions=process_settings(rootListItem->text(0),
-                                               projectName,dataVarName,
-                                               packFullName,packName);
+                                               projectBaseName,
+                                               pstarterName,packName);
     // The QTextCodec has to be passed explicitly, or it will default to
     // ISO-8859-1 regardless of the locale, which is just broken.
     procio=new K3ProcIO(QTextCodec::codecForLocale());
@@ -4482,10 +4483,7 @@ void MainForm::linkProject()
       K3Process::Stdout|K3Process::MergedStderr));
     procio->setWorkingDirectory(projectDir);
     *procio<<(QString("%1/bin/ld-tigcc").arg(tigcc_base))
-           <<"-v"<<"-o"<<projectBaseName
-           <<"-n"<<(settings.pack?packFullName:projectName);
-    if (!dataVarName.isNull())
-      *procio<<"-d"<<dataVarName<<"--output-data-var"<<projectBaseName+"-data";
+           <<"-v";
     *procio<<linkerOptions<<objectFiles;
     if (settings.std_lib)
       *procio<<QString(settings.flash_os?"%1/lib/flashos.a"
@@ -4536,7 +4534,7 @@ void MainForm::linkProject()
         K3Process::Stdout|K3Process::MergedStderr));
       procio->setWorkingDirectory(projectDir);
       *procio<<(QString("%1/bin/ld-tigcc").arg(tigcc_base))
-             <<"-o"<<pstarterBaseName<<"-n"<<projectName
+             <<"-o"<<pstarterBaseName<<"-n"<<pstarterName
              <<(pstarterBaseName+".o");
       if (settings.outputbin) *procio<<"--outputbin";
       connect(procio,SIGNAL(processExited(K3Process*)),this,SLOT(procio_processExited()));

+ 35 - 20
ktigcc/tpr.cpp

@@ -1157,7 +1157,7 @@ bool moveFile(const QString &src, const QString &dest)
   return qdir.remove(src);
 }
 
-// Replaces the first occurrence of "tempprog" in a pstarter or PPG with name.
+// Replaces the first occurrence of "tempprog" in a pstarter with name.
 // returns 0 on success, >0 on read failure, <0 on write failure
 int insertName(const char *src, const char *dest, const char *name)
 {
@@ -1342,41 +1342,56 @@ QStringList process_libopts(void)
   return args;
 }
 
+static QString urlencode(const QByteArray &byteArray)
+{
+  QString result;
+  int len=byteArray.size();
+  for (int i=0; i<len; i++) {
+    unsigned char c=byteArray.at(i);
+    if (c<128) result+=c; else result+=QString::number(c,16).prepend('%');
+  }
+  return result;
+}
+
 /*
    Build linker command line arguments
 */
 QStringList process_settings(const QString &prjNameUnicode,
-                             QByteArray &projectName, QByteArray &dataVarName,
-                             QByteArray &packFullName, QByteArray &packName)
+                             const QString &projectBaseName,
+                             QString &pstarterName, QByteArray &packName)
 {
   QStringList args;
+  args<<"-o"<<projectBaseName<<"-n";
 
   // Convert the project name to the calculator charset.
-  projectName=TiconvTextCodec::instance->fromUnicode(prjNameUnicode);
-
-  // Split the PPG name into folder and file.
-  QString packNameUnicode;
-  int slashPos=settings.pack_name.find('\\');
-  if (slashPos>=0) {
-    packNameUnicode=settings.pack_name.mid(slashPos+1);
-  } else {
-    packNameUnicode=settings.pack_name;
-  }
+  QByteArray projectName=TiconvTextCodec::instance->fromUnicode(prjNameUnicode);
+
+  if (settings.pack && !settings.pack_name.isEmpty()) {
+    // Split the PPG name into folder and file.
+    QString packNameUnicode;
+    int slashPos=settings.pack_name.find('\\');
+    if (slashPos>=0) {
+      packNameUnicode=settings.pack_name.mid(slashPos+1);
+    } else {
+      packNameUnicode=settings.pack_name;
+    }
 
-  // Convert the PPG file name to the calculator charset.
-  packFullName=TiconvTextCodec::instance->fromUnicode(settings.pack_name);
-  packName=TiconvTextCodec::instance->fromUnicode(packNameUnicode);
+    // Convert the PPG file name to the calculator charset.
+    packName=TiconvTextCodec::instance->fromUnicode(packNameUnicode);
+    args<<urlencode(TiconvTextCodec::instance->fromUnicode(settings.pack_name));
+    pstarterName=urlencode(projectName);
+  } else args<<urlencode(projectName);
 
   if (settings.use_data_var && !settings.data_var.isEmpty()) {
-    // We can't just append this to the argument list because this needs to be
-    // in the calculator charset.
-    dataVarName=TiconvTextCodec::instance->fromUnicode(settings.data_var);
+    args<<"-d"
+        <<urlencode(TiconvTextCodec::instance->fromUnicode(settings.data_var))
+        <<"--output-data-var"<<projectBaseName+"-data";
     if (!settings.copy_data_var) {
       args.append("--data-var-copy=never");
     } else if (!settings.copy_data_var_arc) {
       args.append("--data-var-copy=always");
     }
-  } else dataVarName=QByteArray();
+  }
 
   if (settings.optimize_nops) {
     args.append("--optimize-nops");

+ 2 - 2
ktigcc/tpr.h

@@ -189,8 +189,8 @@ int getPathType(const QString &thePath);
 
 QStringList process_libopts(void);
 QStringList process_settings(const QString &prjNameUnicode,
-                             QByteArray &projectName, QByteArray &dataVarName,
-                             QByteArray &packFullName, QByteArray &packName);
+                             const QString &projectBaseName,
+                             QString &pstarterName, QByteArray &packName);
 
 class TiconvTextCodec : public QTextCodec {
   public: