/* asdbg.c */
/*
* Copyright (C) 2003-2009 Alan R. Baldwin
*
* 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 of the License, 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 .
*
*
* Alan R. Baldwin
* 721 Berkeley St.
* Kent, Ohio 44240
*
*
* Code extracted from asnoice.c
* written by:
* John L. Hartman (JLH)
* 3-Nov-1997
*/
#include
#include "dbuf_string.h"
#include "asxxxx.h"
/*)Module asdbg.c
*
* The module asdbg.c contains the functions that
*
* 1) generate debug symbols for assembler code
* similiar to those generated by the SDCC compiler
*
* 2) generate debug symbols for the NoICE
* remote debugger
*
* asdbg.c contains the following functions:
* VOID DefineSDCC_Line()
* VOID DefineNoICE_Line()
* char * BaseFileName()
*
* asdbg.c contains the static variables:
* int prevFile
* char baseName[FILSPC]
*
* used by the BaseFileName function.
*
* NOTE:
* These functions know nothing about 'include' files
* and do not track their inclusion.
*/
/*)Function VOID DefineSDCC_Line()
*
* The function DefineSDCC_Line() is called to create
* a symbol of the form A$FILE$nnn where FILE is the
* Base File Name, the file name without a path or
* an extension, and nnn is the line number.
*
* local variables:
* struct dbuf_s dbuf a temporary to build the symbol
* struct sym * pSym pointer to the created symbol structure
*
* global variables:
* asmf * asmc pointer to current assembler file structure
* int srcline array of source file line numbers
* a_uint laddr current assembler address
* area dot.s_area pointer to the current area
*
* functions called:
* char * BaseFileName() asdbg.c
* sym * lookup() assym.c
* int sprintf() c_library
*
* side effects:
* A new symbol of the form A$FILE$nnn is created.
*/
#if SDCDB
VOID
DefineSDCC_Line (void)
{
struct dbuf_s dbuf;
struct sym *pSym;
/*
* Symbol is A$FILE$nnn
*/
dbuf_init (&dbuf, NCPS);
dbuf_printf (&dbuf, "A$%s$%u", BaseFileName (asmc, 1), srcline);
pSym = lookup (dbuf_c_str (&dbuf));
dbuf_destroy (&dbuf);
pSym->s_type = S_USER;
pSym->s_area = dot.s_area;
pSym->s_addr = laddr;
pSym->s_flag |= S_GBL;
}
#endif
/*)Function VOID DefineNoICE_Line()
*
* The function DefineNoICE_Line() is called to create
* a symbol of the form FILE.nnn where FILE is the
* Base File Name, the file name without a path or
* an extension, and nnn is the line number.
*
* local variables:
* struct dbuf_s dbuf a temporary to build the symbol
* struct sym * pSym pointer to the created symbol structure
*
* global variables:
* asmf * asmc pointer to current assembler file structure
* int srcline array of source file line numbers
* a_uint laddr current assembler address
* area dot.s_area pointer to the current area
*
* functions called:
* char * BaseFileName() asdbg.c
* sym * lookup() assym.c
* int sprintf() c_library
*
* side effects:
* A new symbol of the form FILE.nnn is created.
*/
#if NOICE
VOID
DefineNoICE_Line (void)
{
struct dbuf_s dbuf;
struct sym *pSym;
/*
* Symbol is FILE.nnn
*/
dbuf_init (&dbuf, NCPS);
dbuf_printf (&dbuf, "%s.%u", BaseFileName (asmc, 0), srcline);
pSym = lookup (dbuf_c_str (&dbuf));
dbuf_destroy (&dbuf);
pSym->s_type = S_USER;
pSym->s_area = dot.s_area;
pSym->s_addr = laddr;
pSym->s_flag |= S_GBL;
}
#endif
/*)Function char * BaseFileName(currFile, spacesToUnderscores)
*
* The function BaseFileName() is called to extract
* the file name from a string containing a path,
* filename, and extension. If spacesToUnderscores != 0
* then spaces are converted to underscores
*
* currFile is a pointer to the
* current assembler object
* spacesToUnderscores
*
* local variables:
* char baseName[] a place to put the file name
* int prevFile previous assembler object
* char * p1 temporary string pointer
* char * p2 temporary string pointer
*
* global variables:
* FILE * ofp output file handle
*
* functions called:
* int fprintf() c_library
* char * strcpy() c_library
* char * strrchr() c_library
* char * isspace() c_library
*
* side effects:
* A FILE command of the form ';!FILE string'
* is written to the output file.
*/
#if (NOICE || SDCDB)
static struct asmf * prevFile = NULL;
static char baseName[FILSPC];
char *
BaseFileName (struct asmf * currFile, int spacesToUnderscores)
{
char *p1, *p2;
if (currFile != prevFile) {
prevFile = currFile;
strcpy(baseName, afn);
p1 = baseName;
/*
* Dump a FILE command with full path and extension
*/
if (ofp)
fprintf(ofp, ";!FILE %s\n", p1);
/*
* The name starts after the last
* '/' (Unices) or
* ':' or '\' (DOS)
*
* and ends at the last
* separator 'FSEPX'
*/
if ((p2 = strrchr(p1, '\\')) != NULL) p1 = ++p2;
if ((p2 = strrchr(p1, '/')) != NULL) p1 = ++p2;
if ((p2 = strrchr(p1, ':')) != NULL) p1 = ++p2;
if ((p2 = strrchr(p1, FSEPX)) != NULL) *p2 = 0;
memmove(baseName, p1, strlen(p1)); /* Do not use strcpy(), since baseName and p1 may overlap */
if (spacesToUnderscores) {
/* Convert spaces to underscores */
for (p1 = baseName; *p1; ++p1)
if (isspace (*p1))
*p1 = '_';
}
}
return(baseName);
}
#endif