/* * Copyright 1995-1998 by Devin Reade . For distribution * information see the README file that is part of the manpack archive, * or contact the author, above. * * $Id: process.c,v 1.4 1998/03/29 07:16:17 gdr-ftp Exp $ */ #ifdef __ORCAC__ segment "makewhatis"; #pragma noroot #endif #include #include #include #include #include #include #include #include #include "man.h" /* These are the compression types */ #define NO_COMPRESS 0 #define Z_COMPRESS 1 #define F_COMPRESS 2 #define G_COMPRESS 3 #ifdef TEST_PROCESS short v_flag = 1; FILE *output_fp; FILE *error_fp; #else extern FILE *output_fp; extern FILE *error_fp; #endif extern GSString255Ptr __C2GSMALLOC (char *s); extern char buffer[]; extern char titlebuf[]; /* * void process (char *filename, char *tmp_file, FILE *whatis_fp); * * Pre: is the name of the file to add to the database. * is the name for the temporary file. It has not been opened. * is a file pointer to the open whatis database file. * (sec> is the section "number". We really only care if it is * either "l" or "local" (because of aroff "links"), otherwise * it is ignored. * * Post: The name, section number, and description from the man page is * appended to . */ void process (char *filename, char *tmp_file, FILE *whatis_fp, char *sec) { FileInfoRecGS info_record; /* used to get the file type */ char *suffix; /* points to the start of the file suffix */ static char command_buf[255]; /* used to call system(2) */ char *p1; /* a scratch pointer */ int namelength; /* length of 'name (section)' */ char *name; /* points to the file basename */ short compression; /* the compression type (if nec) */ if (v_flag>=2) { fprintf(output_fp,"Working on sec %s file %s ...\n", sec, filename); } /* * get the file basename */ if ((name = malloc (strlen(filename)+1)) == NULL) { if (v_flag) fprintf(error_fp,"malloc failed when processing %s -- file skipped\n", filename); return; } strcpy(name,filename); /* * check for a compression suffix like ".Z" or ".F" */ p1 = name + strlen(name) -1; /* p1 points to last char of name */ while ((p1>=name) && (*p1!='.')) p1--; if (p1<=name) { /* <= because we don't want a name beginning with '.' */ if (v_flag) fprintf(error_fp,"%s has no suffix -- file skipped\n", filename); return; } if (strcmp(p1,".Z")==0) { compression = Z_COMPRESS; } else if (strcmp(p1,".F")==0) { compression = F_COMPRESS; } else if (strcmp(p1,".gz")==0) { compression = G_COMPRESS; } else compression = NO_COMPRESS; *p1 = '\0'; /* * define the suffix */ if (compression == NO_COMPRESS) { suffix = p1 + 1; } else { while ((p1>=name) && (*p1!='.')) --p1; if (p1<=name) { /* <= because we don't want a name beginning with '.' */ if (v_flag) fprintf(error_fp,"%s has deformed file name -- file skipped\n", filename); return; } *p1 = '\0'; suffix = p1 + 1; } /* * find out the file type */ if (compression == NO_COMPRESS) { info_record.pCount = 5; info_record.pathname = __C2GSMALLOC(filename); GetFileInfoGS(&info_record); if (toolerror()) { if (v_flag) fprintf(error_fp, "malloc failed when processing %s -- file skipped\n", filename); return; } } /* * Process the file according to type: nroff, aroff, freeze, and compress. * The digested result is placed in buffer. */ if ((compression == NO_COMPRESS) && (info_record.fileType == 0x50u) && (info_record.auxType == 0x8010u) ) { /* is it an Appleworks GS word processor document? Use aroff */ sprintf(command_buf,"aroff -b %s > %s",filename,tmp_file); if (v_flag>=3) fprintf(stderr,"%s\n",command_buf); system(command_buf); fillbuffer(tmp_file); } else if (compression == Z_COMPRESS) { /* Compressed man page; uncompress it */ sprintf(command_buf,"compress -cd %s > %s",filename,tmp_file); if (v_flag>=3) fprintf(stderr,"%s\n",command_buf); system(command_buf); fillbuffer(tmp_file); } else if (compression == F_COMPRESS) { /* Frozen man page; melt it */ sprintf(command_buf,"freeze -cd %s > %s",filename,tmp_file); if (v_flag>=3) fprintf(stderr,"%s\n",command_buf); system(command_buf); fillbuffer(tmp_file); } else if (compression == G_COMPRESS) { /* gzipped man page; zcat it */ sprintf(command_buf,"gzip -cd %s > %s",filename,tmp_file); if (v_flag>=3) fprintf(stderr,"%s\n",command_buf); system(command_buf); fillbuffer(tmp_file); } else if ((*suffix=='l') && (*(suffix+1)=='\0') && strcmp("l",sec) && strcmp("local",sec)) { /* It's a link to another man page; do nothing. */ return; } else { /* Assume that it's a text file */ if (v_flag>=3) fprintf(stderr,"assuming text file\n"); fillbuffer(filename); } /* * If there was an error, or it is an .so reference to another man * page, then return without writing anything to the database */ if ((buffer[0] == '\0') || (titlebuf[0] == '\0')) { return; } /* * At this point, buffer contains the line that we need to print to * whatis_fd. Strip off any leading spaces, then give it a nice * formatting. */ p1 = buffer; while (isspace(*p1)) p1++; namelength = strlen(titlebuf) + strlen(suffix) + 4; if (namelength > (TABLENGTH * 3)) { fprintf(whatis_fp,"%s (%s) - %s\n", titlebuf, suffix, p1); } else if (namelength > (TABLENGTH * 2)) { fprintf(whatis_fp,"%s (%s)\t- %s\n", titlebuf, suffix, p1); } else if (namelength > TABLENGTH ) { fprintf(whatis_fp,"%s (%s)\t\t- %s\n", titlebuf, suffix, p1); } else { fprintf(whatis_fp,"%s (%s)\t\t\t- %s\n", titlebuf, suffix, p1); } return; } #ifdef TEST_PROCESS int main (int argc, char **argv) { output_fp = stdout; error_fp = stderr; if (argc != 2) { fprintf(stderr,"Usage: %s \n",argv[0]); return -1; } process (argv[1], ":tmp:garbage", stdout, "2"); return 0; } #endif