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