File mgdiff-1.0.dif of Package mgdiff

--- Imakefile
+++ Imakefile	2006-03-07 11:15:24.000000000 +0100
@@ -8,13 +8,14 @@
 XCOMM
 XCOMM for Dell SVR4
 XCOMM
-#EXTRA_LIBRARIES = -lc -lucb
+EXTRA_LIBRARIES = -lXpm
 EXTRA_DEFINES = -Wall -Wstrict-prototypes -Wmissing-prototypes
 
 SRCS = mgdiff.c rundiff.c misc.c files.c spawn.c manual.c modal.c legend.c
 OBJS = mgdiff.o rundiff.o misc.o files.o spawn.o manual.o modal.o legend.o
 
-LOCAL_LIBRARIES = $(XMLIB) $(XTOOLLIB) $(XMULIBONLY) $(XLIB)
+LOCAL_LIBRARIES = $(XMLIB) $(XTOOLLIB) $(XMULIBONLY) $(XLIB) $(XPLIB)
+EXTRA_LOAD_FLAGS = -Wl,-rpath-link,$(SHLIBDIR)
 
 ComplexProgramTarget(mgdiff)
 InstallAppDefaults(Mgdiff)
--- Mgdiff.ad
+++ Mgdiff.ad	2006-03-07 11:15:24.000000000 +0100
@@ -2,6 +2,8 @@
 ! Mgdiff.ad,v 2.0 1994/05/19 02:01:03 dan Exp
 !
 
+*XmScrollBar*width:       15
+
 !
 ! 				widget hierarchy:
 !
@@ -169,9 +171,11 @@
 !
 ! the overview area
 !
-*sbl.width:				16
-*sbr.width:				16
-*dam.width:				16
+*sbl.width:				15
+*sbl.Background:			lightgreen
+*sbr.width:				15
+*sbr.Background:			lightgreen
+*dam.width:				30
 *dam.Foreground:			black
 *dam.Background:			cyan
 
--- externs.h
+++ externs.h	2006-03-07 11:15:24.000000000 +0100
@@ -29,7 +29,7 @@
  */
 
 #if 0
-static char rcsid_externs_h[] = "externs.h,v 2.0 1994/05/19 02:01:05 dan Exp";
+static char rcsid_externs_h[] __attribute__((unused)) = "externs.h,v 2.0 1994/05/19 02:01:05 dan Exp";
 #endif
 
 extern int main (int argc, char *argv[]);
--- files.c
+++ files.c	2006-03-07 11:15:24.000000000 +0100
@@ -1,5 +1,5 @@
 #if 0
-static char rcsid[] = "files.c,v 2.0 1994/05/19 02:01:06 dan Exp";
+static char rcsid[] __attribute__((unused)) = "files.c,v 2.0 1994/05/19 02:01:06 dan Exp";
 #endif
 
 /*
@@ -151,7 +151,8 @@
     XtSetArg (args[0], XmNmessageString, xms);
     XtSetArg (args[1], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL);
     dialog = XmCreateErrorDialog (parent, "werror", args, 2);
-    XmStringFree (xms);
+    if (xms)
+	XmStringFree (xms);
     XtVaSetValues (XtParent (dialog), XtNtitle, title, NULL);
 
     XtUnmanageChild (XmMessageBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON));
@@ -177,8 +178,10 @@
 	    xms1 = xms4;
 	else {
 	    xms2 = XmStringConcat (xms1, xms4);
-	    XmStringFree (xms4);
-	    XmStringFree (xms1);
+	    if (xms4)
+		XmStringFree (xms4);
+	    if (xms1)
+		XmStringFree (xms1);
 	    xms1 = xms2;
 	}
 
@@ -186,16 +189,19 @@
 	    XmString xms3;
 
 	    xms3 = XmStringConcat (xms1, sep);
-	    XmStringFree (xms1);
+	    if (xms1)
+		XmStringFree (xms1);
 	    xms1 = xms3;
 	}
     }
-    XmStringFree (sep);
+    if (sep)
+	XmStringFree (sep);
     
     XtSetArg (args[0], XmNmessageString, xms1);
     XtSetArg (args[1], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL);
     dialog = XmCreateErrorDialog (parent, "werror", args, 2);
-    XmStringFree (xms1);
+    if (xms1)
+	XmStringFree (xms1);
     XtVaSetValues (XtParent (dialog), XtNtitle, title, NULL);
     XtUnmanageChild (XmMessageBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON));
     XtUnmanageChild (XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON));
@@ -321,7 +327,7 @@
     Arg args[2];
     int i;
     char *dir;
-    XmString xms = NULL ;
+    XmString xms = (XmString)0;
 
     shell = XtVaCreatePopupShell ("openfiles", xmDialogShellWidgetClass, parent,
 				  XmNallowShellResize, True,
@@ -352,7 +358,8 @@
     fsb1 = XmCreateFileSelectionBox (frame1a, "files1", args, i);
     if (dir) {
 	XtFree (dir);
-	XmStringFree (xms);
+	if (xms)
+	    XmStringFree (xms);
     }
 
     i = 0;
@@ -363,7 +370,8 @@
     fsb2 = XmCreateFileSelectionBox (frame2a, "files2", args, i);
     if (dir) {
 	XtFree (dir);
-	XmStringFree (xms);
+	if (xms)
+	    XmStringFree (xms);
     }
 
     XtAddCallback (fsb1, XmNokCallback, filel_both_cb, shell);
@@ -427,7 +435,7 @@
     Arg args[2];
     int i;
     char *dir;
-    XmString xms = NULL ;
+    XmString xms = (XmString)0;
 
     i = 0;
     XtSetArg (args[i], XmNdeleteResponse, XmDO_NOTHING); i++;
@@ -438,7 +446,8 @@
     dialog = XmCreateFileSelectionDialog (parent, "openfile", args, i);
     if (dir) {
 	XtFree (dir);
-	XmStringFree (xms);
+	if (xms)
+	    XmStringFree (xms);
     }
     XtAddCallback (XtParent (dialog), XmNpopupCallback, popup_cb, parent);
     XtAddCallback (dialog, XmNokCallback, file_left_cb, dialog);
@@ -480,7 +489,7 @@
     Arg args[2];
     int i;
     char *dir;
-    XmString xms = NULL ;
+    XmString xms = (XmString)0;
 
     i = 0;
     XtSetArg (args[i], XmNdeleteResponse, XmDO_NOTHING); i++;
@@ -491,7 +500,8 @@
     dialog = XmCreateFileSelectionDialog (parent, "openfile", args, XtNumber (args));
     if (dir) {
 	XtFree (dir);
-	XmStringFree (xms);
+	if (xms)
+	    XmStringFree (xms);
     }
 
     XtAddCallback (XtParent (dialog), XmNpopupCallback, popup_cb, parent);
@@ -572,7 +582,7 @@
     Arg args[3];
     int i;
     char *dir;
-    XmString xms = NULL ;
+    XmString xms = (XmString)0;
 
     i = 0;
     XtSetArg (args[i], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); i++;
@@ -585,7 +595,8 @@
     dialog = XmCreateFileSelectionDialog (parent, "savefile", args, i);
     if (dir) {
 	XtFree (dir);
-	XmStringFree (xms);
+	if (xms)
+	    XmStringFree (xms);
     }
 
     XtAddCallback (XtParent (dialog), XmNpopupCallback, popup_cb, parent);
--- legend.c
+++ legend.c	2006-03-07 11:15:24.000000000 +0100
@@ -1,5 +1,5 @@
 #if 0
-static char rcsid[] = "legend.c,v 2.0 1994/05/19 02:01:08 dan Exp";
+static char rcsid[] __attribute__((unused)) = "legend.c,v 2.0 1994/05/19 02:01:08 dan Exp";
 #endif
 
 /*
--- manual.c
+++ manual.c	2006-03-07 11:15:24.000000000 +0100
@@ -1,5 +1,5 @@
 #if 0
-static char rcsid[] = "manual.c,v 2.0 1994/05/19 02:01:09 dan Exp";
+static char rcsid[] __attribute__((unused)) = "manual.c,v 2.0 1994/05/19 02:01:09 dan Exp";
 #endif
 
 /*
--- mgdiff.c
+++ mgdiff.c	2006-03-07 11:26:05.000000000 +0100
@@ -1,9 +1,9 @@
 #if 0
-static char rcsid[] = "mgdiff.c,v 2.1 1994/09/29 01:56:53 dan Exp";
+static char rcsid[] __attribute__((unused)) = "mgdiff.c,v 2.1 1994/09/29 01:56:53 dan Exp";
 #endif
 
 #if 0
-static char copyright[] = "Copyright (c) 1994, Daniel Williams";
+static char copyright[] __attribute__((unused)) = "Copyright (c) 1994, Daniel Williams";
 #endif
 
 /*
@@ -34,6 +34,8 @@
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#define _GNU_SOURCE
+
 #include <X11/Xos.h>
 
 #include <stdio.h>
@@ -81,7 +83,7 @@
 static void do_nothing (Widget widget, XEvent *event, String *params, Cardinal *num_params);
 static void add_actions (XtAppContext app);
 static int  x_error_handler (Display *dpy, XErrorEvent *event);
-static void xt_error_handler (String message);
+static void xt_error_handler (String message) __attribute__ ((noreturn));
 static void xt_warning_handler (String message);
 static void redraw_partial_vert (Widget w);
 static void redraw_partial_horz (Widget w);
@@ -111,7 +113,9 @@
 static void unselect_all (void);
 static Boolean all_selected (void);
 static Dimension get_preferred_width (Widget w);
+#if !(defined __GLIBC__ && __GLIBC__ >= 2)
 static char *mgdiff_basename (char *name);
+#endif
 
 enum {
     WIDGET_LEFT	 = 0x10000000,
@@ -551,7 +555,7 @@
 /* ARGSUSED */
 static void file_cb (Widget w, XtPointer closure, XtPointer call_data)
 {
-    switch ((int) closure) {
+    switch ((intptr_t) closure) {
     case 0:			/* open */
 	toggle_open_sensitive (False);
 	set_cursor (toplevel);
@@ -608,7 +612,7 @@
 /* ARGSUSED */
 static void view_cb (Widget w, XtPointer closure, XtPointer call_data)
 {
-    switch ((int) closure) {
+    switch ((intptr_t) closure) {
     case 0:			/* previous */
 	prev_diff (NULL, NULL, NULL);
 	break;
@@ -630,7 +634,7 @@
 /* ARGSUSED */
 static void select_cb (Widget w, XtPointer closure, XtPointer call_data)
 {
-    switch ((int) closure) {
+    switch ((intptr_t) closure) {
     case 0:			/* left */
 	select_all (LEFT);
 	break;
@@ -652,7 +656,7 @@
 /* ARGSUSED */
 static void options_cb (Widget w, XtPointer closure, XtPointer call_data)
 {
-    switch ((int) closure) {
+    switch ((intptr_t) closure) {
     case 0:			/* toggle overview area */
 	overview_flag = !overview_flag;
 	if (overview_flag) {
@@ -708,7 +712,7 @@
 /* ARGSUSED */
 static void helpmenu_cb (Widget w, XtPointer closure, XtPointer call_data)
 {
-    switch ((int) closure) {
+    switch ((intptr_t) closure) {
     case 0:			/* version */
 	show_version (toplevel);
 	break;
@@ -1066,12 +1070,12 @@
     {"quitIfSame", "QuitIfSame", XtRBoolean, sizeof (Boolean), 0, XtRString, "false"},
     {"debug", "Debug", XtRBoolean, sizeof (Boolean), 0, XtRString, "false"},
     {"filename", "Filename", XtRString, sizeof (String), 0, XtRString, ""}};
-    
+#if !(defined __GLIBC__ && __GLIBC__ >= 2)
     progname = mgdiff_basename (argv[0]);
+#else
+    progname = basename (argv[0]);
+#endif
 
-    XtSetLanguageProc (NULL, NULL, NULL);
-    setlocale (LC_ALL, "");
-    setlocale (LC_CTYPE, "en");
     toplevel = XtVaAppInitialize (&app, "Mgdiff", option_table, XtNumber (option_table),
 #if X11R5
 				  &argc,
@@ -1079,6 +1083,10 @@
 				  (unsigned int *) &argc,
 #endif
 				  argv, fallbacks, NULL);
+    setlocale (LC_ALL, "");
+    setlocale (LC_CTYPE, "POSIX");
+    XtSetLanguageProc (app, NULL, NULL);
+
 
     XtVaGetValues (toplevel, XmNdepth, &depth, NULL);
     if (depth == 1)
@@ -1921,19 +1929,20 @@
 
 	    value = (b->sline >= lines_of_context) ? (b->sline - lines_of_context) : b->sline;
 	    XtVaGetValues (sb, XmNmaximum, &maximum, XmNsliderSize, &slidersize, NULL);
-	    if (value > (maximum - slidersize))
-		value = maximum - slidersize;
 
 	    if ((w == sbl) || (w == sbr)) {
 		int side = (w == sbl) ? LEFT : RIGHT;
 
-		if (newcbs.value > (maximum - slidersize)) {
-		    newcbs.value = maximum - slidersize;
-		    XtVaSetValues (w, XmNvalue, newcbs.value - b->sline + b->arr[side].fline, NULL);
+		if (value > (maximum - slidersize)) {
+		    value = maximum - slidersize;
+		    XtVaSetValues (w, XmNvalue, value - b->sline + b->arr[side].fline, NULL);
 		    return;
 		}
 	    }
 
+	    if (value > (maximum - slidersize))
+		value = maximum - slidersize;
+
 	    newcbs.reason = XmCR_VALUE_CHANGED;
 	    newcbs.event = NULL;
 	    newcbs.value = value;
@@ -2640,6 +2649,7 @@
 /* 
  * delete any prefix ending in '/' and return a copy
  */
+#if !(defined __GLIBC__ && __GLIBC__ >= 2)
 static char *mgdiff_basename (char *path)
 {
     if (path) {
@@ -2665,3 +2675,4 @@
     else
 	return (NULL);
 }
+#endif
--- mgdiff.h
+++ mgdiff.h	2006-03-07 11:15:24.000000000 +0100
@@ -2,7 +2,7 @@
 #define MXDIFF_H
 
 #if 0
-static char rcsid_mgdiff_h[] = "mgdiff.h,v 2.0 1994/05/19 02:01:15 dan Exp";
+static char rcsid_mgdiff_h[] __attribute__((unused)) = "mgdiff.h,v 2.0 1994/05/19 02:01:15 dan Exp";
 #endif
 
 /*
@@ -90,11 +90,27 @@
  */
 #define X11R5 (defined(XtSpecificationRelease) && (XtSpecificationRelease >= 5))
 
+#include <string.h>
+#include <stdlib.h>
+static inline char* xstrdup(const char *s)
+{
+    char *ret = strdup(s);
+    if (!ret) {
+        perror("strdup");
+        exit (1);
+    }
+    return ret;
+}
+
 /*
  * According to IETF RFC 2279, byte values of 0xfe and 0xff are
  * not legal utf-8, but all others bytes are legal.
  */
+#if 1
 #define islatin(c)     (isprint((c)) || ((((unsigned char)(c)) <= 0xfd)))
-
 #define isallowed(c)	(isascii((c)) || islatin((c)))
+#else
+#define islatin(c)	((isprint((c)) || ((((unsigned int)(c)) >= 160) && (((unsigned int)(c)) <= 255))))
+#define isallowed(c)	(isascii((c)) || islatin((c)))
+#endif
 #endif
--- misc.c
+++ misc.c	2006-03-07 11:15:24.000000000 +0100
@@ -1,5 +1,5 @@
 #if 0
-static char rcsid[] = "misc.c,v 2.0 1994/05/19 02:01:19 dan Exp";
+static char rcsid[] __attribute__((unused)) = "misc.c,v 2.0 1994/05/19 02:01:19 dan Exp";
 #endif
 
 /*
@@ -64,7 +64,7 @@
 {
     FILE *fout ;
     int fd ;
-	
+#if !(defined __GLIBC__ && __GLIBC__ >= 2)
     /*
     **	Seed the random() generator. This does not need to be super
     **	randomised as the while loop below will be run until a file
@@ -87,7 +87,18 @@
 	
 	break ;
     }
-
+#else
+    snprintf (name, name_len, "/tmp/mgdif-XXXXXX");
+    if ((fd = mkstemp(name)) < 0) {
+	perror("mkstemp");
+	exit(1);
+    }
+    if ((fout = fdopen (fd, "r+")) == NULL) {
+	close (fd);
+	perror("fdopen");
+	exit(1);
+    }
+#endif
     while (!feof (fin)) {
 	char buffer[BUFSIZ];
 	int nitems;
--- modal.c
+++ modal.c	2006-03-07 11:15:24.000000000 +0100
@@ -1,5 +1,5 @@
 #if 0
-static char rcsid[] = "modal.c,v 2.0 1994/05/19 02:01:20 dan Exp";
+static char rcsid[] __attribute__((unused)) = "modal.c,v 2.0 1994/05/19 02:01:20 dan Exp";
 #endif
 
 /*
--- patchlevel.h
+++ patchlevel.h	2006-03-07 11:15:24.000000000 +0100
@@ -29,7 +29,7 @@
  */
 
 #if 0
-static char rcsid_patchlevel_h[] = "patchlevel.h,v 2.0 1994/05/19 02:01:21 dan Exp";
+static char rcsid_patchlevel_h[] __attribute__((unused)) = "patchlevel.h,v 2.0 1994/05/19 02:01:21 dan Exp";
 #endif
 
 #define VERSION    "1.0"
--- rundiff.c
+++ rundiff.c	2006-03-07 11:15:24.000000000 +0100
@@ -1,5 +1,5 @@
 #if 0
-static char rcsid[] = "rundiff.c,v 2.0 1994/05/19 02:01:22 dan Exp";
+static char rcsid[] __attribute__((unused)) = "rundiff.c,v 2.0 1994/05/19 02:01:22 dan Exp";
 #endif
 
 /*
@@ -44,6 +44,16 @@
 #include "mgdiff.h"
 #include "externs.h"
 
+static inline void* xcalloc(size_t nmemb, size_t size)
+{
+    void *ret = calloc(nmemb, size);
+    if (!ret) {
+	perror("calloc");
+	exit (1);
+    }
+    return ret;
+}
+
 /* 
  * this is the maximum number of lines shown to the user if diff
  * returns an error
@@ -170,22 +180,22 @@
     Block *b;
     DiffInfo *di;
 
-    di = (DiffInfo *) calloc (1, sizeof (DiffInfo));
+    di = (DiffInfo *) xcalloc (1, sizeof (DiffInfo));
     di->longline = "  ";
     di->maxcols = strlen (di->longline);
     di->status = 2;
 
-    b = (Block *) calloc (1, sizeof (Block));
+    b = (Block *) xcalloc (1, sizeof (Block));
     b->selected = NEITHER;
     b->arr[LEFT].type = b->arr[RIGHT].type = SAME;
     b->sline = 0;
     b->ssize = 1;
     b->arr[LEFT].fline = b->arr[RIGHT].fline = 0;
     b->arr[LEFT].fsize = b->arr[RIGHT].fsize = 1;
-    b->arr[LEFT].text = (char **) calloc (1, sizeof (char *));
-    b->arr[LEFT].wtext = (char **) calloc (1, sizeof (char *));
-    b->arr[LEFT].tlen = (short *) calloc (1, sizeof (short));
-    b->arr[LEFT].text[0] = strdup ("  ");
+    b->arr[LEFT].text = (char **) xcalloc (1, sizeof (char *));
+    b->arr[LEFT].wtext = (char **) xcalloc (1, sizeof (char *));
+    b->arr[LEFT].tlen = (short *) xcalloc (1, sizeof (short));
+    b->arr[LEFT].text[0] = xstrdup ("  ");
     b->arr[LEFT].tlen[0] = strlen (b->arr[LEFT].text[0]);
 
     b->arr[RIGHT].text = NULL;
@@ -220,7 +230,7 @@
     file2 = fopen (path2, "r");
     diff = spawn_diff (prog, args, path1, path2);
 
-    di = (DiffInfo *) calloc (1, sizeof (DiffInfo));
+    di = (DiffInfo *) xcalloc (1, sizeof (DiffInfo));
     di->longline = "";
 
     XmUpdateDisplay (toplevel);
@@ -244,21 +254,21 @@
 	    if (di->errors == 0) {
 		char cmdline[4096];
 
-		di->etext = (char **) calloc (MAX_ERROR_LINES + 1, sizeof (char *));
+		di->etext = (char **) xcalloc (MAX_ERROR_LINES + 1, sizeof (char *));
 		(void) snprintf (cmdline, sizeof (cmdline), "    \"%s %s %s %s\"", prog, args, path1, path2);
-		di->etext[di->errors++] = strdup ("diff command line:");
-		di->etext[di->errors++] = strdup ("");
-		di->etext[di->errors++] = strdup (cmdline);
-		di->etext[di->errors++] = strdup ("");
-		di->etext[di->errors++] = strdup ("produced this output:");
-		di->etext[di->errors++] = strdup ("");
+		di->etext[di->errors++] = xstrdup ("diff command line:");
+		di->etext[di->errors++] = xstrdup ("");
+		di->etext[di->errors++] = xstrdup (cmdline);
+		di->etext[di->errors++] = xstrdup ("");
+		di->etext[di->errors++] = xstrdup ("produced this output:");
+		di->etext[di->errors++] = xstrdup ("");
 	    }
 	    if (di->errors < MAX_ERROR_LINES)
-		di->etext[di->errors++] = strdup (buffer);
+		di->etext[di->errors++] = xstrdup (buffer);
 	    break;
 	case ADD:
 	    if (f2n1 != fline2) {
-		b = (Block *) calloc (1, sizeof (Block));
+		b = (Block *) xcalloc (1, sizeof (Block));
 		b->selected = NEITHER;
 		b->arr[LEFT].type = b->arr[RIGHT].type = SAME;
 		b->sline = sline;
@@ -267,9 +277,9 @@
 		b->arr[LEFT].fsize = b->arr[RIGHT].fsize = f2n1 - fline2;
 		b->ssize = f2n1 - fline2;
 		
-		b->arr[LEFT].text = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-		b->arr[LEFT].wtext = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-		b->arr[LEFT].tlen = (short *) calloc (b->arr[LEFT].fsize, sizeof (short));
+		b->arr[LEFT].text = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+		b->arr[LEFT].wtext = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+		b->arr[LEFT].tlen = (short *) xcalloc (b->arr[LEFT].fsize, sizeof (short));
 		for (i = 0; i < b->arr[LEFT].fsize; i++) {
 		    getline (file1, &b->arr[LEFT].text[i], &b->arr[LEFT].wtext[i]);
 		    b->arr[LEFT].tlen[i] = strlen (b->arr[LEFT].text[i]);
@@ -285,7 +295,7 @@
 		add_blist (b);
 	    }
 
-	    b = (Block *) calloc (1, sizeof (Block));
+	    b = (Block *) xcalloc (1, sizeof (Block));
 	    b->selected = NEITHER;
 	    b->arr[LEFT].type = BLANK;
 	    b->arr[RIGHT].type = INSERT;
@@ -296,9 +306,9 @@
 	    b->arr[RIGHT].fsize = f2n2 - f2n1 + 1;
 	    b->ssize = max (b->arr[LEFT].fsize, b->arr[RIGHT].fsize);
 
-	    b->arr[RIGHT].text = (char **) calloc (b->arr[RIGHT].fsize, sizeof (char *));
-	    b->arr[RIGHT].wtext = (char **) calloc (b->arr[RIGHT].fsize, sizeof (char *));
-	    b->arr[RIGHT].tlen = (short *) calloc (b->arr[RIGHT].fsize, sizeof (short));
+	    b->arr[RIGHT].text = (char **) xcalloc (b->arr[RIGHT].fsize, sizeof (char *));
+	    b->arr[RIGHT].wtext = (char **) xcalloc (b->arr[RIGHT].fsize, sizeof (char *));
+	    b->arr[RIGHT].tlen = (short *) xcalloc (b->arr[RIGHT].fsize, sizeof (short));
 	    for (i = 0; i < b->arr[RIGHT].fsize; i++) {
 		getline (file2, &b->arr[RIGHT].text[i], &b->arr[RIGHT].wtext[i]);
 		b->arr[RIGHT].tlen[i] = strlen (b->arr[RIGHT].text[i]);
@@ -318,7 +328,7 @@
 	    break;
 	case CHANGE:
 	    if (f1n1 != fline1) {
-		b = (Block *) calloc (1, sizeof (Block));
+		b = (Block *) xcalloc (1, sizeof (Block));
 		b->selected = NEITHER;
 		b->arr[LEFT].type = b->arr[RIGHT].type = SAME;
 		b->sline = sline;
@@ -327,9 +337,9 @@
 		b->arr[LEFT].fsize = b->arr[RIGHT].fsize = f1n1 - fline1;
 		b->ssize = f1n1 - fline1;
 		
-		b->arr[LEFT].text = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-		b->arr[LEFT].wtext = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-		b->arr[LEFT].tlen = (short *) calloc (b->arr[LEFT].fsize, sizeof (short));
+		b->arr[LEFT].text = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+		b->arr[LEFT].wtext = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+		b->arr[LEFT].tlen = (short *) xcalloc (b->arr[LEFT].fsize, sizeof (short));
 		for (i = 0; i < b->arr[LEFT].fsize; i++) {
 		    getline (file1, &b->arr[LEFT].text[i], &b->arr[LEFT].wtext[i]);
 		    b->arr[LEFT].tlen[i] = strlen (b->arr[LEFT].text[i]);
@@ -344,7 +354,7 @@
 		sline += b->ssize;
 		add_blist (b);
 	    }
-	    b = (Block *) calloc (1, sizeof (Block));
+	    b = (Block *) xcalloc (1, sizeof (Block));
 	    b->selected = NEITHER;
 	    b->arr[LEFT].type = b->arr[RIGHT].type = DIFF;
 	    b->sline = sline;
@@ -354,9 +364,9 @@
 	    b->arr[RIGHT].fsize = f2n2 - f2n1 + 1;
 	    b->ssize = max (b->arr[LEFT].fsize, b->arr[RIGHT].fsize);
 
-	    b->arr[LEFT].text = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-	    b->arr[LEFT].wtext = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-	    b->arr[LEFT].tlen = (short *) calloc (b->arr[LEFT].fsize, sizeof (short));
+	    b->arr[LEFT].text = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+	    b->arr[LEFT].wtext = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+	    b->arr[LEFT].tlen = (short *) xcalloc (b->arr[LEFT].fsize, sizeof (short));
 	    for (i = 0; i < b->arr[LEFT].fsize; i++) {
 		getline (file1, &b->arr[LEFT].text[i], &b->arr[LEFT].wtext[i]);
 		b->arr[LEFT].tlen[i] = strlen (b->arr[LEFT].text[i]);
@@ -367,9 +377,9 @@
 	    }
 	    fline1 += b->arr[LEFT].fsize;
 
-	    b->arr[RIGHT].text = (char **) calloc (b->arr[RIGHT].fsize, sizeof (char *));
-	    b->arr[RIGHT].wtext = (char **) calloc (b->arr[RIGHT].fsize, sizeof (char *));
-	    b->arr[RIGHT].tlen = (short *) calloc (b->arr[RIGHT].fsize, sizeof (short));
+	    b->arr[RIGHT].text = (char **) xcalloc (b->arr[RIGHT].fsize, sizeof (char *));
+	    b->arr[RIGHT].wtext = (char **) xcalloc (b->arr[RIGHT].fsize, sizeof (char *));
+	    b->arr[RIGHT].tlen = (short *) xcalloc (b->arr[RIGHT].fsize, sizeof (short));
 	    for (i = 0; i < b->arr[RIGHT].fsize; i++) {
 		getline (file2, &b->arr[RIGHT].text[i], &b->arr[RIGHT].wtext[i]);
 		b->arr[RIGHT].tlen[i] = strlen (b->arr[RIGHT].text[i]);
@@ -386,7 +396,7 @@
 	    break;
 	case DELETE:
 	    if (f1n1 != fline1) {
-		b = (Block *) calloc (1, sizeof (Block));
+		b = (Block *) xcalloc (1, sizeof (Block));
 		b->selected = NEITHER;
 		b->arr[LEFT].type = b->arr[RIGHT].type = SAME;
 		b->sline = sline;
@@ -395,9 +405,9 @@
 		b->arr[LEFT].fsize = b->arr[RIGHT].fsize = f1n1 - fline1;
 		b->ssize = f1n1 - fline1;
 		
-		b->arr[LEFT].text = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-		b->arr[LEFT].wtext = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-		b->arr[LEFT].tlen = (short *) calloc (b->arr[LEFT].fsize, sizeof (short));
+		b->arr[LEFT].text = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+		b->arr[LEFT].wtext = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+		b->arr[LEFT].tlen = (short *) xcalloc (b->arr[LEFT].fsize, sizeof (short));
 		for (i = 0; i < b->arr[LEFT].fsize; i++) {
 		    getline (file1, &b->arr[LEFT].text[i], &b->arr[LEFT].wtext[i]);
 		    b->arr[LEFT].tlen[i] = strlen (b->arr[LEFT].text[i]);
@@ -413,7 +423,7 @@
 		add_blist (b);
 	    }
 
-	    b = (Block *) calloc (1, sizeof (Block));
+	    b = (Block *) xcalloc (1, sizeof (Block));
 	    b->selected = NEITHER;
 	    b->arr[LEFT].type = INSERT;
 	    b->arr[RIGHT].type = BLANK;
@@ -424,9 +434,9 @@
 	    b->arr[RIGHT].fsize = 0;
 	    b->ssize = max (b->arr[LEFT].fsize, b->arr[RIGHT].fsize);
 
-	    b->arr[LEFT].text = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-	    b->arr[LEFT].wtext = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-	    b->arr[LEFT].tlen = (short *) calloc (b->arr[LEFT].fsize, sizeof (short));
+	    b->arr[LEFT].text = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+	    b->arr[LEFT].wtext = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+	    b->arr[LEFT].tlen = (short *) xcalloc (b->arr[LEFT].fsize, sizeof (short));
 	    for (i = 0; i < b->arr[LEFT].fsize; i++) {
 		getline (file1, &b->arr[LEFT].text[i], &b->arr[LEFT].wtext[i]);
 		b->arr[LEFT].tlen[i] = strlen (b->arr[LEFT].text[i]);
@@ -478,7 +488,7 @@
 	;
 
     if (lines > 0) {
-	b = (Block *) calloc (1, sizeof (Block));
+	b = (Block *) xcalloc (1, sizeof (Block));
 	b->selected = NEITHER;
 	b->arr[LEFT].type = b->arr[RIGHT].type = SAME;
 	b->sline = sline;
@@ -487,9 +497,9 @@
 	b->arr[LEFT].fsize = b->arr[RIGHT].fsize = lines;
 	b->ssize = lines;
 		
-	b->arr[LEFT].text = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-	b->arr[LEFT].wtext = (char **) calloc (b->arr[LEFT].fsize, sizeof (char *));
-	b->arr[LEFT].tlen = (short *) calloc (b->arr[LEFT].fsize, sizeof (short));
+	b->arr[LEFT].text = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+	b->arr[LEFT].wtext = (char **) xcalloc (b->arr[LEFT].fsize, sizeof (char *));
+	b->arr[LEFT].tlen = (short *) xcalloc (b->arr[LEFT].fsize, sizeof (short));
  	for (i = 0; i < b->arr[LEFT].fsize; i++) {
 	    getline (file2, &b->arr[LEFT].text[i], &b->arr[LEFT].wtext[i]);
 	    b->arr[LEFT].tlen[i] = strlen (b->arr[LEFT].text[i]);
@@ -552,7 +562,7 @@
     }
 
     if (tabs || ctrls) {
-	char *ret = (char *) calloc (1, len + 1);
+	char *ret = (char *) xcalloc (1, len + 1);
 	int j, ch;
 
 	for (i = 0, j = 0; s[i] != '\0'; i++) {
@@ -589,7 +599,7 @@
     }
     else {
 	*flag = False;
-	return (strdup (s));
+	return (xstrdup (s));
     }
 }
 
@@ -689,7 +699,7 @@
 	while (getc (f) != '\n')
 	    ;
     *cooked = s;
-    *raw = (flag) ? strdup (buffer) : NULL;
+    *raw = (flag) ? xstrdup (buffer) : NULL;
 }
 
 /* 
--- spawn.c
+++ spawn.c	2006-03-07 11:15:24.000000000 +0100
@@ -1,5 +1,5 @@
 #if 0
-static char rcsid[] = "spawn.c,v 2.0 1994/05/19 02:01:23 dan Exp";
+static char rcsid[] __attribute__((unused)) = "spawn.c,v 2.0 1994/05/19 02:01:23 dan Exp";
 #endif
 
 /*
@@ -42,6 +42,25 @@
 
 #define BLOCKSIZE 10
 
+static inline void* xmalloc(size_t size)
+{
+    void *ret = malloc(size);
+    if (!ret) {
+	perror("malloc");
+	exit(1);
+    }
+    return ret;
+}
+static inline void* xrealloc(void *ptr, size_t size)
+{
+    void *ret = realloc(ptr, size);
+    if (!ret) {
+	perror("realloc");
+	exit(1);
+    }
+    return ret;
+}
+
 /* 
  * run a program with command line arguments and two pathname 
  * arguments via fork/exec and return a pipe file descriptor into 
@@ -91,19 +110,19 @@
 
 	argc = 0;
 	count = BLOCKSIZE;
-	argv = (char **) malloc (sizeof (char *) * BLOCKSIZE);
+	argv = (char **) xmalloc (sizeof (char *) * BLOCKSIZE);
 	argv[argc++] = prog;
 
 	for (ptr = strtok (args, " \t"); ptr; ptr = strtok (NULL, " \t")) {
 	    if (argc >= count) {
-		argv = (char **) realloc (argv, sizeof (char *) * BLOCKSIZE);
+		argv = (char **) xrealloc (argv, sizeof (char *) * BLOCKSIZE);
 		count += BLOCKSIZE;
 	    }
 	    argv[argc++] = strdup (ptr);
 	}
 
 	if ((argc + 3) >= count)
-	    argv = (char **) realloc (argv, sizeof (char *) * 3);
+	    argv = (char **) xrealloc (argv, sizeof (char *) * 3);
 
 	argv[argc++] = path1;
 	argv[argc++] = path2;
openSUSE Build Service is sponsored by