summaryrefslogtreecommitdiff
path: root/libssh2-sys/libssh2-1.5.0/vms/man2help.c
diff options
context:
space:
mode:
Diffstat (limited to 'libssh2-sys/libssh2-1.5.0/vms/man2help.c')
-rw-r--r--libssh2-sys/libssh2-1.5.0/vms/man2help.c516
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 );
+}
+
+