+2007-03-10 Borut Razem <borut.razem AT siol.net>
+
+ * src/SDCC.lex, src/SDCCutil.[ch], src/SDCCval:
+ fixed RFE #1624219: double backslashes in filenames;
+ functions hexEscape(), octalEscape() and copyStr() moved from
+ SDCCval.c to SDCCutil.c and made them glovbally available
+
2007-03-09 Borut Razem <borut.razem AT siol.net>
* src/SDCC.lex, src/SDCCast.c. src/SDCCglobl.c, src/SDCCsymt.c,
else
{
const char *sb = s;
+ char *tmpFname;
/* find the end of the file name */
while (*s && *s != '"')
++s;
+ tmpFname = Safe_malloc(s - sb + 1);
+ memcpy(tmpFname, sb, s - sb);
+ tmpFname[s - sb] = '\0';
+
lexFilename = Safe_malloc(s - sb + 1);
- memcpy(lexFilename, sb, s - sb);
- lexFilename[s - sb] = '\0';
+ copyStr(lexFilename, tmpFname);
}
filename = lexFilename;
return dest;
}
-
/*-----------------------------------------------------------------*/
/* getBuildNumber - return build number */
/*-----------------------------------------------------------------*/
{
dbuf_destroy(&token->dbuf);
}
+
+/*! /fn char hexEscape(char **src)
+
+ /param src Pointer to 'x' from start of hex character value
+*/
+
+unsigned char
+hexEscape (const char **src)
+{
+ char *s ;
+ unsigned long value ;
+
+ (*src)++ ; /* Skip over the 'x' */
+
+ value = strtol (*src, &s, 16);
+
+ if (s == *src)
+ {
+ // no valid hex found
+ werror(E_INVALID_HEX);
+ }
+ else
+ {
+ if (value > 255)
+ {
+ werror(W_ESC_SEQ_OOR_FOR_CHAR);
+ }
+ }
+ *src = s;
+
+ return (char) value;
+}
+
+/*------------------------------------------------------------------*/
+/* octalEscape - process an octal constant of max three digits */
+/* return the octal value, throw a warning for illegal octal */
+/* adjust src to point at the last proccesed char */
+/*------------------------------------------------------------------*/
+
+unsigned char
+octalEscape (const char **str)
+{
+ int digits;
+ unsigned value=0;
+
+ for (digits = 0; digits < 3; digits++)
+ {
+ if (**str >='0' && **str <= '7')
+ {
+ value = value*8 + (**str - '0');
+ (*str)++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ if (digits)
+ {
+ if (value > 255 /* || (**str>='0' && **str<='7') */ )
+ {
+ werror (W_ESC_SEQ_OOR_FOR_CHAR);
+ }
+ }
+ return value;
+}
+
+/*!
+ /fn int copyStr (char *dest, char *src)
+
+ Copies a source string to a dest buffer interpreting escape sequences
+ and special characters
+
+ /param dest Buffer to receive the resultant string
+ /param src Buffer containing the source string with escape sequecnes
+ /return Number of characters in output string
+
+*/
+
+int
+copyStr (char *dest, const char *src)
+{
+ char *OriginalDest = dest ;
+
+ while (*src)
+ {
+ if (*src == '\"')
+ src++;
+ else if (*src == '\\')
+ {
+ src++;
+ switch (*src)
+ {
+ case 'n':
+ *dest++ = '\n';
+ break;
+ case 't':
+ *dest++ = '\t';
+ break;
+ case 'v':
+ *dest++ = '\v';
+ break;
+ case 'b':
+ *dest++ = '\b';
+ break;
+ case 'r':
+ *dest++ = '\r';
+ break;
+ case 'f':
+ *dest++ = '\f';
+ break;
+ case 'a':
+ *dest++ = '\a';
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ *dest++ = octalEscape(&src);
+ src-- ;
+ break;
+
+ case 'x':
+ *dest++ = hexEscape(&src) ;
+ src-- ;
+ break ;
+
+ case '\\':
+ *dest++ = '\\';
+ break;
+ case '\?':
+ *dest++ = '\?';
+ break;
+ case '\'':
+ *dest++ = '\'';
+ break;
+ case '\"':
+ *dest++ = '\"';
+ break;
+ default:
+ *dest++ = *src;
+ }
+ src++;
+ }
+ else
+ *dest++ = *src++;
+ }
+
+ *dest++ = '\0';
+
+ return dest - OriginalDest ;
+}
/** Given an array of name, value string pairs creates a new hash
containing all of the pairs.
*/
-hTab *populateStringHash(const char **pin);
+hTab *populateStringHash (const char **pin);
/** Prints elements of the set to the file, each element on new line
*/
-void fputStrSet(FILE *fp, set *list);
+void fputStrSet (FILE *fp, set *list);
/** Prepend / append given strings to each item of string set. The result is in a
new string set.
*/
-set *appendStrSet(set *list, const char *pre, const char *post);
+set *appendStrSet (set *list, const char *pre, const char *post);
/** Given a set returns a string containing all of the strings seperated
by spaces. The returned string is on the heap.
*/
-const char *joinStrSet(set *list);
+const char *joinStrSet (set *list);
/** Split the path string to the directory and file name (including extension) components.
The directory component doesn't contain trailing directory separator.
Returns true if the path contains the directory separator. */
-int dbuf_splitPath(const char *path, struct dbuf_s *dir, struct dbuf_s *file);
+int dbuf_splitPath (const char *path, struct dbuf_s *dir, struct dbuf_s *file);
/** Split the path string to the file name (including directory) and file extension components.
The file name component doesn't contain trailing extension separator.
Returns true if the path contains the extension separator. */
-int dbuf_splitFile(const char *path, struct dbuf_s *file, struct dbuf_s *ext);
+int dbuf_splitFile (const char *path, struct dbuf_s *file, struct dbuf_s *ext);
/** Combile directory and the file name to a path string using the DIR_SEPARATOR_CHAR.
*/
-void dbuf_makePath(struct dbuf_s *path, const char *dir, const char *file);
+void dbuf_makePath (struct dbuf_s *path, const char *dir, const char *file);
/** Given a file with path information in the binary files directory,
returns the directory component. Used for discovery of bin
*/
void chomp (char *sz);
-hTab *
-getRuntimeVariables(void);
+hTab *getRuntimeVariables (void);
/* strncpy() with guaranteed NULL termination. */
-char *strncpyz(char *dest, const char *src, size_t n);
+char *strncpyz (char *dest, const char *src, size_t n);
/* like strncat() with guaranteed NULL termination
* The passed size should be the size of the dest buffer, not the number of
* bytes to copy.
*/
-char *strncatz(char *dest, const char *src, size_t n);
+char *strncatz (char *dest, const char *src, size_t n);
/* return SDCC build number */
-const char *getBuildNumber(void);
+const char *getBuildNumber (void);
/* snprintf, by hook or by crook. */
-size_t SDCCsnprintf(char *, size_t, const char *, ...);
+size_t SDCCsnprintf (char *, size_t, const char *, ...);
# if defined(HAVE_VSNPRINTF)
} val;
};
-void init_pragma_token(struct pragma_token_s *token);
-char *get_pragma_token(const char *s, struct pragma_token_s *token);
-const char *get_pragma_string(struct pragma_token_s *token);
-void free_pragma_token(struct pragma_token_s *token);
+void init_pragma_token (struct pragma_token_s *token);
+char *get_pragma_token (const char *s, struct pragma_token_s *token);
+const char *get_pragma_string (struct pragma_token_s *token);
+void free_pragma_token (struct pragma_token_s *token);
+
+unsigned char hexEscape (const char **src);
+unsigned char octalEscape (const char **src);
+int copyStr (char *dest, const char *src);
#endif
return val;
}
-/*! /fn char hexEscape(char **src)
-
- /param src Pointer to 'x' from start of hex character value
-*/
-
-unsigned char hexEscape(const char **src)
-{
- char *s ;
- unsigned long value ;
-
- (*src)++ ; /* Skip over the 'x' */
-
- value = strtol (*src, &s, 16);
-
- if (s == *src) {
- // no valid hex found
- werror(E_INVALID_HEX);
- } else {
- if (value > 255) {
- werror(W_ESC_SEQ_OOR_FOR_CHAR);
- }
- }
- *src = s;
-
- return (char) value;
-}
-
-/*------------------------------------------------------------------*/
-/* octalEscape - process an octal constant of max three digits */
-/* return the octal value, throw a warning for illegal octal */
-/* adjust src to point at the last proccesed char */
-/*------------------------------------------------------------------*/
-
-unsigned char octalEscape (const char **str) {
- int digits;
- unsigned value=0;
-
- for (digits=0; digits<3; digits++) {
- if (**str>='0' && **str<='7') {
- value = value*8 + (**str-'0');
- (*str)++;
- } else {
- break;
- }
- }
- if (digits) {
- if (value > 255 /* || (**str>='0' && **str<='7') */ ) {
- werror (W_ESC_SEQ_OOR_FOR_CHAR);
- }
- }
- return value;
-}
-
-/*!
- /fn int copyStr (char *dest, char *src)
-
- Copies a source string to a dest buffer interpreting escape sequences
- and special characters
-
- /param dest Buffer to receive the resultant string
- /param src Buffer containing the source string with escape sequecnes
- /return Number of characters in output string
-
-*/
-
-int
-copyStr (char *dest, const char *src)
-
-{
- char *OriginalDest = dest ;
-
- while (*src)
- {
- if (*src == '\"')
- src++;
- else if (*src == '\\')
- {
- src++;
- switch (*src)
- {
- case 'n':
- *dest++ = '\n';
- break;
- case 't':
- *dest++ = '\t';
- break;
- case 'v':
- *dest++ = '\v';
- break;
- case 'b':
- *dest++ = '\b';
- break;
- case 'r':
- *dest++ = '\r';
- break;
- case 'f':
- *dest++ = '\f';
- break;
- case 'a':
- *dest++ = '\a';
- break;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- *dest++ = octalEscape(&src);
- src-- ;
- break;
-
- case 'x':
- *dest++ = hexEscape(&src) ;
- src-- ;
- break ;
-
- case '\\':
- *dest++ = '\\';
- break;
- case '\?':
- *dest++ = '\?';
- break;
- case '\'':
- *dest++ = '\'';
- break;
- case '\"':
- *dest++ = '\"';
- break;
- default:
- *dest++ = *src;
- }
- src++;
- }
- else
- *dest++ = *src++;
- }
-
- *dest++ = '\0';
-
- return dest - OriginalDest ;
-}
-
/*------------------------------------------------------------------*/
/* strVal - converts a string constant to a value */
/*------------------------------------------------------------------*/