1% Copyright (C) 2012-2017,2018 John E. Davis
2%
3% This file is part of the S-Lang Library and may be distributed under the
4% terms of the GNU General Public License.  See the file COPYING for
5% more information.
6%---------------------------------------------------------------------------
7require ("sldbcore");
8
9private define vmessage_method ()
10{
11   variable args = __pop_args (_NARGS);
12   () = fprintf (stdout, __push_args (args));
13   () = fflush (stdout);
14}
15
16private define open_file_at_linenum (file, linenum)
17{
18   if (path_extname (file) == ".slc")
19     file = path_sans_extname (file) + ".sl";
20
21   variable fp = fopen (file, "r");
22   if (fp == NULL)
23     {
24	vmessage_method ("Unable to open %s\n", file);
25	return NULL;
26     }
27   if (linenum == 1)
28     return fp;
29
30   foreach (fp) using ("line")
31     {
32	variable line = ();
33	linenum--;
34	if (linenum == 1)
35	  break;
36     }
37   return fp;
38}
39
40private define list_method (file, linemin, linemax)
41{
42   variable n = linemax - linemin + 1;
43   foreach (open_file_at_linenum (file, linemin))
44     {
45	variable line = ();
46	vmessage_method ("%d\t%s", linemin, line);
47	%vmessage_method ("> %s:%d %s", file, linemin, line);
48	linemin++;
49	if (linemin > linemax)
50	  break;
51     }
52}
53
54#ifexists slsh_readline
55slsh_readline_init ("SLDB");
56private variable Rline = NULL;
57private define close_readline ()
58{
59   Rline = NULL;
60}
61Rline = slsh_readline_new ("sldb");
62atexit (&close_readline);
63#endif
64
65private define read_input_method (prompt, default_cmd)
66{
67   variable line;
68   forever
69     {
70	try
71	  {
72#ifexists slsh_readline
73	     line = slsh_readline (Rline, prompt);
74#else
75	     () = fputs (prompt, stdout); () = fflush(stdout);
76	     if (-1 == fgets (&line, stdin))
77	       line = NULL;
78#endif
79	  }
80	catch UserBreakError: continue;
81	if (line == NULL)
82	  break;
83
84	line = strtrim (line, "\t \n");
85	if (line == "")
86	  {
87	     if (default_cmd != NULL)
88	       return default_cmd;
89	     continue;
90	  }
91	break;
92     }
93   return line;
94}
95
96define sldb_initialize ()
97{
98   variable m = sldb_methods ();
99   m.list = &list_method;
100   m.vmessage = &vmessage_method;
101   m.read_input = &read_input_method;
102   m.pprint = &print;
103}
104
105provide ("sldb");
106