home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / debug / fsdb / ed.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-24  |  3.3 KB  |  141 lines

  1. /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
  2. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include "ed.h"
  8. #include "debug.h"
  9. #include "screen.h"
  10. #include "go32.h"
  11. #include "dos.h"
  12. #include <debug/syms.h>
  13. #include <libc/file.h>    /* Workaround for stderr bug below */
  14.  
  15. extern char *source_path;
  16. extern char *setupfilename;
  17. /* ------------------------------------------------------------------------- */
  18. static void
  19. usage (char *myself)
  20. {
  21.   fprintf (stderr, "\
  22. Usage: %s [debug args] debug-image [image args]
  23.  
  24. Options:  -p path    Specify path for source files.
  25.           -d         Enable dual monitor display.
  26.           -s file    Load setup from specified file.
  27. ", myself);
  28.   exit (1);
  29. }
  30. /* ------------------------------------------------------------------------- */
  31. #ifndef V2DBG
  32. /* Snarf the environment from the child process.  */
  33.  
  34. static inline void
  35. snarf_environment ()
  36. {
  37.   int i, j, k, env0;
  38.  
  39.   read_child (a_tss.tss_esp + 8, &env0, 4);
  40.   for (j = 0; j < 2; j++)
  41.     {
  42.       for (i = 0; ; i++)
  43.     {
  44.       int ep;
  45.  
  46.       read_child (env0 + i * 4, &ep, 4);
  47.       if (!ep)
  48.         {
  49.           if (j)
  50.         environ[i] = 0;
  51.           else
  52.         environ = (char **) xmalloc ((i + 1) * sizeof (char *));
  53.           break;
  54.         }
  55.       if (j)
  56.         {
  57.           char ch;
  58.           for (k = 0; (read_child (ep + k, &ch, 1), ch); k++);
  59.           environ[i] = (char *) xmalloc (k + 1);
  60.           read_child (ep, environ[i], k + 1);
  61.         }
  62.     }
  63.     }
  64. }
  65. #endif
  66. /* ------------------------------------------------------------------------- */
  67. int main(int argc, char **argv)
  68. {
  69.   int i;
  70.   char cmdline[128];
  71.   jmp_buf start_state;
  72.   int argno;
  73.  
  74. #ifndef V2DBG
  75.   /* Under version 1.xx the debugger is not given an environment.  */
  76.   if (!environ)
  77.     snarf_environment ();
  78. #endif
  79.  
  80.   /* Where to find source files.  */
  81.   source_path = getenv ("FSDBPATH");
  82.  
  83.   /* Where to load and save setups.  */
  84.   setupfilename = "fsdb.dsk";
  85.  
  86.   /* Use mono display for debugger, colour for child?  */
  87.   dual_monitor_p = (getenv ("FSDBDUAL") != 0);
  88.  
  89.   argno = 1;
  90.   while (argno < argc && argv[argno][0] == '-')
  91.     {
  92.       if (argv[argno][1] == 'p' && argv[argno][2] == 0)
  93.     {
  94.       if (++argno == argc) usage (argv[0]);
  95.       source_path = argv[argno++];
  96.     }
  97.       else if (argv[argno][1] == 's' && argv[argno][2] == 0)
  98.     {
  99.       if (++argno == argc) usage (argv[0]);
  100.       setupfilename = argv[argno++];
  101.     }
  102.       else if (argv[argno][1] == 'd' && argv[argno][2] == 0)
  103.     {
  104.       argno++;
  105.       dual_monitor_p = 1;
  106.     }
  107.       else
  108.     usage (argv[0]);
  109.     }
  110.   if (argno == argc) usage (argv[0]);
  111.  
  112.   if (dual_monitor_p && ScreenSecondary == 0)
  113.     {
  114.       fprintf (stderr, "%s: dual monitor requested but not available.\n",
  115.            argv[0]);
  116.       exit (1);
  117.     }
  118.  
  119.   syms_init(argv[argno]);
  120.  
  121.   cmdline[1] = 0;
  122.   for (i = argno + 1; argv[i]; i++) {
  123.     strcat(cmdline+1, " ");
  124.     strcat(cmdline+1, argv[i]);
  125.   }
  126.   i = strlen(cmdline+1);
  127.   cmdline[0] = i;
  128.   cmdline[i+1] = 13;
  129.   if(v2loadimage(argv[argno],cmdline,start_state)) {
  130.     printf("Load failed for image %s\n",argv[1]);
  131.     exit(1);
  132.   }
  133.  
  134.   edi_init(start_state);
  135.   stdout->_file = dup(fileno(stdout));
  136.  
  137.   debugger();
  138.  
  139.   return 0;
  140. }
  141.