mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-12-21 07:30:05 +00:00
- put mkso into the normal build directories instead of it being a
special case - modified mkso to put files in an alternate (presumably HFS) directory, if necessary
This commit is contained in:
parent
1e28540ab0
commit
4cdec01660
15
sbin/mkso/Makefile
Normal file
15
sbin/mkso/Makefile
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#
|
||||||
|
# $Id: Makefile,v 1.1 1997/12/21 22:39:13 gdr Exp $
|
||||||
|
#
|
||||||
|
# Devin Reade, 1997
|
||||||
|
#
|
||||||
|
|
||||||
|
# Program name
|
||||||
|
PROG = mkso
|
||||||
|
|
||||||
|
# Add -D__STACK_CHECK__ to print, on exit, the amount of stack used
|
||||||
|
CFLAGS += # -D__STACK_CHECK__
|
||||||
|
STACK = 1024
|
||||||
|
BINDIR = /sbin
|
||||||
|
|
||||||
|
.INCLUDE: /src/gno/prog.mk
|
116
sbin/mkso/mkso.8
Normal file
116
sbin/mkso/mkso.8
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
.\" Devin Reade, 1997
|
||||||
|
.\"
|
||||||
|
.\" $Id: mkso.8,v 1.1 1997/12/21 22:39:13 gdr Exp $
|
||||||
|
.\"
|
||||||
|
.TH MKSO 8 "21 December 1997" GNO "System Administration"
|
||||||
|
.SH NAME
|
||||||
|
.BR mkso
|
||||||
|
\- maintain manual page source links
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.BR mkso
|
||||||
|
[
|
||||||
|
.BR -dhv
|
||||||
|
] [
|
||||||
|
.BI -H dir
|
||||||
|
]
|
||||||
|
.I datafile
|
||||||
|
.SH DESCRIPTION
|
||||||
|
Manual pages will often document more than one program, subroutine,
|
||||||
|
or topic. When this occurs, it is normal to create "links" for each
|
||||||
|
documented program or subroutine to the original manual page. For
|
||||||
|
example, the
|
||||||
|
.BR getcwd (3)
|
||||||
|
manual page also documents
|
||||||
|
.BR getwd (3).
|
||||||
|
Assuming both of these functions are described in the file
|
||||||
|
.BR man3/getcwd.3 ,
|
||||||
|
then the file
|
||||||
|
.BR man3/getwd.3
|
||||||
|
would consist of the single line
|
||||||
|
.nf
|
||||||
|
|
||||||
|
\.so man3/getcwd.3
|
||||||
|
|
||||||
|
.fi
|
||||||
|
This would result in the same manual page being shown for both functions,
|
||||||
|
without duplicating the manual page.
|
||||||
|
.LP
|
||||||
|
While these source link files may be maintained by hand, doing so is tedious
|
||||||
|
for large distributions, such as the GNO base distribution.
|
||||||
|
.LP
|
||||||
|
.BR mkso
|
||||||
|
was written for the GNO base distribution to automate the creation and
|
||||||
|
deletion of these source links. By default,
|
||||||
|
.BR mkso
|
||||||
|
will create the links relative to the current directory as specified in
|
||||||
|
.IR datafile .
|
||||||
|
.IR datafile
|
||||||
|
must have the following format:
|
||||||
|
.nf
|
||||||
|
|
||||||
|
# Any blank line or line that has a "#" in the first
|
||||||
|
# column is a comment and is ignored.
|
||||||
|
#
|
||||||
|
# Pathnames must be delimited by "/", not ":".
|
||||||
|
#
|
||||||
|
# There are two columns here, delimited by spaces or tabs.
|
||||||
|
# The first is the "real" manual page (no check is done
|
||||||
|
# to verify that it does in fact exist). The second column
|
||||||
|
# is the source link that will be created.
|
||||||
|
#
|
||||||
|
man2/alarm.2 man2/alarm10.2
|
||||||
|
man5/utmp.5 man5/wtmp.5
|
||||||
|
#
|
||||||
|
# This next one cannot be created on a ProDOS volume; see
|
||||||
|
# description of the -H flag.
|
||||||
|
#
|
||||||
|
man2/getpgrp.2 man2/_getpgrp.2
|
||||||
|
|
||||||
|
.fi
|
||||||
|
.LP
|
||||||
|
.BR mkso
|
||||||
|
does not create missing directories; the current directory should already
|
||||||
|
contain the subdirectories
|
||||||
|
.BR man1 ,
|
||||||
|
.BR man2 ,
|
||||||
|
.BR man3 ,
|
||||||
|
.BR man4 ,
|
||||||
|
.BR man5 ,
|
||||||
|
.BR man6 ,
|
||||||
|
.BR man7 ,
|
||||||
|
and
|
||||||
|
.BR man8 .
|
||||||
|
.SH OPTIONS
|
||||||
|
.IP "\fB-d\fR"
|
||||||
|
Delete source links rather than creating them. Source links will only
|
||||||
|
be deleted if they contain a "magic number" which is inserted during
|
||||||
|
link creation.
|
||||||
|
.IP "\fB-h\fR"
|
||||||
|
Print usage information and exit.
|
||||||
|
.IP "\fB-H\fR \fIdir\fR"
|
||||||
|
If the source link does not follow ProDOS filename conventions, then the
|
||||||
|
link will be created in the directory given by
|
||||||
|
.IR dir
|
||||||
|
rather than the current directory.
|
||||||
|
.IR dir
|
||||||
|
is presumably a directory on an HFS volume. The link itself will reference
|
||||||
|
the full- rather than partial-pathname of the original file, so that
|
||||||
|
.BR man (1)
|
||||||
|
will be able to locate the original page.
|
||||||
|
.sp 1
|
||||||
|
As with the default behavior,
|
||||||
|
.BR mkso
|
||||||
|
does not create subdirectories, so ensure that
|
||||||
|
.IR dir
|
||||||
|
already contains the same list of subdirectories as the current directory.
|
||||||
|
.IP "\fB-v\fR"
|
||||||
|
Verbose operation.
|
||||||
|
.SH VERSION
|
||||||
|
This manual page documents
|
||||||
|
.BR mkso
|
||||||
|
version 1.0.
|
||||||
|
.SH AUTHOR
|
||||||
|
Devin Reade, 1997.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR man (1),
|
||||||
|
.BR nroff (1)
|
141
sbin/mkso/mkso.c
141
sbin/mkso/mkso.c
@ -1,5 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: mkso.c,v 1.1 1997/01/21 15:34:02 gdr Exp $
|
* mkso is used for maintaining manual page ".so links" for the GNO
|
||||||
|
* base distribution. See the manual page for details.
|
||||||
|
*
|
||||||
|
* $Id: mkso.c,v 1.2 1997/12/21 22:39:13 gdr Exp $
|
||||||
*
|
*
|
||||||
* Devin Reade, 1997.
|
* Devin Reade, 1997.
|
||||||
*/
|
*/
|
||||||
@ -9,10 +12,17 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#ifdef __GNO__
|
||||||
|
#include <gno/gno.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define BUFFERSIZE 1024
|
#define BUFFERSIZE 1024
|
||||||
#define DELIM " \t"
|
#define DELIM " \t"
|
||||||
|
|
||||||
|
static int isProdosFileName(const char *name);
|
||||||
|
|
||||||
char *progname = NULL;
|
char *progname = NULL;
|
||||||
int deleteFiles = 0;
|
int deleteFiles = 0;
|
||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
@ -21,29 +31,93 @@ void
|
|||||||
usage (void) {
|
usage (void) {
|
||||||
printf("This program is part of the GNO installation package.\n");
|
printf("This program is part of the GNO installation package.\n");
|
||||||
printf("It creates .so (nroff source files) for the man package\n\n");
|
printf("It creates .so (nroff source files) for the man package\n\n");
|
||||||
printf("Usage: %s [-dhv] datafile\n", progname);
|
printf("Usage: %s [-dhv] [-H dir] datafile\n", progname);
|
||||||
|
printf("\t-H dir\tspecify alternate directory for non-ProDOS links\n");
|
||||||
printf("\t-h\tprint usage information\n");
|
printf("\t-h\tprint usage information\n");
|
||||||
printf("\t-d\tdelete instead of create files (safe)\n");
|
printf("\t-d\tdelete instead of create files (safe)\n");
|
||||||
printf("\t-v\tverbose operation\n");
|
printf("\t-v\tverbose operation\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __STACK_CHECK__
|
||||||
|
static void printstack(void) {
|
||||||
|
fprintf(stderr, "Stack Usage: %d bytes\n", _endStackCheck());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
static char dataBuffer[BUFFERSIZE];
|
static char dataBuffer[BUFFERSIZE];
|
||||||
static char magicBuffer[BUFFERSIZE];
|
static char magicBuffer[BUFFERSIZE];
|
||||||
|
static char hfsdir[PATH_MAX];
|
||||||
|
static char cwd[PATH_MAX];
|
||||||
|
static char *magic = ".\\\" This file is auto-generated by mkso.\n";
|
||||||
FILE *fp, *outfp;
|
FILE *fp, *outfp;
|
||||||
char *p, *file, *new, *org;
|
char *p, *file, *new, *org, *hfsptr;
|
||||||
int line = 0;
|
int line = 0;
|
||||||
|
int H_flag = 0;
|
||||||
int c;
|
int c;
|
||||||
char *magic = ".\\\" This file is auto-generated by mkso.\n";
|
int useHFSdir, hfsdirlen, sawColon, sawSlash;
|
||||||
|
|
||||||
|
#ifdef __STACK_CHECK__
|
||||||
|
_beginStackCheck();
|
||||||
|
atexit(printstack);
|
||||||
|
#endif
|
||||||
|
#ifdef __GNO__
|
||||||
|
_setPathMapping(1);
|
||||||
|
#endif
|
||||||
progname = argv[0];
|
progname = argv[0];
|
||||||
while ((c = getopt(argc, argv, "dhv")) != EOF) {
|
hfsdir[0] = '\0';
|
||||||
|
hfsptr = hfsdir;
|
||||||
|
while ((c = getopt(argc, argv, "dhvH:")) != EOF) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'd':
|
case 'd':
|
||||||
deleteFiles = 1;
|
deleteFiles = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
if (H_flag) {
|
||||||
|
fprintf(stderr, "-H flag can only be specified once. Second and "
|
||||||
|
"subsequent invocations ignored\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
H_flag++;
|
||||||
|
hfsdirlen = strlen(optarg);
|
||||||
|
if (hfsdirlen > PATH_MAX-2) {
|
||||||
|
fprintf(stderr, "pathname for -H flag too long\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
p = optarg;
|
||||||
|
sawColon = sawSlash = 0;
|
||||||
|
while (*p) {
|
||||||
|
switch (*p) {
|
||||||
|
case ':':
|
||||||
|
sawColon=1;
|
||||||
|
if (sawSlash) {
|
||||||
|
goto die; /* piss off; I know it's bad form */
|
||||||
|
}
|
||||||
|
*hfsptr++ = '/'; /* map to '/' */
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
sawSlash=1;
|
||||||
|
if (sawColon) {
|
||||||
|
die:
|
||||||
|
fprintf(stderr, "you cannot use pathnames that contain both '/' "
|
||||||
|
"and ':' in this program\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/*FALLTHROUGH*/
|
||||||
|
default:
|
||||||
|
*hfsptr++ = *p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*hfsptr++ = '/';
|
||||||
|
hfsdirlen++;
|
||||||
|
if (getcwd(cwd, PATH_MAX) == NULL) {
|
||||||
|
perror("couldn't determine current directory");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose = 1;
|
verbose = 1;
|
||||||
break;
|
break;
|
||||||
@ -79,6 +153,20 @@ int main(int argc, char **argv) {
|
|||||||
fprintf(stderr, "missing new file name at line %d of %s", line, file);
|
fprintf(stderr, "missing new file name at line %d of %s", line, file);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!H_flag || isProdosFileName(new)) {
|
||||||
|
useHFSdir = 0;
|
||||||
|
} else {
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = strlen(new);
|
||||||
|
if (len + hfsdirlen + 1 > PATH_MAX-1) {
|
||||||
|
fprintf(stderr, "pathname for %s too long\n", new);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
strcpy(hfsptr, new);
|
||||||
|
new = hfsdir;
|
||||||
|
useHFSdir = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (deleteFiles) {
|
if (deleteFiles) {
|
||||||
if ((outfp = fopen(new, "r")) == NULL) {
|
if ((outfp = fopen(new, "r")) == NULL) {
|
||||||
@ -117,7 +205,11 @@ int main(int argc, char **argv) {
|
|||||||
new, line, strerror(errno));
|
new, line, strerror(errno));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
fprintf(outfp, ".so %s\n", org);
|
if (useHFSdir) {
|
||||||
|
fprintf(outfp, ".so %s/%s\n", cwd, org);
|
||||||
|
} else {
|
||||||
|
fprintf(outfp, ".so %s\n", org);
|
||||||
|
}
|
||||||
fprintf(outfp, magic);
|
fprintf(outfp, magic);
|
||||||
fclose(outfp);
|
fclose(outfp);
|
||||||
}
|
}
|
||||||
@ -131,3 +223,38 @@ int main(int argc, char **argv) {
|
|||||||
fclose(fp);
|
fclose(fp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns 1 if <name> follows ProDOS conventions, zero otherwise.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
isProdosFileName (const char *name)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
int len, c;
|
||||||
|
|
||||||
|
p = basename(name);
|
||||||
|
|
||||||
|
/* special case the first character */
|
||||||
|
c = tolower(*p);
|
||||||
|
if (! ((c >= 'a') && (c <= 'z'))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
len = 1;
|
||||||
|
|
||||||
|
while(*p) {
|
||||||
|
len++;
|
||||||
|
if (len > 15) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
c = *p;
|
||||||
|
if (isalnum(c) || c == '.') {
|
||||||
|
p++;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
9
sbin/mkso/mkso.desc
Normal file
9
sbin/mkso/mkso.desc
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Name: mkso
|
||||||
|
Version: 1.0 (21 Dec 97)
|
||||||
|
Shell: GNO
|
||||||
|
Author: Devin Reade
|
||||||
|
Contact: gdr@eddore.myrias.com
|
||||||
|
Where: /sbin
|
||||||
|
FTP: trenco.myrias.com
|
||||||
|
|
||||||
|
Maintains manual page source (.so) links.
|
17
sbin/mkso/mkso.rez
Normal file
17
sbin/mkso/mkso.rez
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* $Id: mkso.rez,v 1.1 1997/12/21 22:39:13 gdr Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Types.Rez"
|
||||||
|
|
||||||
|
resource rVersion (0x1, purgeable3, nocrossbank) {
|
||||||
|
|
||||||
|
{ 1, 0, 0, /* version 1.0.0 */
|
||||||
|
release, /* development|alpha|beta|final|release */
|
||||||
|
0 /* non-final release number */
|
||||||
|
},
|
||||||
|
verUS,
|
||||||
|
"mkso",
|
||||||
|
"Maintain manual page source links.\n"
|
||||||
|
"Written by Devin Reade for GNO v2.0.6"
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user