Use 'ao-dbg' instead of 's51' to communicate with TeleMetrum
[fw/sdcc] / debugger / mcs51 / sdcdb.c
index 4b9c8bb19d3e7643119b2c3ce789afd0f54d2f4c..8df52526574ae2c77fc29e30d94becfd3d10f9d0 100644 (file)
    what you give them.   Help stamp out software-hoarding!
 -------------------------------------------------------------------------*/
 
+#define link unix_link
+#define _GNU_SOURCE
+#include <unistd.h>
+#undef link
 #include "sdcdb.h"
 #include "symtab.h"
 #include "simi.h"
 #include "break.h"
 #include "cmd.h"
 #include "newalloc.h"
-#ifdef HAVE_READLINE
+#if defined HAVE_LIBREADLINE && HAVE_LIBREADLINE != -1
+#define HAVE_READLINE_COMPLETITION  1
+#endif
+#ifdef HAVE_LIBREADLINE
 #include <readline/readline.h>
 #include <readline/history.h>
-#endif  /* HAVE_READLINE */
+#endif  /* HAVE_LIBREADLINE */
 
 #ifdef SDCDB_DEBUG
 int   sdcdbDebug = 0;
@@ -52,17 +59,18 @@ short showfull = 0;
 char userinterrupt = 0;
 char nointerrupt = 0;
 char contsim = 0;
-char *ssdirl = DATADIR LIB_DIR_SUFFIX ":" DATADIR LIB_DIR_SUFFIX "/small" ;
+char *ssdirl = DATADIR LIB_DIR_SUFFIX ":" DATADIR LIB_DIR_SUFFIX DIR_SEPARATOR_STRING "small" ;
 char *simArgs[40];
 int nsimArgs = 0;
 char model_str[20];
 /* fake filename & lineno to make linker */
 char *filename=NULL;
+char *current_directory;
 int lineno = 0;
 int fatalError = 0;
 
 static void commandLoop(FILE *cmdfile);
-#ifdef HAVE_READLINE
+#ifdef HAVE_READLINE_COMPLETITION
 char *completionCmdSource(const char *text, int state);
 char *completionCmdFile(const char *text, int state);
 char *completionCmdInfo(const char *text, int state);
@@ -86,18 +94,18 @@ char *completionCmdSetOption(const char *text, int state);
 #define completionCmdUnDisplay NULL
 #define completionCmdSetUserBp NULL
 #define completionCmdSetOption NULL
-#endif /* HAVE_READLINE */
+#endif /* HAVE_READLINE_COMPLETITION */
 
 /* command table */
 struct cmdtab
 {
     char      *cmd ;  /* command the user will enter */
     int (*cmdfunc)(char *,context *);   /* function to execute when command is entered */
-#ifdef HAVE_READLINE
+#ifdef HAVE_READLINE_COMPLETITION
     rl_compentry_func_t *completion_func;
 #else
     void *dummy;
-#endif  /* HAVE_READLINE */
+#endif  /* HAVE_READLINE_COMPLETITION */
     char *htxt ;    /* short help text */
 
 } cmdTab[] = {
@@ -250,11 +258,11 @@ char *trim_left(char *s)
 
 char *trim_right(char *s)
 {
-    char *p = &s[strlen(s)];
+    char *p = &s[strlen(s) - 1];
 
-    while (p > s && isspace(*--p))
-      ;
-    *p = '\0';
+    while (p >= s && isspace(*p))
+      --p;
+    *++p = '\0';
 
     return s;
 }
@@ -379,7 +387,7 @@ char *searchDirsFname (char *fname)
 {
     char *dirs , *sdirs;
     FILE *rfile = NULL;
-    char buffer[128];
+    char buffer[1024];
 
     /* first try the current directory */
     if ((rfile = fopen(fname,"r"))) {
@@ -421,7 +429,7 @@ FILE *searchDirsFopen(char *fname)
 {
     char *dirs , *sdirs;
     FILE *rfile = NULL;
-    char buffer[128];
+    char buffer[1024];
 
     /* first try the current directory */
     if ((rfile = fopen(fname,"r")))
@@ -685,35 +693,13 @@ static void functionPoints (void)
     }
 }
 
-
-/*-----------------------------------------------------------------*/
-/* setEntryExitBP - set the entry & exit Break Points for functions*/
-/*-----------------------------------------------------------------*/
-DEFSETFUNC(setEntryExitBP)
-{
-    function *func = item;
-
-    if (func->sym && func->sym->addr && func->sym->eaddr) {
-
-        /* set the entry break point */
-        setBreakPoint (func->sym->addr , CODE , FENTRY ,
-            fentryCB ,func->mod->c_name , func->entryline);
-
-        /* set the exit break point */
-        setBreakPoint (func->sym->eaddr , CODE , FEXIT  ,
-            fexitCB  ,func->mod->c_name , func->exitline );
-    }
-
-    return 0;
-}
-
 /*-----------------------------------------------------------------*/
 /* cmdFile - load file into the debugger                           */
 /*-----------------------------------------------------------------*/
 int cmdFile (char *s,context *cctxt)
 {
     FILE *cdbFile;
-    char buffer[128];
+    char buffer[1024];
     char *bp;
 
     s = trim_left(s);
@@ -768,7 +754,7 @@ int cmdFile (char *s,context *cctxt)
     /*set the break points
        required by the debugger . i.e. the function entry
        and function exit break points */
-    applyToSet(functions,setEntryExitBP);
+//    applyToSet(functions,setEntryExitBP);
 
     setMainContext();
     return 0;
@@ -844,6 +830,16 @@ int cmdHelp (char *s, context *cctxt)
 static char cmdbuff[MAX_CMD_LEN];
 static int sim_cmd_mode = 0;
 
+char *
+canonname(char *file)
+{
+    static char        buffer[1024];
+    if (*file == '/')
+       return file;
+    sprintf(buffer,"%s/%s", current_directory, file);
+    return buffer;
+}
+
 /*-----------------------------------------------------------------
  interpretCmd - interpret and do the command.  Return 0 to continue,
    return 1 to exit program.
@@ -856,7 +852,7 @@ int interpretCmd (char *s)
 
     /* if nothing & previous command exists then
        execute the previous command again */
-    if (*s == '\n' && pcmd)
+    if ((*s == '\n' || *s == '\0') && pcmd)
         strcpy(s,pcmd);
 
     /* if previous command exists & is different
@@ -869,7 +865,7 @@ int interpretCmd (char *s)
     } else
         pcmd = strdup(s);
 
-    /* trim tailing blanks */
+    /* trim trailing blanks */
     s = trim_right(s);
 
     if (sim_cmd_mode) {
@@ -909,11 +905,11 @@ int interpretCmd (char *s)
                 showfull = 0;
                 if (srcMode == SRC_CMODE)
                     fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
-                        currCtxt->func->mod->cfullname,
+                        canonname(currCtxt->func->mod->cfullname),
                         currCtxt->cline+1,currCtxt->addr);
                 else
                     fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
-                        currCtxt->func->mod->afullname,
+                        canonname(currCtxt->func->mod->afullname),
                         currCtxt->asmline,currCtxt->addr);
                 displayAll(currCtxt);
             }
@@ -958,7 +954,7 @@ void stopCommandList()
     stopcmdlist = 1;
 }
 
-#ifdef HAVE_READLINE
+#ifdef HAVE_READLINE_COMPLETITION
 // helper function for doing readline completion.
 // input: toknum=index of token to find (0=first token)
 // output: *start=first character index of the token,
@@ -977,12 +973,12 @@ int completionHelper_GetTokenNumber(int toknum, int *start, int *end)
     {
         // start = skip blanks from end
         *start = *end;
-        while (p[*start] && isblank( p[*start] ))
+        while (p[*start] && isspace( p[*start] ))
             (*start)++;
 
         // end = skip non-blanks from start
         *end = *start;
-        while (p[*end] && !isblank( p[*end] ))
+        while (p[*end] && !isspace( p[*end] ))
             (*end)++;
 
         if (tok_index == toknum)
@@ -1051,14 +1047,14 @@ char *completionCommandsList(const char *text, int state)
         char *p = rl_line_buffer;
 
         // skip blanks
-        while (p && isblank(*p))
+        while (p && isspace(*p))
         {
             if (p-rl_line_buffer == rl_point)
                 ok = 1;
             p++;
         }
 
-        while (p && !isblank(*p))
+        while (p && !isspace(*p))
         {
             if (p-rl_line_buffer == rl_point)
                 ok = 1;
@@ -1419,7 +1415,7 @@ char *completionMain(const char *text, int state)
 
     return (*compl_func)(text,state);
 }
-#endif  /* HAVE_READLINE */
+#endif  /* HAVE_READLINE_COMPLETITION */
 
 /*-----------------------------------------------------------------*/
 /* commandLoop - the main command loop or loop over command file   */
@@ -1429,11 +1425,13 @@ static void commandLoop(FILE *cmdfile)
     char *line, save_ch, *s;
     char *line_read;
 
-#ifdef HAVE_READLINE
+#ifdef HAVE_LIBREADLINE
     FILE *old_rl_instream, *old_rl_outstream;
     actualcmdfile = cmdfile;
 
+#ifdef HAVE_READLINE_COMPLETITION
     rl_completion_entry_function = completionMain;
+#endif  /* HAVE_READLINE_COMPLETITION */
     rl_readline_name = "sdcdb"; // Allow conditional parsing of the ~/.inputrc file.
 
     // save readline's input/output streams
@@ -1453,9 +1451,9 @@ static void commandLoop(FILE *cmdfile)
           if ( cmdfile == stdin )
           {
               if (sim_cmd_mode)
-                  line_read = (char*)readline ("(sim)");
+                  line_read = (char*)readline ("(sim) ");
               else
-                  line_read = (char*)readline ("(sdcdb)");
+                  line_read = (char*)readline ("(sdcdb) ");
           }
           else
               line_read = (char*)readline ("");
@@ -1497,7 +1495,7 @@ static void commandLoop(FILE *cmdfile)
         //        actualcmdfile,cmdfile);
         if (fgets(cmdbuff,sizeof(cmdbuff),cmdfile) == NULL)
             break;
-#endif  /* HAVE_READLINE */
+#endif  /* HAVE_LIBREADLINE */
 
           if (interpretCmd(cmdbuff))
               break;
@@ -1530,11 +1528,11 @@ static void commandLoop(FILE *cmdfile)
             }
         }
     }
-#ifdef HAVE_READLINE
+#ifdef HAVE_LIBREADLINE
     // restore readline's input/output streams
     rl_instream = old_rl_instream;
     rl_outstream = old_rl_outstream;
-#endif  /* HAVE_READLINE */
+#endif  /* HAVE_LIBREADLINE */
 }
 
 /*-----------------------------------------------------------------*/
@@ -1598,7 +1596,7 @@ static void parseCmdLine (int argc, char **argv)
             }
 
             if (strncmp(argv[i],"-cd=",4) == 0) {
-                chdir(argv[i][4]);
+                chdir(argv[i]+4);
                 continue;
             }
 
@@ -1655,8 +1653,10 @@ static void parseCmdLine (int argc, char **argv)
 
             /* serial port */
             if ( (strcmp(argv[i],"-S") == 0) ||
-                (strcmp(argv[i],"-s") == 0)) {
-                simArgs[nsimArgs++] = strdup(argv[i]);
+                (strcmp(argv[i],"-s") == 0) ||
+                (strcmp(argv[i],"-T") == 0) ||
+                (strcmp(argv[i],"--tty") == 0)) {
+               simArgs[nsimArgs++] = "--tty";
                 simArgs[nsimArgs++] = strdup(argv[++i]);
                 continue ;
             }
@@ -1759,7 +1759,8 @@ int main ( int argc, char **argv)
     printVersionInfo();
     printf("WARNING: SDCDB is EXPERIMENTAL.\n");
 
-    simArgs[nsimArgs++] = "s51";
+    current_directory = get_current_dir_name();
+    simArgs[nsimArgs++] = "ao-dbg";
     simArgs[nsimArgs++] = "-P";
     simArgs[nsimArgs++] = "-r 9756";
     /* parse command line */