diff options
Diffstat (limited to 'libssh2-sys/libssh2-1.5.0/vms/man2help.c')
-rw-r--r-- | libssh2-sys/libssh2-1.5.0/vms/man2help.c | 516 |
1 files changed, 516 insertions, 0 deletions
diff --git a/libssh2-sys/libssh2-1.5.0/vms/man2help.c b/libssh2-sys/libssh2-1.5.0/vms/man2help.c new file mode 100644 index 0000000..92e5f2b --- /dev/null +++ b/libssh2-sys/libssh2-1.5.0/vms/man2help.c @@ -0,0 +1,516 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <errno.h> + +#include <starlet.h> +#include <lib$routines.h> +#include <ssdef.h> +#include <descrip.h> +#include <rms.h> + +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 <manfilespec> <helptextfile>\n" ); + fprintf( stderr, " -a append <manfilespec> to <helptextfile>\n" ); + fprintf( stderr, " -b <baselevel> if no headers found create one with level <baselevel>\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 ); +} + + |