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