Resurrect bpatch, hope everything's right this time.

This commit is contained in:
Joerg Wunsch 2017-01-28 16:29:20 +00:00
parent 4f41464fb9
commit cf6bdfa4e9
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=432633
6 changed files with 434 additions and 0 deletions

View file

@ -14,6 +14,7 @@
SUBDIR += biew
SUBDIR += bitedit
SUBDIR += boiling-egg
SUBDIR += bpatch
SUBDIR += bvi
SUBDIR += calligra
SUBDIR += calligra-l10n

27
editors/bpatch/Makefile Normal file
View file

@ -0,0 +1,27 @@
# Created by: joerg
# $FreeBSD$
PORTNAME= bpatch
PORTVERSION= 1.0
PORTREVISION= 1
CATEGORIES= editors
MASTER_SITES= ${MASTER_SITE_LOCAL}
MASTER_SITE_SUBDIR= joerg
DISTNAME= ${PORTNAME}
MAINTAINER= joerg@FreeBSD.org
COMMENT= Hex editor that doesn't load the whole file at once
# 2016-11-14: Email from Prof. (em.) John Rupley
# As far as I am concerned, the code is public domain, with no
# restrictions. Steven List, in his README for the original
# distribution, said that the original author, Garry Johnson, gave him
# permission to place the code in the public domain. So, do whatever
# you will with bpatch. Nice to know it may still have a life.
LICENSE= CC0-1.0
NO_WRKSUBDIR= yes
PLIST_FILES= bin/bpatch \
man/man1/bpatch.1.gz
.include <bsd.port.mk>

3
editors/bpatch/distinfo Normal file
View file

@ -0,0 +1,3 @@
TIMESTAMP = 1479337364
SHA256 (bpatch.tar.gz) = 3bb5c8f239be00b18e3ef7f6900bdfb037888a58de8a92ebe24cb0ae6ad41d8c
SIZE (bpatch.tar.gz) = 16087

View file

@ -0,0 +1,42 @@
--- /dev/null Mon Mar 18 12:50:49 1996
+++ Makefile Mon Mar 18 19:30:47 1996
@@ -0,0 +1,39 @@
+# This may have to change on your system.
+# You may have to fiddle with various combinations of curses, termcap,
+# terminfo, etc. Good luck!
+PREFIX?= /usr/local
+BINDIR= ${PREFIX}/bin
+MANDIR= ${PREFIX}/man/man1
+
+LIBS = -lncurses
+#LIBS = -ltermlib
+#LIBS = -lterminfo
+#for sysV
+#LIBS = -lcurses
+
+# However you need getopt.
+#GETOPT = -lgetopt
+#not for sysV! (nor for some BSD)
+#GETOPT =
+
+# If you're running on a 4.[23] system, you probably want this.
+#WORK = -DMOD_HAX
+#sysV
+#WORK =
+
+#BSD or thereabouts
+CFLAGS+= $(WORK)
+#Microport sysV/AT, large model, for sdb debugger
+#CFLAGS = -g -Ml
+
+all: bpatch
+
+clean:
+ rm -f bpatch bpatch.o *.core
+
+bpatch: bpatch.o
+ $(CC) -o bpatch $(CFLAGS) bpatch.o $(GETOPT) $(LIBS)
+
+install: bpatch bpatch.1
+ $(BSD_INSTALL_PROGRAM) bpatch $(DESTDIR)$(BINDIR)
+ $(BSD_INSTALL_MAN) bpatch.1 $(DESTDIR)$(MANDIR)

View file

@ -0,0 +1,347 @@
--- bpatch.c.orig 1990-01-17 15:33:33.000000000 +0100
+++ bpatch.c 2012-11-30 15:20:18.000000000 +0100
@@ -90,10 +90,15 @@
/*E*/
/*S includes, globals, and defines */
/*Page Eject*/
-#include <curses.h>
+#include <ncurses.h>
#include <fcntl.h>
#include <signal.h>
#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -103,14 +108,18 @@
void icc ();
void copyrec ();
void schwapp ();
-
-/* added declarations, mostly for cleanliness */
-extern long lseek();
-extern long atol();
-extern char *strncpy();
-extern void exit();
-extern unsigned sleep(); /* signal problems ??? if sleep called */
-extern void perror();
+void breakp ();
+void reset ();
+int ckfile (char *, long *);
+int bread (int, char *, int, int);
+void errmsg (char *, unsigned);
+void show (int, char[16][16], char *, long, int, long, char, int, int, int, int, int, int);
+void dbg_msg (register char *);
+void dohelp ();
+void search (register int);
+int arrow (register int, register int*, register int *);
+void outstr (char *);
+void outch (register char);
/* set up for calls to outstr and errmsg, etc, */
/* by use of sprintf to fill outbuf */
@@ -190,7 +199,7 @@
#ifdef MOD_HAX
#else /* use original code... */
/* plus some more for restoring terminal function */
- struct termio asis, aswas;
+ struct termios asis, aswas;
#endif /* MOD_HAX */
/*S main - control all the work from here */
@@ -202,6 +211,7 @@
*
*********************************************************************/
/*E*/
+int
main (argc, argv)
int argc;
char *argv[];
@@ -210,12 +220,10 @@
extern WINDOW *newwin ();
register char *cp; /* general purpose char ptr */
- extern char *gets (); /* get string from stdin */
char m = '\017'; /* mask for hex edit */
char response[512]; /* general purpose buffer */
int z; /* character read in */
- int breakp (); /* signal trapping function */
int c; /* current screen column */
int change = 0; /* true if cmd line option toggled */
int fid; /* file descriptor */
@@ -234,8 +242,7 @@
extern char *optarg; /* getopt pointer to opt arg */
extern long getnum ();
- extern char *instr (); /* get a string from the cmd line */
- extern int reset (); /* exit function - reset terminal */
+ extern char *myinstr (); /* get a string from the cmd line */
/* ------------------------------------------------------------ */
/* set up signal handling */
@@ -333,19 +340,27 @@
alphawin = subwin (stdscr, 16, 16, 4, 57);
keypad (alphawin, TRUE);
errwin = subwin (stdscr, 1, 80, 23, 0);
+ if (errwin == NULL)
+ errwin = stdscr;
+ if (hexwin == NULL || alphawin == NULL)
+ {
+ fprintf(stderr, "Can't create all necessary curses windows.\n");
+ reset (0);
+ exit (2);
+ }
#ifdef MOD_HAX
/* This is not exactly what the original code does,
but it's good enough. -r$ */
raw();
#else /* use original code... */
- ioctl (0, TCGETA, &asis);
+ tcgetattr (0, &asis);
aswas = asis; /* save termio stuff for later restore */
asis.c_cc[VINTR] = '\0';
asis.c_iflag &= ~IXON;
asis.c_iflag &= ~IXOFF;
asis.c_iflag &= ~IXANY;
- ioctl (0, TCSETA, &asis);
+ tcsetattr (0, TCSANOW, &asis);
#endif /* MOD_HAX */
}
@@ -398,7 +413,7 @@
{
position = lseek (fid, ((long )recno) * 256, 0);
- if ((bytes = bread (fid, record, 256, block)) < 0)
+ if ((bytes = bread (fid, (char *)record, 256, block)) < 0)
{
sprintf(outbuf, "error on reading file %s", filename);
errmsg (outbuf, SLEEP_TIME);
@@ -478,7 +493,9 @@
}
pbrk = 0;
fprintf (stderr, "\007");
- gets (response);
+ fgets (response, 512, stdin);
+ if ((cp = strchr (response, '\n')))
+ *cp = 0;
if (pbrk) status = EOF;
}
@@ -617,7 +634,7 @@
case '\006': /* new file (^F) */
close (fid);
- fid = ckfile (cp = instr (), &size);
+ fid = ckfile (cp = myinstr (), &size);
if (fid < 0)
{
fid = ckfile (filename, &size);
@@ -832,7 +849,8 @@
touchwin (alphawin);
wrefresh (alphawin);
- while ((z = wgetch (alphawin)) != DEL)
+ while ((z = wgetch (alphawin)) != KEY_DC &&
+ z != KEY_BACKSPACE)
{
if (!arrow (z, &r, &c))
{
@@ -902,7 +920,8 @@
touchwin (hexwin);
wrefresh (hexwin);
- while ((z = wgetch (hexwin)) != DEL)
+ while ((z = wgetch (hexwin)) != KEY_DC
+ && z != KEY_BACKSPACE)
{
if (!arrow (z, &r, &c))
{
@@ -1083,21 +1102,9 @@
/*E*/
/*checked typing of parameters as declared in fucntion */
/* versus declarations at call */
-show (bytes, record, filename, size, recno, position,
- m,reclen, dump, ebcdic, swab_opt, block, honly)
-int bytes;
-char record[16][16];
-char *filename;
-long size;
-int recno;
-long position;
-char m;
-int reclen;
-int dump;
-int ebcdic;
-int swab_opt;
-int block;
-int honly;
+void
+show (int bytes, char record[16][16], char *filename, long size, int recno, long position,
+ char m, int reclen, int dump, int ebcdic, int swab_opt, int block, int honly)
{
int i;
int j;
@@ -1281,7 +1288,7 @@
/*S breakp - set pbrk on interrupt */
/*H breakp */
/*E*/
-int breakp (i)
+void breakp (i)
int i;
{
int s;
@@ -1448,6 +1455,7 @@
/*S ckfile - check on existence, accessibility, and type of file */
/*H ckfile */
/*E*/
+int
ckfile (filename, sizep)
char *filename;
long *sizep;
@@ -1515,6 +1523,7 @@
/*S dohelp - display help text */
/*H dohelp */
/*E*/
+void
dohelp ()
{
static char *helptxt[] = {
@@ -1592,6 +1601,7 @@
/*S reset - reset terminal to original state */
/*H reset */
/*E*/
+void
reset (sig)
int sig;
{
@@ -1600,7 +1610,7 @@
move (23, 0);
refresh ();
#ifndef MOD_HAX
- ioctl (0, TCSETA, &aswas);
+ tcsetattr (0, TCSANOW, &aswas);
#endif
endwin ();
}
@@ -1610,17 +1620,17 @@
fprintf (stderr, "killed with signal %d\n", sig);
exit (sig);
}
- return (0);
}
/*S arrow - determine if current character is a cursor control key */
/*H arrow */
/*E*/
+int
arrow (k, r, c)
register int k;
register int *r;
register int *c;
{
- register ret = 1;
+ register int ret = 1;
/* watch out for conflict of VI_* amd KEY_* definitions */
if (k == KEY_UP || k == VI_UP)
@@ -1673,6 +1683,7 @@
/*S dbg_msg - print a debug message */
/*H dbg_msg */
/*E*/
+void
dbg_msg (msg)
register char *msg;
{
@@ -1683,11 +1694,11 @@
return;
}
-/*S instr - get a character string from the terminal */
-/*H instr */
+/*S myinstr - get a character string from the terminal */
+/*H myinstr */
/*E*/
char *
-instr ()
+myinstr ()
{
static char buf[512];
@@ -1815,6 +1826,7 @@
/*S search - look for an ascii string in the file */
/*H search */
/*E*/
+void
search (fid)
register int fid;
{
@@ -1827,13 +1839,13 @@
register int matched = 0;
register int srch_len;
- register char *cp = instr ();
+ register char *cp = myinstr ();
register char *rp;
int row, col;
srch_len = strlen (cp);
- copyrec (record, lrecord, sizeof record);
+ copyrec ((char *)record, lrecord, sizeof record);
lrecord[256] = '\0';
pbrk = 0;
@@ -1875,7 +1887,7 @@
{
recno = currec;
stay = 0;
- copyrec (record, unch_rec, sizeof record);
+ copyrec ((char *)record, (char *)unch_rec, sizeof record);
werase (errwin);
touchwin (errwin);
wrefresh (errwin);
@@ -1891,6 +1903,7 @@
}
/* simplified call to errmsg(), by using sprintf to load format */
/* sleep_time is not implemented and awaits cleaning up of the signals (?) */
+void
errmsg (fmt, sleep_time)
unsigned sleep_time;
char *fmt;
@@ -1911,7 +1924,7 @@
}
else
{
- fprintf (stderr, fmt);
+ fprintf (stderr, "%s", fmt);
fprintf (stderr, "\n");
}
/* signal problem ?? if sleep called
@@ -1921,16 +1934,17 @@
return;
}
/* simplified call to outstr(), by using sprintf to load format */
+void
outstr (fmt)
char *fmt;
{
- if (dump) printf (fmt);
- else printw (fmt);
+ if (dump) printf ("%s", fmt);
+ else printw ("%s", fmt);
return;
}
-outch (ch)
-register char ch;
+void
+outch (register char ch)
{
if (dump) putchar (ch);
else addch (ch);

14
editors/bpatch/pkg-descr Normal file
View file

@ -0,0 +1,14 @@
Original code written by Garry M. Johnson and Steven Lisk.
This is a neat program that contains some neat code. It allows you
to dump or edit files (binary or ascii), displayed by 256-byte records
in side-by-side hex and ascii formats. Other features (eg. toggled
swap within byte pairs) are included.
The most interesting feature of this editor is that it doesn't load the
entire file at once, unlike all other hex editors. Thus, you can browse
and edit very large files or even raw disks.
The program does not include a redistribution notice, but it was posted
to comp.sources.unix ages ago, and the README mentions the word "public
domain".