--- sgrep.c.orig	1992-04-11 00:12:02.000000000 +0200
+++ sgrep.c	2011-11-27 12:44:11.000000000 +0100
@@ -1,6 +1,9 @@
 /* Copyright (c) 1991 Sun Wu and Udi Manber.  All Rights Reserved. */
 #include <stdio.h>
+#include <stdlib.h>
 #include <ctype.h>
+#include <string.h>
+#include <unistd.h>
 #define MAXSYM  256
 #define MAXMEMBER 8192
 #define	CHARTYPE	unsigned char
@@ -18,10 +21,10 @@
 #define LONG_APPX  24
 #define W_DELIM    128
 
-extern COUNT, FNAME, SILENT, FILENAMEONLY, num_of_matched;
-extern DNA ;  /* DNA flag is set in checksg when pattern is DNA pattern and
+extern int COUNT, FNAME, SILENT, FILENAMEONLY, num_of_matched;
+extern int DNA ;  /* DNA flag is set in checksg when pattern is DNA pattern and
 		 p_size > 16  */
-extern WORDBOUND, WHOLELINE, NOUPPER;
+extern int WORDBOUND, WHOLELINE, NOUPPER;
 extern unsigned char CurrentFileName[],  Progname[]; 
 extern unsigned Mask[];
 extern unsigned endposition;
@@ -30,6 +33,21 @@
 unsigned char char_map[MAXSYM];
 	
 
+void bm(CHARTYPE *pat, int m, CHARTYPE *text, CHARTYPE *textend);
+void initmask(CHARTYPE *pattern, unsigned *Mask, register int m, register int D, unsigned *endposition);
+void prep(CHARTYPE *Pattern, register int M, register int D);
+void agrep( register CHARTYPE *pat, int M, register CHARTYPE *text, register CHARTYPE *textend, int D );
+void s_output (CHARTYPE *text, int *i);
+void prep_bm(unsigned char *Pattern, register int m);
+void a_monkey( register unsigned char *pat, register int m, register unsigned char *text, register unsigned char *textend, register int D );
+void am_preprocess(CHARTYPE *Pattern);
+int verify(register int m, register int n, register int D, CHARTYPE *pat, CHARTYPE *text);
+void monkey( register unsigned char *pat, register int m, register unsigned char *text, register unsigned char *textend );
+void monkey4( register unsigned char *pat, int m, register unsigned char *text, register unsigned char *textend, int D  );
+void m_preprocess(CHARTYPE *Pattern);
+void prep4(char *Pattern, int m);
+int blog(int base, int m );
+
 /* data area */
 int shift_1;
 CHARTYPE SHIFT[MAXSYM];
@@ -39,7 +57,7 @@
 char MEMBER_1[MAXMEMBER_1];
 CHARTYPE TR[MAXSYM];
 
-char_tr(pat, m)
+void char_tr(pat, m)
 	unsigned char *pat;
 	int *m;
 {
@@ -64,7 +82,7 @@
 	}
 }
 
-sgrep(pat, m, fd, D)
+void sgrep(pat, m, fd, D)
 CHARTYPE *pat;  int fd, m, D;
 { 
     CHARTYPE text[BLOCKSIZE+2*MAXLINE+MAXPATT]; /* input text stream */
@@ -126,7 +144,7 @@
 /* SUN: bm assumes that the content of text[n]...text[n+m-1] is 
 pat[m-1] such that the skip loop is guaranteed to terminated */
 
-bm(pat, m, text, textend)
+void bm(pat, m, text, textend)
 	CHARTYPE *text, *textend, *pat;  int m;
 {
 register int shift;
@@ -179,7 +197,7 @@
 /* initmask() initializes the mask table for the pattern                    */ 
 /* endposition is a mask for the endposition of the pattern                 */
 /* endposition will contain k mask bits if the pattern contains k fragments */
-initmask(pattern, Mask, m, D, endposition)
+void initmask(pattern, Mask, m, D, endposition)
 CHARTYPE *pattern; unsigned *Mask; register int m, D; unsigned *endposition;
 {
   register unsigned Bit1, c;
@@ -202,7 +220,7 @@
   }
 }
 
-prep(Pattern, M, D)             /* preprocessing for partitioning_bm */
+void prep(Pattern, M, D)             /* preprocessing for partitioning_bm */
 	CHARTYPE *Pattern;  /* can be fine-tuned to choose a better partition */
 	register int M, D;
 {
@@ -250,7 +268,7 @@
 }
 
 
-agrep( pat, M, text, textend, D ) 
+void agrep( pat, M, text, textend, D ) 
 int M, D ; register CHARTYPE *text, *textend, *pat;
 {
   register int i;
@@ -357,7 +375,7 @@
   return;
 }
 
-s_output (text, i) 
+void s_output (text, i) 
 int *i; CHARTYPE *text;
 {
 int kk, bp;
@@ -375,9 +393,9 @@
 }
 
 
-prep_bm(Pattern, m)      
+void prep_bm(Pattern, m)      
 	unsigned char *Pattern;
-	register m;
+	register int m;
 {
 int i, j;
 unsigned hash;
@@ -404,7 +422,7 @@
 
 /* a_monkey() the approximate monkey move */
 
-a_monkey( pat, m, text, textend, D ) 
+void a_monkey( pat, m, text, textend, D ) 
 register int m, D ; register CHARTYPE *text, *textend, *pat;
 {
 register CHARTYPE *oldtext;
@@ -451,7 +469,7 @@
 
 CHARTYPE SHIFT_2[MAX_SHIFT_2];
 
-monkey( pat, m, text, textend  ) 
+void monkey( pat, m, text, textend  ) 
 register int m  ; register CHARTYPE *text, *textend, *pat;
 {
 register unsigned hash, i; 
@@ -494,7 +512,7 @@
   }
 }
  
-am_preprocess(Pattern)
+void am_preprocess(Pattern)
 CHARTYPE *Pattern;
 {
 int i, j, m;
@@ -511,7 +529,7 @@
 }
 
 
-verify(m, n, D, pat, text)
+int verify(m, n, D, pat, text)
 register int m, n, D;
 CHARTYPE *pat, *text;
 {   
@@ -566,7 +584,7 @@
 
 /* preprocessing for monkey()   */
 
-m_preprocess(Pattern)
+void m_preprocess(Pattern)
 CHARTYPE *Pattern;
 {
 int i, j, m;
@@ -595,7 +613,7 @@
 
 char *MEMBER_D;
 
-monkey4( pat, m, text, textend, D  ) 
+void monkey4( pat, m, text, textend, D  ) 
 register int m, D ; register unsigned char *text, *pat, *textend;
 {
 register unsigned char *oldtext;
@@ -639,7 +657,7 @@
   }
 }
  
-prep4(Pattern, m)
+void prep4(Pattern, m)
 char *Pattern; int m;
 {
 int i, j, k;
@@ -672,7 +690,7 @@
         }
 }
 
-blog(base, m )
+int blog(base, m )
 int base, m;
 {
 int i, exp;
