Quellcode durchsuchen

New function copyFile. Use it in fileSave_saveAs to copy binary files.

git-svn-id: file:///var/svn/tigccpp/trunk@423 9552661e-59e3-4036-b4f2-dbe53926924f
kevinkofler vor 18 Jahren
Ursprung
Commit
6e17dfa7df
3 geänderte Dateien mit 38 neuen und 3 gelöschten Zeilen
  1. 7 3
      ktigcc/mainform.ui.h
  2. 29 0
      ktigcc/tpr.cxx
  3. 2 0
      ktigcc/tpr.h

+ 7 - 3
ktigcc/mainform.ui.h

@@ -792,10 +792,14 @@ void MainForm::fileSave_saveAs(QListViewItem *theItem)
   category==txtFilesListItem?TIGCC_TXT_Filter TIGCCAllFilter:
   TIGCCAllFilter
   ,"Save Source File",this);
-  if (saveFileName.isEmpty())
-    return;
   ListViewFile *theFile=static_cast<ListViewFile *>(theItem);
-  if (saveFileText(saveFileName,theFile->textBuffer))
+  if (saveFileName.isEmpty()
+      || (!IS_EDITABLE_CATEGORY(category)
+          && !saveFileName.compare(theFile->fileName)))
+    return;
+  if (IS_EDITABLE_CATEGORY(category)
+      ?saveFileText(saveFileName,theFile->textBuffer)
+      :copyFile(theFile->fileName,saveFileName))
     KMessageBox::error(this,QString("Can't save to \'%1\'").arg(saveFileName));
   else {
     theFile->fileName=saveFileName;

+ 29 - 0
ktigcc/tpr.cxx

@@ -758,3 +758,32 @@ int checkFileName(const QString &fileName,const QStringList &fileNameList)
   }
   return 1;
 }
+
+// returns 0 on success, >0 on read failure, <0 on write failure
+int copyFile(const char *src, const char *dest)
+{
+  // This doesn't load everything at once onto the stack because it may be
+  // used for huge binary files, which don't fit on the stack. So we copy 1KB
+  // at a time.
+  FILE *sf=fopen(src,"rb");
+  if (!sf) return 1;
+  FILE *df=fopen(dest,"wb");
+  if (!df) {fclose(sf); return -1;}
+  char buffer[1024];
+  while (!ferror(sf) && !feof(sf)) {
+    size_t bytes_read=fread(buffer,1,1024,sf);
+    if (fwrite(buffer,1,bytes_read,df)<bytes_read) {
+      fclose(df);
+      fclose(sf);
+      return -2;
+    }
+  }
+  if (ferror(sf)) {
+    fclose(df);
+    fclose(sf);
+    return 2;
+  }
+  if (fclose(df)) {fclose(sf); return -3;}
+  if (fclose(sf)) return 3;
+  return 0;
+}

+ 2 - 0
ktigcc/tpr.h

@@ -155,3 +155,5 @@ int saveFileText(const char *fileName,QString &fileText);
 
 void kurlNewFileName(KURL &dir,const QString &newFileName);
 int checkFileName(const QString &fileName,const QStringList &fileNameList);
+
+int copyFile(const char *src, const char *dest);