This is fmbib.c in view mode; [Download] [Up]
/* fmbib.c
* cm, 17 Dec 90
*
* main module to filter FrameMaker Mif file[s] w/ possible
* 'Bibliography' markers, and create a new FrameMaker bibliography doc.
*
* cm, 16 apr 91: add bibliography database verification functionality,
* when this program is called as 'fmbibverify'.
* 28 May 92, neek: add bibdirs[] for @include relative filename support.
*/
/*
* Copyright (c) 1991 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
/* see mif.h */
#define MAIN
#include <stdio.h>
#include <errno.h>
#include <mif.h>
#include <version.h>
extern char *rindex();
char *bibfiles[MAX_BIBFILES]; /* pathnames of bib files - BibFiles var. */
char *bibdirs[MAX_BIBFILES]; /* dirnames bib files - BibFiles var. */
char *bibstyle; /* Bibliograpy format specified by BibStyle or -s option */
main(ac, av)
char **av;
{
char **cp;
char *bibfile = NULL;
char *mifbibpath;
char tmpfile[256];
register char *ap;
char *mifpath();
char *define_bibfile();
char default_bib=1;
int n=0;
if(( prog = rindex(av[0], '/')) == NULL )
prog = av[0];
else
prog++;
if( strcmp( prog, "fmbibverify" ) == 0)
verify++;
bib_markertype = MIF_BIBMARKERTYPE;
fmbibdir = FMCONTRIBDIR;
if( !verify )
err( WARN, "Version %d.%d\n", FMB_VER, FMB_REV );
else
err( WARN, "Version %d.%d\n",
FMBVERIFY_VER, FMBVERIFY_REV );
for( cp=av+1; *cp; )
{
if( **cp != '-' )
{
cp++;
continue;
}
ap = (*cp) + 1;
switch( *ap )
{
case 'd':
debug++;
verbose++;
meltargs(&ac, cp);
break;
case 'a': /* custom sort keys to be specified as
* comma-separated list.
*/
if( *(ap+1) )
custom_sort = ap+1;
else
{
meltargs(&ac, cp);
if( !*cp )
err( FATAL, "-a arg needs value\n" );
custom_sort = *cp;
}
meltargs(&ac, cp);
break;
case 'c':
/* adjacent citations should be comma
* separated.
*/
if( verify )
{
err(WARN, "-c, Unknown switch" );
usage();
}
contiguous_cites++;
meltargs(&ac, cp);
break;
case 'h':
usage(); /*help*/
break;
case 'v':
verbose++;
meltargs(&ac, cp);
break;
case 'm': /* user-specified bib_markertype value */
if( verify )
{
err(WARN, "-m, Unknown switch" );
usage();
}
if( *(ap+1) )
bib_markertype = atoi(*(ap+1));
else
{
meltargs(&ac, cp);
if( !*cp )
err( FATAL, "-m arg needs value\n" );
bib_markertype = atoi(*cp);
}
meltargs(&ac, cp);
break;
case 's': /* bib format name - overides BibStyle var. */
if( *(ap+1) )
bibstyle = ap+1;
else
{
meltargs(&ac, cp);
if( !*cp )
err( FATAL, "-f arg needs value\n" );
bibstyle = *cp;
}
meltargs(&ac, cp);
break;
case 'o': /* output generated bibliography filename */
if( *(ap+1) )
bibfile = ap+1;
else
{
meltargs(&ac, cp);
if( !*cp )
err( FATAL, "-o arg needs value\n" );
bibfile = *cp;
}
meltargs(&ac, cp);
default_bib = 0;
break;
case 'r': /* supply alt. data directory. */
if( *(ap+1) )
fmbibdir = ap+1;
else
{
meltargs(&ac, cp);
if( !*cp )
err( FATAL, "-r arg needs value\n" );
fmbibdir = *cp;
}
meltargs(&ac, cp);
break;
case 'q': /* fmbibverify only - query general style info */
if( verify )
{
query++;
meltargs(&ac, cp);
break;
}
/* fall through if 'fmbib' */
default:
err( WARN,"Unkown switch \"%s\"\n", ap );
usage();
}
}
if( ac < 2 )
if( !query )
usage();
av++;
/* open output bibliOgraphy file
* put it in the same directory as the first
* mif file specified.
*/
if( !verify || bibfile )
{
if( !bibfile )
bibfile = define_bibfile( *av, FMDEFAULTBIBLIOGRAPHY );
mif_open_output( O_BIB, bibfile );
}
/* initialize some data structs. */
bib_init();
mifbibpath = mifpath( default_bib ? FMDEFAULTBIBLIOGRAPHY : bibfile );
if( verify )
init_bibstyle( bibstyle );
while( *av )
{
if( !verify )
{
/* open document file which will be the
* contents of the current mif doc +
* bibliography cross-references inserted
*/
sprintf( tmpfile, "%s.NEW", *av);
mif_open_output( O_TMP, tmpfile );
if( verbose )
err(WARN, "Processing %s\n", *av );
if( ! mif_open( F_MIF, *av ))
exit(1);
mif_parse(mifbibpath);
mif_close(F_MIF);
mif_close_output( O_TMP );
if( verbose )
err( WARN, "Re-writing %s\n", *av );
move_file(*av, tmpfile );
}
else /* input files should be bib database files */
{
bibfiles[n] = *av;
n++;
}
av++;
}
/* the bibfiles[] array should contain at least one bibliography
* database file to use.
*/
if( !bibfiles[0] && !query)
err( FATAL, "No <BibFiles> Variables found in any documents\n" );
if(!ref_parse())
exit(1);
if( query )
{
print_style_info();
exit(0);
}
/* open/read/parse bibliography database file[s],
* and read in only those entries which the user has
* cited in their Frame doc.
*/
if( !query )
if(!bib_parse())
exit(1);
if( verify && !bibfile )
exit(0);
/* close output files */
mif_close_output( O_BIB );
/* generate the bibliography document. */
fmbibgen();
/* consistency check betw. bib markers found, and
* associated bibliography data.
*/
chk_bibs();
if( default_bib || verbose )
err( WARN, "Generated %s\n", bibfile );
exit(0);
}
meltargs( ac, av )
int *ac;
char **av;
{
register char **pp;
for( pp=av; *pp; pp++ )
*pp = *(pp+1);
*pp=0;
(*ac)--;
}
static char *
define_bibfile( mif_file, default_name)
char *mif_file;
char *default_name;
{
register char *cp;
static char buf[256];
strcpy( buf, mif_file );
if(( cp = rindex(buf, '/' )) == 0)
{
strcpy( buf, "./");
strcat( buf, default_name );
}
else
{
cp++;
strcpy( cp, default_name );
}
return( buf );
}
/* build a mif-style device independant absolute pathname
* to the xref bibliography doc. If this is not absolute,
* then update xref from within framemaker will only look
* in the same directory which the document itself lives in.
*/
static char *
mifpath( unixpath )
char *unixpath;
{
register char *sp;
register char *dp;
static char buf[256];
if( !unixpath )
return( NULL );
dp = buf;
if( *unixpath == '/' )
{
sp=unixpath;
strcpy( buf, "<r\\>" );
}
else
{
strcpy( buf, "<c\\>" );
/* don't write relative directories, or
* Update Cross-references will get confused.
* the bib doc will be put into the relative
* directory, however this specification should
* be just the filename.
*/
if((sp = rindex( unixpath, '/' )) == NULL )
sp = unixpath;
else
sp++;
}
dp += 4;
for( ; *sp; sp++ )
{
if( *sp == '/' )
{
strcpy(dp, "<c\\>");
dp += 4;
}
else
*dp++ = *sp;
}
return( buf );
}
print_style_info()
{
print_valid_pubtypes();
print_valid_fields();
print_valid_styles();
print_refent_defs();
}
static char errbuf[1024];
err( severity, fmt, a, b, c, d, e, f)
int severity;
char *fmt;
int a, b, c, d, e, f;
{
static char progbuf[40];
if( !progbuf[0] )
sprintf( progbuf, "%s: ", prog);
write(2, progbuf, strlen( progbuf ));
sprintf( errbuf, fmt, a, b, c, d, e, f );
write( 2, errbuf, strlen(errbuf));
if( severity == FATAL )
exit( 1 );
}
usage()
{
register char **cpp;
static char *options[] = {
"options:\n",
"\t-h print this help screen.\n",
"\t-v print verbose messages while executing.\n",
"\t-c contiguous citations should be comma separated\n",
"\t ie, [1,2,3]. Default would be [1][2][3].\n",
"\t-b runs the cover script in 'batch' mode.\n",
"\t This assumes input docs are in Binary Format\n",
"\t Batch mode is OFF by default.\n",
"\t-o <bibliography file> generated bibliography file name.\n",
"\t Default is ",
FMDEFAULTBIBLIOGRAPHY,
"\n",
"\t-s <bibliography style> ie, cacm, apa, stdnum, stdident, stdalpha\n",
"\t This overrides the BibStyle Frame variable if set.\n",
"\t Default is stdnum.\n",
"\t-m <bibmarker number> re-define which Marker is the Bibliography Marker\n",
"\t Default is 10.\n",
"\t-r <template directory> where templates(.tmpl)/style(.style) files are.\n",
"\t Default is ",
FMCONTRIBDIR,
"\n",
"\t-a <list-sort-fields> use this switch to customize how\n",
"\t your bibliography document is sorted.\n",
"\t You may specify up to 10 valid sort fields\n",
"\t in a comma-separated list.\n",
"\t Default order is:\n",
"\t key,author,fullauthor,title,journal,\n",
"\t publisher,editor,editors,institution,\n",
"\t organization.\n",
0,
};
static char *voptions[] = {
"options:\n",
"\t-h print this help screen.\n",
"\t-s <bibliography style> ie, cacm, ieee, apa, stdnum, stdident, stdalpha\n",
"\t Default is stdnum.\n",
"\t-r <template directory> where templates(.tmpl)/style(.style) files are.\n",
"\t Default is ",
FMCONTRIBDIR,
"\n",
"\t-o <bibliography file> generated bibliography file name. If not\n",
"\t specified, no bib. will be generated.\n",
"\t-q query for general syntax and format info\n",
"\t for bib files, as well as mandatory and\n",
"\t optional fields for the current style.\n",
"\t-a <list-sort-fields> use this switch to customize how\n",
"\t your bibliography document is sorted.\n",
"\t You may specify up to 10 valid sort fields\n",
"\t in a comma-separated list.\n",
"\t Default order is:\n",
"\t key,author,fullauthor,title,journal,\n",
"\t publisher,editor,editors,institution,\n",
"\t organization.\n",
0,
};
if( verify )
fprintf( stderr, "Usage: %s [options] bib_dbase_file[s]\n",
prog );
else
fprintf( stderr,"Usage: %s [options] mif-file[s]\n",
prog );
for( cpp=verify?voptions:options; *cpp; cpp++ )
fprintf( stderr, *cpp );
exit(1);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.