/* sdld.c
Copyright (C) 2009-2010 Borut Razem
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
#ifndef _WIN32
#include
#endif
#include
#include
#include
#include
#include "sdld.h"
#define NELEM(x) (sizeof (x) / sizeof (x)[0])
static int sdld = -1;
static enum sdld_target_e target = TARGET_ID_UNKNOWN;
static char
*program_name (char *path)
{
#ifdef _WIN32
static char fname[_MAX_FNAME];
char *p;
_splitpath (path, NULL, NULL, fname, NULL);
/* convert it to lower case:
on DOS and Windows 9x the file name in argv[0] is uppercase */
for (p = fname; '\0' != *p; ++p)
*p = tolower (*p);
return fname;
#else
return basename (path);
#endif
}
static void
check_init(void)
{
if (sdld == -1)
{
fprintf(stderr, "sdld_init not called!\n");
exit (1);
}
}
void
sdld_init (char *path)
{
struct tgt_s {
char *str;
enum sdld_target_e target;
} tgt[] = {
{ "gb", TARGET_ID_GB, },
{ "z80", TARGET_ID_Z80, },
{ "z180", TARGET_ID_Z180, },
{ "8051", TARGET_ID_8051, },
{ "6808", TARGET_ID_6808, },
{ "stm8", TARGET_ID_STM8, },
{ "pdk", TARGET_ID_PDK, },
};
int i = NELEM (tgt);
char *progname = program_name (path);
if ((sdld = (strncmp(progname, "sdld", 4) == 0)) != 0)
{
/* exception: sdld is 8051 linker */
if (progname[4] == '\0')
target = TARGET_ID_8051;
else
{
for (i = 0; i < NELEM (tgt); ++i)
{
if (strstr(progname, tgt[i].str))
{
target = tgt[i].target;
break;
}
}
}
}
/* diagnostic message */
if (getenv ("SDLD_DIAG"))
{
printf ("sdld path: %s\n", path);
printf ("is sdld: %d\n", sdld);
if (sdld)
printf ("sdld target: %s\n", (i >= NELEM (tgt)) ? "8051" : tgt[i].str);
}
}
int
is_sdld(void)
{
check_init();
return sdld;
}
void
set_sdld_target(enum sdld_target_e trgt)
{
target = trgt;
}
enum sdld_target_e
get_sdld_target(void)
{
check_init();
return target;
}
int
is_sdld_target_z80_like(void)
{
check_init();
return target == TARGET_ID_Z80 || target == TARGET_ID_Z180 || target == TARGET_ID_GB;
}
int
is_sdld_target_8051_like(void)
{
check_init();
return target == TARGET_ID_8051;
}