#define TARGET_STRING "gbz80"
#endif
+#ifdef WIN32T
+#include <time.h>
+
+void Timer(int action, char * message)
+{
+ static double start, end, total=0.0;
+ static const double secs_per_tick = 1.0 / CLOCKS_PER_SEC;
+
+ if(action==0) start=clock()*secs_per_tick;
+ else if(action==1)
+ {
+ end=clock() * secs_per_tick;
+ printf("%s \t%f seconds.\n", message, (end-start));
+ total+=end-start;
+ }
+ else
+ {
+ printf("Total time: \t%f seconds.\n", total);
+ total=0.0;
+ }
+}
+#endif
+
/*)Module lkmain.c
*
* The module lkmain.c contains the functions which
*
* The function main() evaluates the command line arguments to
* determine if the linker parameters are to input through 'stdin'
- * or read from a command file. The functiond getline() and parse()
+ * or read from a command file. The functiond lk_getline() and parse()
* are to input and evaluate the linker parameters. The linking process
* proceeds by making the first pass through each .rel file in the order
* presented to the linker. At the end of the first pass the setbase(),
* FILE * afile() lkmain.c
* int fclose() c_library
* int fprintf() c_library
- * int getline() lklex.c
+ * int lk_getline() lklex.c
* VOID library() lklibr.c
* VOID link() lkmain.c
* VOID lkexit() lkmain.c
register char *p;
register int c, i;
+#ifdef WIN32T
+ Timer(0, "");
+#endif
+
#ifdef GAMEBOY
nb_rom_banks = 2;
nb_ram_banks = 0;
filep = startp;
while (1) {
ip = ib;
- if (getline() == 0)
+ if (lk_getline() == 0)
break;
if (pflag && sfp != stdin)
fprintf(stdout, "%s\n", ip);
hp = NULL;
radix = 10;
- while (getline()) {
+ while (lk_getline()) {
ip = ib;
link();
}
reloc('E');
}
}
+#ifdef WIN32T
+ Timer(1, "Linker time");
+#endif
lkexit(lkerr);
/* Never get here. */
if ((c=endline()) == 0) { return; }
switch (c) {
+ case 'O': /*For some important sdcc options*/
+ if (pass == 0)
+ {
+ if(strlen(sdccopt)==0)
+ {
+ strcpy(sdccopt, &ip[1]);
+ strcpy(sdccopt_module, curr_module);
+ }
+ else
+ {
+ if(strcmp(sdccopt, &ip[1])!=0)
+ {
+ fprintf(stderr,
+ "?ASlink-Warning-Conflicting sdcc options:\n"
+ " \"%s\" in module \"%s\" and\n"
+ " \"%s\" in module \"%s\".\n",
+ sdccopt, sdccopt_module, &ip[1], curr_module);
+ lkerr++;
+ }
+ }
+ }
+ break;
+
case 'X':
radix = 16;
break;
case 'M':
if (pass == 0)
+ {
+ strcpy(curr_module, &ip[1]);
module();
+ }
break;
case 'A':
char fid[NINPUT];
while ((c = getnb()) != 0) {
+ if (c == ';')
+ return(0);
if ( c == '-') {
while (ctype[c=get()] & LETTER) {
switch(c) {
lkexit(1);
}
}
+ if (c == ';')
+ return(0);
} else
if (ctype[c] != ILL) {
if (linkp == NULL) {
char *fn;
char *ft;
{
+#if 0
register char *p1, *p2, *p3;
register int c;
+#else
+ int i;
+#endif
FILE *fp;
char fb[FILSPC];
+#if 0
p1 = fn;
p2 = fb;
p3 = ft;
*p2++ = c;
}
*p2++ = 0;
+#else
+ /*Look backward the name path and get rid of the extension, if any*/
+ i=strlen(fn);
+ for(; (fn[i]!='.')&&(fn[i]!='\\')&&(fn[i]!='/')&&(i>0); i--);
+ if( (fn[i]=='.') && *ft && strcmp(ft, "lnk") )
+ {
+ strncpy(fb, fn, i);
+ fb[i]=0;
+ }
+ else
+ {
+ strcpy(fb, fn);
+ }
+
+ /*Add the extension*/
+ if (fb[i] != '.')
+ {
+ strcat(fb, ".");
+#ifdef SDK
+ strcat(fb, strlen(ft)?ft:"rel");
+#else
+ strcat(fb, strlen(ft)?ft:"REL");
+#endif
+ }
+#endif
+
#ifdef SDK
if ((fp = fopen(fb, wf?(binary?"wb":"w"):(binary?"rb":"r"))) == NULL) {
#else /* SDK */