int ds390_jammed = 0;
#endif
-/* Globally accessible scratch buffer for file names. */
+/* Globally accessible scratch buffer for file names.
+ TODO: replace them with local buffers */
char scratchFileName[PATH_MAX];
char buffer[PATH_MAX * 2];
p = src;
while (src < end)
{
- dbuf_init(&dbuf, 16);
+ dbuf_init (&dbuf, 16);
while (p < end && ',' != *p)
++p;
- dbuf_append(&dbuf, src, p - src);
+ dbuf_append (&dbuf, src, p - src);
/* null terminate the buffer */
- dbuf_c_str(&dbuf);
- addSet(dest, dbuf_detach(&dbuf));
+ dbuf_c_str (&dbuf);
+ addSet(dest, dbuf_detach (&dbuf));
src = ++p;
}
static void
processFile (char *s)
{
- char *fext = NULL;
+ const char *extp;
+ struct dbuf_s ext;
+ struct dbuf_s path;
- /* get the file extension */
- fext = s + strlen (s);
- while ((fext != s) && *fext != '.')
- fext--;
+ dbuf_init (&ext, 128);
+ dbuf_init (&path, 128);
- /* now if no '.' then we don't know what the file type is
+ /* get the file extension.
+ If no '.' then we don't know what the file type is
so give a warning and return */
- if (fext == s)
+ if (!dbuf_splitFile (s, &path, &ext))
{
werror (W_UNKNOWN_FEXT, s);
+
+ dbuf_destroy (&ext);
+ dbuf_destroy (&path);
+
return;
}
/* otherwise depending on the file type */
- if (strcmp (fext, ".c") == 0 || strcmp (fext, ".C") == 0)
+ extp = dbuf_c_str (&ext);
+ if (extp[1] == '\0' && (extp[0] == 'c' || extp[0] == 'C'))
{
+ unsigned char *p;
+
+ dbuf_destroy (&ext);
+
/* source file name : not if we already have a
source file */
if (fullSrcFileName)
{
werror (W_TOO_MANY_SRC, s);
+
+ dbuf_destroy (&path);
+
return;
}
if (!(srcFile = fopen (fullSrcFileName, "r")))
{
werror (E_FILE_OPEN_ERR, s);
- exit (1);
- }
-
- /* copy the file name into the buffer */
- strncpyz (buffer, s, sizeof(buffer));
- /* get rid of the "."-extension */
+ dbuf_destroy (&path);
- /* is there a dot at all? */
- if (strrchr (buffer, '.') &&
- /* is the dot in the filename, not in the path? */
- (strrchr (buffer, DIR_SEPARATOR_CHAR) < strrchr (buffer, '.')))
- {
- *strrchr (buffer, '.') = '\0';
+ exit (1);
}
/* get rid of any path information
for the module name; */
- fext = buffer + strlen (buffer);
-#if NATIVE_WIN32
- /* do this by going backwards till we
- get '\' or ':' or start of buffer */
- while (fext != buffer &&
- *(fext - 1) != DIR_SEPARATOR_CHAR &&
- *(fext - 1) != ':')
- {
- fext--;
- }
-#else
- /* do this by going backwards till we
- get '/' or start of buffer */
- while (fext != buffer &&
- *(fext - 1) != DIR_SEPARATOR_CHAR)
- {
- fext--;
- }
-#endif
- moduleNameBase = Safe_strdup ( fext );
- moduleName = Safe_strdup ( fext );
+ dbuf_init (&ext, 128);
+
+ dbuf_splitPath (dbuf_c_str (&path), NULL, &ext);
+ dbuf_destroy (&path);
- for (fext = moduleName; *fext; fext++)
- if (!isalnum ((unsigned char)*fext))
- *fext = '_';
+ moduleNameBase = Safe_strdup (dbuf_c_str (&ext));
+ moduleName = dbuf_detach (&ext);
+
+ for (p = moduleName; *p; ++p)
+ if (!isalnum(*p))
+ *p = '_';
return;
}
/* if the extention is type .rel or .r or .REL or .R
additional object file will be passed to the linker */
- if (strcmp (fext, ".r") == 0 || strcmp (fext, ".rel") == 0 ||
- strcmp (fext, ".R") == 0 || strcmp (fext, ".REL") == 0 ||
- strcmp (fext, port->linker.rel_ext) == 0)
+ if ((extp[1] == '\0' && (extp[0] == 'r' || extp[0] == 'R')) ||
+ strcmp (extp, "rel") == 0 || strcmp (extp, "REL") == 0 ||
+ strcmp (extp, port->linker.rel_ext) == 0)
{
- addSet(&relFilesSet, Safe_strdup(s));
+ dbuf_destroy (&ext);
+ dbuf_destroy (&path);
+
+ addSet (&relFilesSet, Safe_strdup (s));
return;
}
/* if .lib or .LIB */
- if (strcmp (fext, ".lib") == 0 || strcmp (fext, ".LIB") == 0)
+ if (strcmp (extp, "lib") == 0 || strcmp (extp, ".LIB") == 0)
{
- addSet(&libFilesSet, Safe_strdup(s));
+ dbuf_destroy (&ext);
+ dbuf_destroy (&path);
+
+ addSet (&libFilesSet, Safe_strdup (s));
return;
}
- werror (W_UNKNOWN_FEXT, s);
+ dbuf_destroy (&ext);
+ dbuf_destroy (&path);
+ werror (W_UNKNOWN_FEXT, s);
}
static void
{
werror (E_ARGUMENT_MISSING, szStart);
/* Die here rather than checking for errors later. */
- exit(EXIT_FAILURE);
+ exit (EXIT_FAILURE);
}
else
{
static bool
tryHandleUnsupportedOpt(char **argv, int *pi)
{
- if (argv[*pi][0] == '-')
- {
- const char *longOpt = "";
- char shortOpt = -1;
- int i;
+ if (argv[*pi][0] == '-')
+ {
+ const char *longOpt = "";
+ char shortOpt = -1;
+ int i;
- if (argv[*pi][1] == '-')
- {
- /* Long option. */
- longOpt = argv[*pi];
- }
- else
- {
- shortOpt = argv[*pi][1];
- }
- for (i = 0; i < LENGTH(unsupportedOptTable); i++)
- {
- if (unsupportedOptTable[i].shortOpt == shortOpt ||
- (longOpt && unsupportedOptTable[i].longOpt && !strcmp(unsupportedOptTable[i].longOpt, longOpt))) {
- /* Found an unsupported opt. */
- char buffer[100];
- SNPRINTF(buffer, sizeof(buffer),
- "%s%c%c",
- longOpt ? longOpt : "",
- shortOpt ? '-' : ' ', shortOpt ? shortOpt : ' ');
- werror (W_UNSUPP_OPTION, buffer, unsupportedOptTable[i].message);
- return 1;
- }
- }
- /* Didn't find in the table */
- return 0;
+ if (argv[*pi][1] == '-')
+ {
+ /* Long option. */
+ longOpt = argv[*pi];
}
- else
+ else
{
- /* Not an option, so can't be unsupported :) */
- return 0;
+ shortOpt = argv[*pi][1];
+ }
+ for (i = 0; i < LENGTH(unsupportedOptTable); i++)
+ {
+ if (unsupportedOptTable[i].shortOpt == shortOpt ||
+ (longOpt && unsupportedOptTable[i].longOpt && !strcmp(unsupportedOptTable[i].longOpt, longOpt)))
+ {
+ /* Found an unsupported opt. */
+ char buffer[100];
+ SNPRINTF(buffer, sizeof(buffer),
+ "%s%c%c",
+ longOpt ? longOpt : "",
+ shortOpt ? '-' : ' ', shortOpt ? shortOpt : ' ');
+ werror (W_UNSUPP_OPTION, buffer, unsupportedOptTable[i].message);
+ return 1;
+ }
+ }
+ /* Didn't find in the table */
+ return 0;
+ }
+ else
+ {
+ /* Not an option, so can't be unsupported :) */
+ return 0;
}
}
{
struct dbuf_s segname;
- dbuf_init(&segname, 16);
- dbuf_printf(&segname, "%-8s(CODE)", getStringArg(OPTION_CODE_SEG, argv, &i, argc));
- options.code_seg = dbuf_detach(&segname);
+ dbuf_init (&segname, 16);
+ dbuf_printf (&segname, "%-8s(CODE)", getStringArg (OPTION_CODE_SEG, argv, &i, argc));
+ options.code_seg = dbuf_detach (&segname);
continue;
}
{
struct dbuf_s segname;
- dbuf_init(&segname, 16);
- dbuf_printf(&segname, "%-8s(CODE)", getStringArg(OPTION_CONST_SEG, argv, &i, argc));
- options.const_seg = dbuf_detach(&segname);
+ dbuf_init (&segname, 16);
+ dbuf_printf (&segname, "%-8s(CODE)", getStringArg (OPTION_CONST_SEG, argv, &i, argc));
+ options.const_seg = dbuf_detach (&segname);
continue;
}
case 'o':
{
- char *p;
+ char *outName = getStringArg("-o", argv, &i, argc);
+ size_t len = strlen(outName);
- /* copy the file name into the buffer */
- strncpyz(buffer, getStringArg("-o", argv, &i, argc),
- sizeof(buffer));
/* point to last character */
- p = buffer + strlen (buffer) - 1;
- if (*p == DIR_SEPARATOR_CHAR)
+ if (IS_DIR_SEPARATOR(outName[len - 1]))
{
/* only output path specified */
- dstPath = Safe_strdup (buffer);
+ dstPath = Safe_malloc(len);
+ memcpy(dstPath, outName, len - 1);
+ dstPath[len - 1] = '\0';
fullDstFileName = NULL;
}
else
{
- fullDstFileName = Safe_strdup (buffer);
+ struct dbuf_s path;
- /* get rid of the "."-extension */
+ dbuf_init (&path, 128);
+ fullDstFileName = Safe_strdup (outName);
- /* is there a dot at all? */
- if (strrchr (buffer, '.') &&
- /* is the dot in the filename, not in the path? */
- (strrchr (buffer, DIR_SEPARATOR_CHAR) < strrchr (buffer, '.')))
- *strrchr (buffer, '.') = '\0';
+ /* get rid of the "."-extension */
+ dbuf_splitFile (outName, &path, NULL);
- dstFileName = Safe_strdup (buffer);
+ dbuf_c_str (&path);
+ dstFileName = dbuf_detach (&path);
+ dbuf_init (&path, 128);
/* strip module name to get path */
- p = strrchr (buffer, DIR_SEPARATOR_CHAR);
- if (p)
+ if (dbuf_splitPath (dstFileName, &path, NULL))
{
- /* path with trailing / */
- p[1] = '\0';
- dstPath = Safe_strdup (buffer);
+ dbuf_c_str (&path);
+ dstPath = dbuf_detach (&path);
}
+ else
+ dbuf_destroy (&path);
}
break;
}
/* use the modulename from the C-source */
if (fullSrcFileName)
{
- size_t bufSize = strlen (dstPath) + strlen (moduleNameBase) + 1;
+ struct dbuf_s path;
- dstFileName = Safe_alloc (bufSize);
- strncpyz (dstFileName, dstPath, bufSize);
- strncatz (dstFileName, moduleNameBase, bufSize);
+ if (*dstPath != '\0')
+ {
+ dbuf_makePath (&path, dstPath, moduleNameBase);
+ dbuf_c_str (&path);
+ dstFileName = dbuf_detach (&path);
+ }
+ else
+ dstFileName = Safe_strdup(moduleNameBase);
}
/* use the modulename from the first object file */
else if ((s = peekSet(relFilesSet)) != NULL)
{
- char *objectName;
- size_t bufSize;
+ struct dbuf_s file;
+
+ dbuf_init(&file, 128);
+
+ dbuf_splitPath (s, NULL, &file);
- strncpyz (buffer, s, sizeof(buffer));
- /* remove extension (it must be .rel) */
- *strrchr (buffer, '.') = '\0';
- /* remove path */
- objectName = strrchr (buffer, DIR_SEPARATOR_CHAR);
- if (objectName)
+ if (*dstPath != '\0')
{
- ++objectName;
+ struct dbuf_s path;
+
+ dbuf_init(&path, 128);
+ dbuf_makePath (&path, dstPath, dbuf_c_str (&file));
+ dbuf_destroy (&file);
+ dbuf_c_str (&path);
+ dstFileName = dbuf_detach (&path);
}
else
{
- objectName = buffer;
+ dbuf_c_str (&file);
+ dstFileName = dbuf_detach (&file);
}
- bufSize = strlen (dstPath) + strlen (objectName) + 1;
- dstFileName = Safe_alloc (bufSize);
- strncpyz (dstFileName, dstPath, bufSize);
- strncatz (dstFileName, objectName, bufSize);
}
/* else no module given: help text is displayed */
}
fprintf(stderr,
"Add support for your FLAT24 target in %s @ line %d\n",
__FILE__, __LINE__);
- exit(EXIT_FAILURE);
+ exit (EXIT_FAILURE);
}
break;
case MODEL_PAGE0:
fprintf(stderr,
"Add support for your FLAT24 target in %s @ line %d\n",
__FILE__, __LINE__);
- exit(EXIT_FAILURE);
+ exit (EXIT_FAILURE);
}
}
#endif
system_ret = my_system (buffer);
-#ifdef _WIN32
- #define STRCMP stricmp
-#else
- #define STRCMP strcmp
-#endif
-
/* TODO: most linker don't have a -o parameter */
/* -o option overrides default name? */
if (fullDstFileName)
strncatz (scratchFileName,
options.out_fmt ? ".S19" : ".ihx",
sizeof(scratchFileName));
- if (STRCMP (fullDstFileName, scratchFileName))
+ if (FILENAME_CMP (fullDstFileName, scratchFileName))
remove (fullDstFileName);
rename (scratchFileName, fullDstFileName);
strncatz (scratchFileName, ".map", sizeof(scratchFileName));
*q = 0;
strncatz(buffer, ".map", sizeof(buffer));
- if (STRCMP (scratchFileName, buffer))
+ if (FILENAME_CMP (scratchFileName, buffer))
remove (buffer);
rename (scratchFileName, buffer);
*p = 0;
strncatz (scratchFileName, ".mem", sizeof(scratchFileName));
*q = 0;
strncatz(buffer, ".mem", sizeof(buffer));
- if (STRCMP (scratchFileName, buffer))
+ if (FILENAME_CMP (scratchFileName, buffer))
remove (buffer);
rename (scratchFileName, buffer);
if (options.debug)
strncatz (scratchFileName, ".cdb", sizeof(scratchFileName));
*q = 0;
strncatz(buffer, ".cdb", sizeof(buffer));
- if (STRCMP (scratchFileName, buffer))
+ if (FILENAME_CMP (scratchFileName, buffer))
remove (buffer);
rename (scratchFileName, buffer);
/* and the OMF file without extension: */
*p = 0;
*q = 0;
- if (STRCMP (scratchFileName, buffer))
+ if (FILENAME_CMP (scratchFileName, buffer))
remove (buffer);
rename (scratchFileName, buffer);
}
static void
setBinPaths(const char *argv0)
{
- char *p;
+ const char *p;
char buf[PATH_MAX];
/*
instead of slower addSet() */
if ((p = getBinPath(argv0)) != NULL)
- addSetHead(&binPathSet, Safe_strdup(p));
+ addSetHead(&binPathSet, (void *)p);
if ((p = getenv(SDCC_DIR_NAME)) != NULL) {
SNPRINTF(buf, sizeof buf, "%s" PREFIX2BIN_DIR, p);
static void
setDataPaths(const char *argv0)
{
- char *p;
+ const char *p;
char buf[PATH_MAX];
/*
if ((p = getBinPath(argv0)) != NULL) {
SNPRINTF(buf, sizeof buf, "%s" BIN2DATA_DIR, p);
+ free((void *)p);
addSet(&dataDirsSet, Safe_strdup(buf));
}
fatalError = 1;
if (fatalError) {
- exit (1);
+ exit (EXIT_FAILURE);
}
if (port->general.do_glue != NULL)
return s;
}
+/** 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)
+{
+ const char *p;
+ int ret;
+ const char *end = &path[strlen(path)];
+
+ for (p = end - 1; p >= path && !IS_DIR_SEPARATOR(*p); --p)
+ ;
+
+ ret = p >= path;
+
+ if (NULL != dir)
+ {
+ int len = p - path;
+
+ if (0 < len)
+ dbuf_append(dir, path, len);
+ }
+
+ if (NULL != file)
+ {
+ int len;
+
+ ++p;
+ len = end - p;
+
+ if (0 < len)
+ dbuf_append(file, p, len);
+ }
+
+ return ret;
+}
+
+/** 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)
+{
+ const char *p;
+ const char *end = &path[strlen(path)];
+
+ for (p = end - 1; p >= path && !IS_DIR_SEPARATOR(*p) && '.' != *p; --p)
+ ;
+
+ if (p < path || '.' != *p)
+ {
+ dbuf_append_str(file, path);
+
+ return 0;
+ }
+ else
+ {
+ if (NULL != file)
+ {
+ int len = p - path;
+
+ if (0 < len)
+ dbuf_append(file, path, len);
+ }
+
+ if (NULL != ext)
+ {
+ int len;
+
+ ++p;
+ len = end - p;
+
+ if (0 < len)
+ dbuf_append(ext, p, len);
+ }
+
+ return 1;
+ }
+}
+
+/** 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)
+{
+ if (dir != NULL)
+ dbuf_append_str(path, dir);
+
+ dbuf_append_char(path, DIR_SEPARATOR_CHAR);
+
+ if (file != NULL)
+ dbuf_append_str(path, file);
+}
+
/** Given a file with path information in the binary files directory,
returns the directory component. Used for discovery of bin
directory of SDCC installation. Returns NULL if the path is
impossible.
*/
#ifdef _WIN32
-char *
+const char *
getBinPath(const char *prel)
{
- char *p;
- size_t len;
- static char path[PATH_MAX];
-
- /* try DOS and *nix dir separator on WIN32 */
- if (NULL != (p = strrchr(prel, DIR_SEPARATOR_CHAR)) ||
- NULL != (p = strrchr(prel, UNIX_DIR_SEPARATOR_CHAR))) {
- len = min((sizeof path) - 1, p - prel);
- strncpy(path, prel, len);
- path[len] = '\0';
- return path;
- }
- /* not enough info in prel; do it with module name */
- else if (0 != GetModuleFileName(NULL, path, sizeof path) &&
- NULL != (p = strrchr(path, DIR_SEPARATOR_CHAR))) {
- *p = '\0';
- return path;
- }
+ struct dbuf_s path;
+ const char *p;
+
+ dbuf_init(&path, 128);
+ dbuf_splitPath(prel, &path, NULL);
+
+ p = dbuf_c_str(&path);
+ if ('\0' != *p)
+ return p;
else
- return NULL;
+ {
+ char module[PATH_MAX];
+
+ dbuf_destroy(&path);
+
+ /* not enough info in prel; do it with module name */
+ if (0 != GetModuleFileName(NULL, module, sizeof (module)))
+ {
+ dbuf_init(&path, 128);
+
+ dbuf_splitPath(module, &path, NULL);
+ return dbuf_c_str(&path);
+ }
+ else
+ return NULL;
+ }
}
#else
-char *
+const char *
getBinPath(const char *prel)
{
- static char path[PATH_MAX];
+ struct dbuf_s path;
const char *ret_path;
- if (NULL != (ret_path = findProgramPath(prel))) {
- char *p;
- size_t len;
-
- if (NULL != (p = strrchr(ret_path, DIR_SEPARATOR_CHAR)) &&
- PATH_MAX > (len = p - ret_path)) {
- memcpy(path, ret_path, len);
- path[len] = '\0';
- free((void *)ret_path);
+ if (NULL != (ret_path = findProgramPath(prel)))
+ {
+ dbuf_splitPath(prel, path, NULL);
- return path;
- }
- else {
free((void *)ret_path);
- return NULL;
+ return dbuf_c_str(path);
}
- }
else
return NULL;
}