#include #include #include #include #include #include #include #include #include #include typedef struct manl{ struct manl *next; char *filename; }man, *manPtr; typedef struct pf_fabnam{ struct FAB dfab; struct RAB drab; struct namldef dnam; char expanded_filename[NAM$C_MAXRSS + 1]; } pfn, *pfnPtr; /*----------------------------------------------------------*/ fpcopy( char *output, char *input, int len ) { char *is, *os; int i; if ( len ){ for ( is = input, os = output, i = 0; i < len ; ++i, ++is, ++os){ *os = *is; } *os = 0; }else{ output[0] = 0; } } /*----------------------------------------------------------*/ /* give part of ilename in partname. See code for proper value of i ( 0 = node, 1 = dev, 2 = dir,3 = name etc. */ int fnamepart( char *inputfile, char *part, int whatpart ) { pfnPtr pf; int status; char ipart[6][256], *i, *p; pf = calloc( 1, sizeof( pfn ) ); pf->dfab = cc$rms_fab; pf->drab = cc$rms_rab; pf->dnam = cc$rms_naml; pf->dfab.fab$l_naml = &pf->dnam; pf->dfab.fab$l_fna = (char *) -1; pf->dfab.fab$l_dna = (char *) -1; pf->dfab.fab$b_fns = 0; pf->dfab.fab$w_ifi = 0; pf->dnam.naml$l_long_defname = NULL; //inputfile; pf->dnam.naml$l_long_defname_size = 0;//strlen( inputfile ); pf->dnam.naml$l_long_filename = inputfile; pf->dnam.naml$l_long_filename_size = strlen( inputfile ); pf->dnam.naml$l_long_expand = pf->expanded_filename; pf->dnam.naml$l_long_expand_alloc = NAM$C_MAXRSS ; pf->dnam.naml$b_nop |= NAML$M_SYNCHK | NAML$M_PWD; status = sys$parse( &pf->dfab, 0, 0 ); if ( !(status&1) ){ free( pf ); return( status ); } fpcopy ( ipart[0], pf->dnam.naml$l_long_node , pf->dnam.naml$l_long_node_size); fpcopy ( ipart[1], pf->dnam.naml$l_long_dev , pf->dnam.naml$l_long_dev_size); fpcopy ( ipart[2], pf->dnam.naml$l_long_dir , pf->dnam.naml$l_long_dir_size); fpcopy ( ipart[3], pf->dnam.naml$l_long_name , pf->dnam.naml$l_long_name_size); fpcopy ( ipart[4], pf->dnam.naml$l_long_type , pf->dnam.naml$l_long_type_size); fpcopy ( ipart[5], pf->dnam.naml$l_long_ver , pf->dnam.naml$l_long_ver_size); for( i = ipart[ whatpart ], p = part; *i; ++i, ++p){ if ( p == part ){ *p = toupper( *i ); }else{ *p = tolower( *i ); } } *p = 0; free( pf ); return(1); } /*----------------------------------------------------------*/ int find_file(char *filename,char *gevonden,int *findex) { int status; struct dsc$descriptor gevondend; struct dsc$descriptor filespec; char gevonden_file[NAM$C_MAXRSS + 1]; filespec.dsc$w_length = strlen(filename); filespec.dsc$b_dtype = DSC$K_DTYPE_T; filespec.dsc$b_class = DSC$K_CLASS_S; filespec.dsc$a_pointer = filename; gevondend.dsc$w_length = NAM$C_MAXRSS; gevondend.dsc$b_dtype = DSC$K_DTYPE_T; gevondend.dsc$b_class = DSC$K_CLASS_S; gevondend.dsc$a_pointer = gevonden_file; status=lib$find_file(&filespec,&gevondend,findex,0,0,0,0); if ( (status & 1) == 1 ){ strcpy(gevonden,strtok(gevonden_file," ")); }else{ gevonden[0] = 0; } return(status); } /*--------------------------------------------*/ manPtr addman( manPtr *manroot,char *filename ) { manPtr m,f; m = calloc( 1, sizeof( man ) ); if ( !m ) return( NULL ); m->filename = strdup( filename ); if ( *manroot == NULL ){ *manroot = m; }else{ for( f = *manroot; f->next ; f = f->next ); f->next = m; } return(m); } /*--------------------------------------------*/ void freeman( manPtr *manroot ) { manPtr m,n; for( m = *manroot; m ; m = n ){ free( m->filename ); n = m->next; free( m ); } *manroot = NULL; } /*--------------------------------------------*/ int listofmans( char *filespec, manPtr *manroot ) { manPtr r; int status; int ffindex=0; char gevonden[NAM$C_MAXRSS + 1]; while(1){ status = find_file( filespec, gevonden, &ffindex ); if ( (status&1) ){ r = addman( manroot, gevonden ); if ( r == NULL ) return(2); }else{ if ( !( status&1 ) ) break; } } lib$find_file_end( &ffindex ); if ( status == RMS$_NMF) status = 1; return( status ); } /*--------------------------------------------*/ int convertman ( char *filespec, FILE *hlp , int base_level, int add_parentheses ) { FILE *man; char *in, *uit; char *m,*h; size_t len, thislen, maxlen= 50000; int bol,mode, return_status=1; char subjectname[ NAM$C_MAXRSS + 1 ]; in = calloc( 1, maxlen + 1 ); uit = calloc( 1, maxlen + 1 ); if ( in == NULL || uit == NULL ) return(2); man = fopen( filespec, "r" ); if ( man == NULL ) return(vaxc$errno); for( len = 0; !feof( man ) && len < maxlen ; len += thislen ){ thislen = fread( in + len, 1, maxlen - len, man ); } fclose(man); m = in; h = uit; *(m + len ) = 0; for ( mode = 0, bol = 1 ; *m; ++m ){ switch ( mode ){ case 0: switch(*m){ case '.': if ( bol ){ mode = 1; }else{ *h = *m; ++h; } break; case '\\': if ( bol ){ *h = ' ';++h; *h = ' ';++h; } mode = 2; break; default: if ( bol ){ *h = ' ';++h; *h = ' ';++h; } *h = *m; ++h; break; } break; case 1: /* after . at bol */ switch(*m){ case '\\': while( *m != '\n' && *m != '\r' && *m )++m; mode = 0; break; case 'B': ++m; *h = ' ';++h; mode = 0; break; case 'I': /* remove preceding eol */ if ( *(m+1) != 'P' ){ --h; while ( (*h == '\n' || *h == '\r') && h > uit )--h; ++h; } /* skip .Ix */ for(;*m != ' ' && *m != '\n' && *m != '\r'; ++m); /* copy line up to EOL */ for(;*m != '\n' && *m != '\r' && *m; ++m, ++h)*h = *m; /* if line ends in ., this is an EOL */ if ( *(h-1) == '.'){ --h; --m; }else{ /* if line does not end in ., skip EOL in source */ if ( *(m+1) == '\n' || *(m+1) == '\r')++m; } mode = 0; break; case 'S': if ( *(m+1) == 'H' ){ *h = '\n';++h; if ( strncmp( m+3 ,"NAME",4) == 0 || strncmp( m+3 ,"SYNOPSIS",8) == 0 || strncmp( m+3 ,"DESCRIPTION",11) == 0 ){ while( *m != '\n' && *m != '\r')++m; mode = 0; }else{ ++m; /* write help level, and flag it */ *h = '0' + base_level + 1;++h; return_status |= 2; *h = ' ';++h; /* skip H (or whatever after S) and blank */ ++m;++m; for(;*m != '\n' && *m != '\r' && *m; ++m, ++h){ /* write help label in lowercase, skip quotes */ /* fill blanks with underscores */ if ( *m != '\"' ){ *h = tolower( *m ); if (*h == ' ') *h = '_'; }else{ --h; } } /* Add a linefeed or two */ *h = *m;++h; *h = *m;++h; mode = 0; } } break; case 'T': if ( *(m+1) == 'H' ){ *h = '0' + base_level; ++h; return_status |= 2; *h = ' ';++h; for ( m = m + 3; *m != ' ' && *m ; ++m, ++h ){ *h = *m; } if ( add_parentheses ){ *h = '(';++h; *h = ')';++h; } while( *m != '\n' && *m != '\r' && *m )++m; mode = 0; } break; default: ++m; mode = 0; break; } break; case 2: /* after \ skip two characters or print the backslash */ switch(*m){ case '\\': *h = *m; ++h; mode = 0; break; default: ++m; mode = 0; break; } break; } /*end switch mode */ bol = 0; if ( *m == '\n' || *m == '\r') bol = 1; }/* end for mode */ *h = 0; if ( (return_status&2) ){ fprintf( hlp, "%s\n\n", uit); }else{ fnamepart( filespec, subjectname,3); if ( *subjectname ){ fprintf( hlp, "%d %s\n\n%s\n\n", base_level, subjectname, uit); }else{ /* No filename (as is the case with a logical), use first word as subject name */ char *n,*s; for(n = in; isspace( *n );++n); for(s = subjectname; !(isspace( *n )); ++n,++s)*s = *n; *s = 0; fprintf( hlp, "%d %s\n\n%s\n\n", base_level, subjectname, uit); } } /* printf( "read %d from %s, written %d to helpfile, return_status = %d\n", len, filespec, strlen(uit), return_status ); */ free( m ); free( h ); return ( 1 ); } /*--------------------------------------------*/ int convertmans( char *filespec, char *hlpfilename, int base_level, int append, int add_parentheses ) { int status=1; manPtr manroot=NULL, m; FILE *hlp; if ( append ){ hlp = fopen( hlpfilename,"a+"); }else{ hlp = fopen( hlpfilename,"w"); } if ( hlp == NULL ) return( vaxc$errno ); status = listofmans( filespec, &manroot ); if ( !(status&1) ) return( status ); for ( m = manroot ; m ; m = m->next ){ status = convertman( m->filename, hlp , base_level, add_parentheses ); if ( !(status&1) ){ fprintf(stderr,"Convertman of %s went wrong\n", m->filename); break; } } freeman( &manroot ); return( status ); } /*--------------------------------------------*/ void print_help() { fprintf( stderr, "Usage: [-a] [-b x] convertman \n" ); fprintf( stderr, " -a append to \n" ); fprintf( stderr, " -b if no headers found create one with level \n" ); fprintf( stderr, " and the filename as title.\n" ); fprintf( stderr, " -p add parentheses() to baselevel help items.\n" ); } /*--------------------------------------------*/ main ( int argc, char **argv ) { int status; int i,j; int append, base_level, basechange, add_parentheses; char *manfile=NULL; char *helpfile=NULL; if ( argc < 3 ){ print_help(); return( 1 ) ; } append = 0; base_level = 1; basechange = 0; add_parentheses = 0; for ( i = 1; i < argc; ++i){ if ( argv[i][0] == '-' ){ for( j = 1; argv[i][j] ; ++j ){ switch( argv[i][j] ){ case 'a': append = 1; break; case 'b': if ( (i+1) < argc ){ base_level = atoi( argv[ i + 1 ] ); basechange = 1; } break; case 'p': add_parentheses = 1; break; } } if ( basechange){ basechange = 0; i = i + 1; } }else{ if ( manfile == NULL ){ manfile = strdup( argv[i]); } else if ( helpfile == NULL ){ helpfile = strdup( argv[i]); } else { fprintf( stderr, "Unrecognized parameter : %s\n", argv[i]); } } } /* fprintf( stderr,"manfile: %s, helpfile: %s, append: %d, base_level : %d\n", manfile, helpfile, append, base_level); */ status = convertmans( manfile, helpfile, base_level, append, add_parentheses ); free( manfile ); free( helpfile ); return( status ); }