ftp.nice.ch/pub/next/unix/developer/docgen.0.3.2.s.tar.gz#/docgen-0.3.2/docgen.c

This is docgen.c in view mode; [Download] [Up]

/*
   docgen  Objective C Document Generator
   Copyright (C) 1995  Bill Bereza.
   
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   
   Email:
   berezaw@river.it.gvsu.edu
   
   S-mail:
   Bill Bereza
   9526 Judson Rd.
   Ravenna, MI 49451-9427
   
   */
/* docgen	Objective C Document Generator
 * Copyright (c) 1994 Bill Bereza
 *
 *	$Log:	docgen.c,v $
 * Revision 1.28  96/01/07  01:28:05  berezaw
 * debugging output for fgetpos status
 * 
 * Revision 1.27  95/07/26  22:52:19  berezaw
 * *** empty log message ***
 * 
 * Revision 1.26  95/07/26  21:46:14  berezaw
 * *** empty log message ***
 * 
 * Revision 1.25  95/07/26  17:50:16  berezaw
 * *** empty log message ***
 * 
 * Revision 1.24  95/07/26  16:17:23  berezaw
 * 0.3.1
 * 
 * Revision 1.23  95/07/23  19:24:59  berezaw
 * add kludges
 * 
 * Revision 1.22  95/07/23  16:31:53  berezaw
 * *** empty log message ***
 * 
 * Revision 1.21  95/07/23  15:49:13  berezaw
 * using objc_loadModules
 * 
 * Revision 1.20  95/07/23  14:38:14  berezaw
 * *** empty log message ***
 * 
 * Revision 1.19  95/07/23  14:33:19  berezaw
 * added NXBundle stuff
 * 
 * Revision 1.18  95/07/23  02:31:05  berezaw
 * adding dynamic module loading for Formatting Classes
 * 
 * Revision 1.17  95/07/23  01:20:48  berezaw
 * in the last few version I've been trying to get objc_lookUpClass to
 * work with the NeXT runtime and the GNU runtime.
 * 
 * There still may be problems, esp. with the fact that
 * the Class type is different on NeXT and GNU
 * and that the class lookup seems to work a little
 * differently on the two runtimes.
 * 
 * This version of docgen.c or the very next should work perfectly.
 * 
 * Now I need to add the dynamic loading for both runtimes.
 * 
 * Revision 1.10  95/07/21  01:58:23  berezaw
 * added ObjC stuff
 * 
 * Revision 1.9  95/03/02  03:44:39  berezaw
 * using GNU regex library
 * rewrote recmp() as docgen_recmp()
 * added GPL stuff to each file
 * increase rev. to 0.1.9
 * 
 * Revision 1.8  95/02/01  18:49:47  berezaw
 * 
 * 0.1.6
 * 
 * Revision 1.7  95/01/31  18:28:33  berezaw
 * 
 * added 0.1.5 stuff
 * 
 * Revision 1.6  95/01/30  13:32:07  berezaw
 * added -F
 * 
 * Revision 1.5  95/01/29  01:50:18  berezaw
 * changes started for 0.1.4
 * 
 * Revision 1.4  95/01/27  00:31:19  berezaw
 * added '-x' option to hide methods beginning with '_'
 * 
 * Revision 1.3  95/01/26  05:34:29  berezaw
 * added global variables GLOB_decdir and GLOB_sort
 * 
 *
 *	$Id: docgen.c,v 1.28 96/01/07 01:28:05 berezaw Exp $
 */

#include "docgen.h"

#ifdef OBJC
#ifdef HAVE_OBJC_OBJC_RUNTIME_H
#ifdef HAVE_OBJC_OBJC_LOAD_H

#define NXMODULES
#define DYNAMIC_LOADING
#import <objc/objc-load.h>
#define BUNEXT "o"
#endif /* HAVE_OBJC_OBC_LOAD_H */

#include <objc/objc-runtime.h>

#else
#ifdef HAVE_OBJC_OBJC_API_H

#include <objc/objc-api.h>
#define objc_lookUpClass(name) objc_lookup_class(name)

#endif /* HAVE_OBJC_OBJC_API_H */
#endif /* HAVE_OBJC_OBJC_RUNTIME_H */
#endif /* OBJC */

#define USING "%-15s:  %s\n%-15s:  %s\n%-15s:  %s\n%-15s:  %d\n%-15s:  %s\n%-15s:  %d\n",\
"checkdir",checkdir, "outlib",outlib, "hdir",hdir, "verbo",verbo, "GLOB_sep",GLOB_sep,\
"GLOB_recurs",GLOB_recurs

int verbo=DEFVERBO;
bool GLOB_recurs=DEFRECURS, GLOB_defaults=no;
char *GLOB_sep=NULL;
char *GLOB_decdir=NULL;
bool GLOB_sort=no;
bool GLOB_undoc=no;
DSTRING *GLOB_istring=NULL;
bool GLOB_fancy=yes;
bool GLOB_firstcomm=no;
bool GLOB_autodoc=no;

bool GLOB_before=no;
bool GLOB_after=no;

#ifdef OBJC
id myForm;
#endif

#define cat(x,y) x ## y
#define xcat(x,y) cat(x,y)

int main(int argc, char *argv[])
{
	id kludge1, kludge2, kludge3;
	char *checkdir, *outlib, *hdir, *formatName, *userBundir;
	char defdir[]=DEFSTARTDIR, deflib[]=DEFODIR, defhdirs[]=DEFISEARCH;
	char defsep[]=DEFSEP;
	char defform[]=DEFFORMAT;
	DSTRING *dhdir=NULL;
	char *bunPath[]=DEFBUNDLES;

	#ifdef MALLOC_DEBUG
	malloc_debug(8);
	#endif
	
	kludge1=[[RTFFormatter alloc] init];
	kludge2=[[HTMLFormatter alloc] init];
	kludge3=[[TXTFormatter alloc] init];
   
	/* The two if statements before getdocopts() will depend on DEFVERBO */
#ifndef NODEBUG
	if(V_USELESS)
	  fprintf(stderr,"main(%d, char *argv[])\n", argc);
	
	if(V_USELESS)
	  fprintf(stderr,"about to getopt\n");
#endif		
	if(getdocopts(argc, argv, &checkdir, &outlib, &hdir, &formatName, &userBundir)) { 
		fprintf(stderr, USAGE);
		exit(2);
	}
#ifndef NODEBUG
	if(V_USELESS)
	  fprintf(stderr,"gotopt\n");
#endif
	
	if(GLOB_defaults) {			/* print out some useful values and exit */
		fprintf(stderr,"\t#define DOCGEN_VERSION	\"%s\"\n\n",DOCGEN_VERSION);
		fprintf(stderr,"docgen.o compiled on: %s %s\n",__TIME__, __DATE__);
#ifdef HAVE_CONFIG_H
		fprintf(stderr,"Compiled with a config.h file.\n");
#endif
#ifdef STDC_HEADERS
		fprintf(stderr,"Compiled using the standard C headers.\n");
#endif
#ifdef HAVE_STRSTR
		fprintf(stderr,"Using standard strstr() function.\n");
#else
		fprintf(stderr,"Using a custom strstr() function.\n");
#endif
#ifdef HAVE_GETOPT
		fprintf(stderr,"Using standard getopt() function.\n");
#else
		fprintf(stderr,"Using a custom getopt() function.\n");
#endif
#ifdef HAVE_FGETPOS
		fprintf(stderr,"Using standard fgetpos() function.\n");
#else
		fprintf(stderr,"Using a custom fgetpos() function.\n");
#endif
#if HAVE_DIRENT_H
		fprintf(stderr,"Using <dirent.h>.\nNAMLEN is #define'd as 'NAMELEN(dirent) strlen((dirent)->d_name)\n");
#else
		fprintf(stderr,"<dirent.h> was not available.\ndirent is #define'd as direct.\nNAMLEN is #define'd as NAMELEN(dirent) (dirent)->d_namelen.\n");
# if HAVE_SYS_NDIR_H
		fprintf(stderr,"Using <sys/ndir.h>\n");
# endif
# if HAVE_SYS_DIR_H
		fprintf(stderr,"Using <sys/dir.h>\n");
# endif
# if HAVE_NDIR_H
		fprintf(stderr,"Using <ndir.h>\n");
# endif
#endif

#ifdef HAVE_BSD_LIBC_H
		fprintf(stderr,"Compiled with <bsd/libc.h> available.\n");
#endif
#ifdef HAVE_UNISTD_H
		fprintf(stderr,"Compiled with <unistd.h> available.\n");
#endif
#ifdef HAVE_OBJC_OBJECT_H
		fprintf(stderr,"<objc/Object.h> was available.\nWe assume this means that Objective C was used.\nMultiple document output formats are available.\n");
#endif
#ifdef HAVE_OBJC_OBJC_RUNTIME_H
		fprintf(stderr,"<objc/objc-runtime.h> was available for objc_lookUpClass().\n");
#else
#ifdef HAVE_OBJC_OBJC_API_H
		fprintf(stderr,"No <objc/objc-runtime.h> available. \nWe're using <objc/objc-api.h> from GNU ObjC.\nobjc_lookUpClass() is #define'd as objc_lookup_class().\n"); 
#endif
#endif /* HAVE_OBJC_OBJC_RUNTIME_H */
#ifdef HAVE_OBJC_OBJC_LOAD_H
		fprintf(stderr,"<objc/objc-load.h was available for objc_loadModules().\n");
#endif
#ifdef DYNAMIC_LOADING
		fprintf(stderr,"Dynamic loading of modules is available from ");
#ifdef NXMODULES
		fprintf(stderr,"NeXT runtime functions.\n");
#endif
#else
		fprintf(stderr,"Dynamic loading is NOT available.\n");
#endif /* DYNAMIC_LOADING */
#ifdef NODEBUG
		fprintf(stderr,"\t#define NODEBUG    \t/* Debugging output has been compiled out. */\n");
#else
		fprintf(stderr,"Debugging output is available.\n");
#endif
		fprintf(stderr,"[-d]\t#define DEFSTARTDIR	\"%s\"\n", DEFSTARTDIR);
		fprintf(stderr,"[-l]\t#define DEFODIR		\"%s\"\n", DEFODIR);
		fprintf(stderr,"[-I]\t#define DEFISEARCH	\"%s\"\n", DEFISEARCH);
		fprintf(stderr,"[-v]\t#define DEFVERBO	%d\n", DEFVERBO);
#if DEFRECURS==no
		fprintf(stderr,"[-R]\t#define DEFRECURS	no\n");
#else
		fprintf(stderr,"[-R]\t#define DEFRECURS	yes\n");
#endif
		fprintf(stderr,"[-s]\t#define DEFSEP		\"%s\"\n", DEFSEP);
		fprintf(stderr,"    \t#define DEFITAL         \"%s\"\n", DEFITAL);
		exit(0);
	}

	if(!formatName)
	  formatName=defform;
#ifdef OBJC
  {
	  char extra[strlen(formatName)+15];
	  id Format=[objc_lookUpClass(formatName) class];
	  
	  sprintf(extra,"%sFormatter", formatName);

	  /* Try adding 'Formatter' to the name */
	  if(!Format) {
		  Format=[objc_lookUpClass(extra) class];
	  }
	  
#ifdef NXMODULES
	  /* Try loading a bundle. */
	  if(!Format) {
		  char *bunDir;
		  char bPath[2048];
		  char *mods[]={bPath,NULL};
		  long loadRet=1;
		  int bunCount=0;

		  if(userBundir) {
			  bunDir=userBundir;
			  sprintf(bPath,"%s/%s.%s",bunDir, formatName, BUNEXT);
			  loadRet=objc_loadModules(mods,NULL,NULL,NULL,NULL);

			  if(loadRet) {
				  sprintf(bPath,"%s/%s.%s",bunDir,extra, BUNEXT);
				  loadRet=objc_loadModules(mods,NULL,NULL,NULL,NULL);
			  }
			  
			  if(loadRet) {
				  sprintf(bPath,"%s/%s",bunDir,formatName);
				  loadRet=objc_loadModules(mods,NULL,NULL,NULL,NULL);
			  }

			  if(loadRet) {
				  sprintf(bPath,"%s/%s",bunDir,extra);
				  loadRet=objc_loadModules(mods,NULL,NULL,NULL,NULL);
			  }

		  }

		  bunDir=bunPath[bunCount];
		  while(loadRet && bunDir) {
			  sprintf(bPath,"%s/%s.%s",bunDir, formatName, BUNEXT);
			  loadRet=objc_loadModules(mods,NULL,NULL,NULL,NULL);

			  if(loadRet) {
				  sprintf(bPath,"%s/%s.%s",bunDir,extra, BUNEXT);
				  loadRet=objc_loadModules(mods,NULL,NULL,NULL,NULL);
			  }
			  
			  if(loadRet) {
				  sprintf(bPath,"%s/%s",bunDir,formatName);
				  loadRet=objc_loadModules(mods,NULL,NULL,NULL,NULL);
			  }

			  if(loadRet) {
				  sprintf(bPath,"%s/%s",bunDir,extra);
				  loadRet=objc_loadModules(mods,NULL,NULL,NULL,NULL);
			  }

			  bunCount++;
			  bunDir=bunPath[bunCount];
		  }

		  Format=objc_lookUpClass(formatName);

		  if(!Format)
			Format=objc_lookUpClass(extra);

	  }
	  /* We don't care if Format is nil at this point.
		 It will be caught below.
		 */
#endif /* NXMODULES */
	  if([[Format class] conformsTo:@protocol(Formatting)])
		myForm=[[[Format class] alloc] init];
	  else {
		  if(V_BADERR)
			if(Format)
			  fprintf(stderr,"docgen:%s is not a conforming Formatting class\n",formatName);
			else
			  fprintf(stderr,"docgen:%s is not available as a Class\n",formatName);
		  exit(2);
	  }
  }
#endif /* OBJC */
	
	if(checkdir==NULL) 
	  checkdir=defdir;
	
	if(outlib==NULL)
	  outlib=deflib;
	
	if(GLOB_sep==NULL)
	  GLOB_sep=defsep;
	
	dhdir=dstrarr(checkdir);
	
	if(hdir==NULL) {
		hdir=defhdirs;
		dstrarrcat(dhdir,":");
		dstrarrcat(dhdir,hdir);
	}
	else {
		dstrarrcat(dhdir,":");
		dstrarrcat(dhdir,hdir);
		dstrarrcat(dhdir,":");
		dstrarrcat(dhdir,defhdirs);
	}
	
	hdir=arrdstr(dhdir);
	freedstr(dhdir);
	
	if(V_STAT)
	  fprintf(stderr, USING);
	
#ifndef NODEBUG
	if(V_USELESS)
	  fprintf(stderr, "about to walk the dirs\n");
#endif
	
	dirwalk(checkdir, procfile, outlib, hdir);
	
	free(hdir);

#ifdef OBJC
	[myForm free];
#endif
	
#ifndef NODEBUG	
	if(V_USELESS)
	  fprintf(stderr, "main: exiting\n\nHave a good day.\n");
#endif
	
	exit(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.