As reported here [1], we shuold force a final newline in macro files,
to prevent syntax errors.

Regards
Bert

[1] 
https://sourceforge.net/tracker/index.php?func=detail&aid=2038921&group_id=11005&atid=111005
---

 source/macro.c       |    5 ++++-
 source/preferences.c |    2 +-
 util/fileUtils.c     |   15 +++++++++++++--
 util/fileUtils.h     |    2 +-
 util/prefFile.c      |    2 +-
 5 files changed, 20 insertions(+), 6 deletions(-)

diff --quilt old/source/macro.c new/source/macro.c
--- old/source/macro.c
+++ new/source/macro.c
@@ -782,11 +782,14 @@ void ReadMacroInitFile(WindowInfo *windo
 int ReadMacroFile(WindowInfo *window, const char *fileName, int warnNotExist)
 {
     int result;
     char *fileString;
 
-    fileString = ReadAnyTextFile(fileName);
+    /* read-in macro file and force a terminating \n, to prevent syntax
+    ** errors with statements on the last line
+    */
+    fileString = ReadAnyTextFile(fileName, True);
     if (fileString == NULL){
         if (errno != ENOENT || warnNotExist)
         {
             DialogF(DF_ERR, window->shell, 1, "Read Macro",
                     "Error reading macro file %s: %s", "OK", fileName,
diff --quilt old/source/preferences.c new/source/preferences.c
--- old/source/preferences.c
+++ new/source/preferences.c
@@ -1507,11 +1507,11 @@ void SaveNEditPrefs(Widget parent, int q
 void ImportPrefFile(const char *filename, int convertOld)
 {
     XrmDatabase db;
     char *fileString;
     
-    fileString = ReadAnyTextFile(filename);
+    fileString = ReadAnyTextFile(filename, False);
     if (fileString != NULL){
         db = XrmGetStringDatabase(fileString);
         XtFree(fileString);
         OverlayPreferences(db, APP_NAME, APP_CLASS, PrefDescrip,
         XtNumber(PrefDescrip));
diff --quilt old/util/fileUtils.c new/util/fileUtils.c
--- old/util/fileUtils.c
+++ new/util/fileUtils.c
@@ -660,12 +660,14 @@ void ConvertToMacFileString(char *fileSt
 }
 
 /*
 ** Reads a text file into a string buffer, converting line breaks to 
 ** unix-style if appropriate. 
+**
+** Force a terminating \n, if this is requested
 */
-char *ReadAnyTextFile(const char *fileName)
+char *ReadAnyTextFile(const char *fileName, int forceNL)
 {
     struct stat statbuf;
     FILE *fp;
     int fileLen, readLen;
     char *fileString;
@@ -678,11 +680,14 @@ char *ReadAnyTextFile(const char *fileNa
     if (fstat(fileno(fp), &statbuf) != 0) {
       fclose(fp);
       return NULL;
     }
     fileLen = statbuf.st_size;
-    fileString = XtMalloc(fileLen+1);  /* +1 = space for null */
+    /* +1 = space for null
+    ** +1 = possible additional \n
+    */
+    fileString = XtMalloc(fileLen + 2);
     readLen = fread(fileString, sizeof(char), fileLen, fp);
     if (ferror(fp)) {
       XtFree(fileString);
       fclose(fp);
       return NULL;
@@ -697,7 +702,13 @@ char *ReadAnyTextFile(const char *fileNa
         ConvertFromDosFileString(fileString, &readLen, &pendingCR);
     } else if (format == MAC_FILE_FORMAT){
         ConvertFromMacFileString(fileString, readLen);
     }
 
+    /* now, that the fileString is in Unix format, check for terminating \n */
+    if (forceNL && fileString[readLen - 1] != '\n') {
+        fileString[readLen]     = '\n';
+        fileString[readLen + 1] = '\0';
+    }
+
     return fileString;
 }
diff --quilt old/util/fileUtils.h new/util/fileUtils.h
--- old/util/fileUtils.h
+++ new/util/fileUtils.h
@@ -42,8 +42,8 @@ int FormatOfFile(const char *fileString)
 void ConvertFromDosFileString(char *inString, int *length, 
      char* pendingCR);
 void ConvertFromMacFileString(char *fileString, int length);
 int ConvertToDosFileString(char **fileString, int *length);
 void ConvertToMacFileString(char *fileString, int length);
-char *ReadAnyTextFile(const char *fileName);
+char *ReadAnyTextFile(const char *fileName, int forceNL);
 
 #endif /* NEDIT_FILEUTILS_H_INCLUDED */
diff --quilt old/util/prefFile.c new/util/prefFile.c
--- old/util/prefFile.c
+++ new/util/prefFile.c
@@ -140,11 +140,11 @@ XrmDatabase CreatePreferencesDatabase(co
     if (NULL == fullName)
     {
         db = NULL;
     } else
     {
-        fileString = ReadAnyTextFile(fullName);
+        fileString = ReadAnyTextFile(fullName, False);
         if (NULL == fileString)
         {
             db = NULL;
         } else
         {
-- 
NEdit Develop mailing list - [email protected]
http://www.nedit.org/mailman/listinfo/develop

Reply via email to