You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
-#include <assert.h>
#include "error.h"
#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#include "alloc.h"
#include "command.h"
-#include "getline.h"
+#include "getl.h"
+#include "glob.h"
+#include "lexer.h"
#include "main.h"
#include "output.h"
+#include "progname.h"
+#include "readln.h"
#include "settings.h"
#include "str.h"
#include "var.h"
+#include "version.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
int err_error_count;
int err_warning_count;
int err_verbosity;
-/* File locator stack. */
-static const struct file_locator **file_loc;
-static int nfile_loc, mfile_loc;
\f
/* Fairly common public functions. */
void
tmsg (int class, const char *title, const char *format, ...)
{
- char buf[1024];
-
- /* Format the message into BUF. */
- {
- va_list args;
+ struct error e;
+ va_list args;
- va_start (args, format);
- vsnprintf (buf, 1024, format, args);
- va_end (args);
- }
-
- /* Output the message. */
- {
- struct error e;
+ e.class = class;
+ err_location (&e.where);
+ e.title = title;
- e.class = class;
- err_location (&e.where);
- e.title = title;
- e.text = buf;
- err_vmsg (&e);
- }
+ va_start (args, format);
+ err_vmsg (&e, format, args);
+ va_end (args);
}
/* Writes error message in CLASS, with text FORMAT, formatted with
void
msg (int class, const char *format, ...)
{
- struct string buf;
-
- ds_init (NULL, &buf, 1024);
-
- /* Format the message into BUF. */
- {
- va_list args;
-
- va_start (args, format);
- ds_vprintf (&buf, format, args);
- va_end (args);
- }
-
- /* Output the message. */
- {
- struct error e;
+ struct error e;
+ va_list args;
- e.class = class;
- err_location (&e.where);
- e.title = NULL;
- e.text = buf.string;
- err_vmsg (&e);
- }
+ e.class = class;
+ err_location (&e.where);
+ e.title = NULL;
- ds_destroy (&buf);
+ va_start (args, format);
+ err_vmsg (&e, format, args);
+ va_end (args);
}
/* Terminate due to fatal error in input. */
fflush (stdout);
fflush (stderr);
- fprintf (stderr, "%s: %s\n", pgmname,
+ fprintf (stderr, "%s: %s\n", program_name,
_("Terminating NOW due to a fatal error!"));
- err_hcf (0);
+ terminate (false);
}
/* Terminate unless we're interactive or will go interactive when the
void
err_cond_fail (void)
{
- if (getl_reading_script)
+ if (getl_reading_script ())
{
if (getl_interactive)
getl_close_all ();
}
}
\f
-/* File locator stack functions. */
-
-/* Pushes F onto the stack of file locations. */
-void
-err_push_file_locator (const struct file_locator *f)
-{
- if (nfile_loc >= mfile_loc)
- {
- if (mfile_loc == 0)
- mfile_loc = 8;
- else
- mfile_loc *= 2;
-
- file_loc = xrealloc (file_loc, mfile_loc * sizeof *file_loc);
- }
-
- file_loc[nfile_loc++] = f;
-}
-
-/* Pops F off the stack of file locations.
- Argument F is only used for verification that that is actually the
- item on top of the stack. */
-void
-err_pop_file_locator (const struct file_locator *f)
-{
- assert (nfile_loc >= 0 && file_loc[nfile_loc - 1] == f);
- nfile_loc--;
-}
-
-/* Puts the current file and line number in F, or NULL and -1 if
- none. */
-void
-err_location (struct file_locator *f)
-{
- if (nfile_loc)
- *f = *file_loc[nfile_loc - 1];
- else
- getl_location (&f->filename, &f->line_number);
-}
-\f
/* Obscure public functions. */
/* Writes a blank line to the error device(s).
#define EXIT_FAILURE 1
#endif
-static int terminating;
+static void puts_stdout (const char *s);
+static void dump_message (char *errbuf, unsigned indent,
+ void (*func) (const char *), unsigned width);
-/* Halt-catch-fire. SUCCESS should be nonzero if exiting successfully
- or zero if not. Despite the name, this is the usual way to finish,
- successfully or not. */
void
-err_hcf (int success)
+err_done (void)
{
- terminating = 1;
-
+ lex_done();
getl_uninitialize ();
-
- outp_done ();
-
- exit (success ? EXIT_SUCCESS : EXIT_FAILURE);
+ readln_uninitialize();
}
-static void puts_stdout (const char *s);
-static void dump_message (char *errbuf, unsigned indent,
- void (*func) (const char *), unsigned width);
-
void
-err_vmsg (const struct error *e)
+err_vmsg (const struct error *e, const char *format, va_list args)
{
/* Class flags. */
enum
class &= ERR_CLASS_MASK;
assert (class >= 0 && class < ERR_CLASS_COUNT);
- assert (e->text != NULL);
+ assert (format != NULL);
- ds_init (NULL, &msg, 64);
+ ds_init (&msg, 64);
if (e->where.filename && (error_classes[class].flags & ERR_WITH_FILE))
{
ds_printf (&msg, "%s:", e->where.filename);
if (e->where.line_number != -1)
ds_printf (&msg, "%d:", e->where.line_number);
- ds_putchar (&msg, ' ');
+ ds_putc (&msg, ' ');
}
ds_printf (&msg, "%s: ", gettext (error_classes[class].banner));
ds_printf (&msg, "%s: ", cur_proc);
if (e->title)
- ds_concat (&msg, e->title);
+ ds_puts (&msg, e->title);
- ds_concat (&msg, e->text);
+ ds_vprintf (&msg, format, args);
/* FIXME: Check set_messages and set_errors to determine where to
send errors and messages.
Please note that this is not trivial. We have to avoid an
infinite loop in reporting errors that originate in the output
section. */
- dump_message (ds_value (&msg), 8, puts_stdout, get_viewwidth());
+ dump_message (ds_c_str (&msg), 8, puts_stdout, get_viewwidth());
ds_destroy (&msg);
- if (e->class == FE && !terminating)
- err_hcf (0);
+ if (e->class == FE)
+ terminate (0);
}
\f
/* Private functions. */
memset (buf, ' ', indent);
memcpy (&buf[indent], cp, cp2 - cp);
- if ( hard_break)
- {
- buf[indent + idx + cp2 - cp] = '\n';
- ++idx;
- }
buf[indent + idx + cp2 - cp] = '\0';
func (buf);
cp = cp2;
local_free (buf);
}
+
+
+void
+request_bug_report_and_abort(const char *msg )
+{
+ fprintf(stderr,
+ "******************************************************************\n"
+ "You have discovered a bug in PSPP.\n\n"
+ " Please report this, by sending "
+ "an email to " PACKAGE_BUGREPORT ",\n"
+ "explaining what you were doing when this happened, and including\n"
+ "a sample of your input file which caused it.\n");
+
+ fprintf(stderr,
+ "Also, please copy the following lines into your bug report:\n\n"
+ "bare_version: %s\n"
+ "version: %s\n"
+ "stat_version: %s\n"
+ "host_system: %s\n"
+ "build_system: %s\n"
+ "default_config_path: %s\n"
+ "include_path: %s\n"
+ "groff_font_path: %s\n"
+ "locale_dir: %s\n"
+ "compiler version: %s\n"
+ ,
+
+ bare_version,
+ version,
+ stat_version,
+ host_system,
+ build_system,
+ default_config_path,
+ include_path,
+ groff_font_path,
+ locale_dir,
+#ifdef __VERSION__
+ __VERSION__
+#else
+ "Unknown"
+#endif
+ );
+
+ if ( msg )
+ fprintf(stderr,"Diagnosis: %s\n",msg);
+
+ fprintf(stderr,
+ "******************************************************************\n");
+
+ abort();
+}
+
+void
+err_assert_fail(const char *expr, const char *file, int line)
+{
+ char msg[256];
+ snprintf(msg,256,"Assertion failed: %s:%d; (%s)",file,line,expr);
+ request_bug_report_and_abort( msg );
+}