1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
/* $Id: Pvmfstartpvmd.c,v 1.1 1997/06/27 16:34:39 pvmsrc Exp $ */
#ifdef WIN32
#include "..\..\src\pvmwin.h"
#endif
#include <stdio.h>
#include "pvm3.h"
#include "pvm_consts.h"
#include "pvmalloc.h"
void __fortran
PVMFSTARTPVMD (args_ptr, block, info, args_len)
char * args_ptr; int args_len;
int *block;
int *info;
{
char *nargs; /* args (null terminated) */
int ac = 0; /* # of agruments initialize to 0 */
char **av; /* argument vector */
register char *ch; /* temp char pointer */
register char *beg; /* pointer to begining of word */
register char *end; /* pointer to end of word */
register int len; /* length of word */
register int i; /* loop index */
#if ( DEBUG )
/* printout incoming nargs */
printf( "%d \"%s\"\n", args_len, args_ptr );
#endif
/* Some Fortran compilers allow for strings of zero length */
if ( args_len == 0 ) { /* null args */
av = (char **)0; /* make av a null pointer */
goto pvmd;
} else { /* something in args */
if ( ( nargs = TALLOC( args_len + 1, char, "nargs" ) )
== NULL ) {
pvmlogerror("pvmfstartpvmd() can't get memory\n");
goto bail;
}
/* copy args (ftocptr() could have been used for that) */
strncpy( nargs, args_ptr, args_len );
nargs[args_len] = '\0'; /* terminate with null */
}
ch = nargs; /* pointer at the begining of nargs */
/* assume a max of 32 args (8 should be OK from pvmd3(3PVM)) */
if ( ( av = TALLOC( 32, char *, "av" ) ) == NULL ) {
pvmlogerror("pvmfstartpvmd() can't get memory\n");
PVM_FREE( nargs ); /* avoid memory leeks */
goto bail;
}
/* at this point nargs contain at least 1 char */
for ( ; ; ) {
/* move forward until no space nor tab */
for( ; *ch == ' ' || *ch == '\t'; ch++ );
beg = ch; /* that's the begining of a word */
/* move forward until space, tab or null */
for( ; *ch != ' ' && *ch != '\t' && *ch != '\0'; ch++ );
end = ch; /* that's the end of a word */
len = end - beg; /* length of the word */
/* if nothing else then space, tab or null has been found */
/* then end of nargs is reached (exit point of loop) */
if ( len == 0 ) break;
/* allocate memory for word in agument vector */
if ( ( av[ac] = TALLOC( len + 1, char, "av[ac]" ) ) == NULL ) {
pvmlogerror("pvmfstartpvmd() can't get memory\n");
PVM_FREE( nargs ); /* avoid memory leeks */
for ( i = 0; i < ac; i++ )
PVM_FREE( av[i] );
goto bail;
}
strncpy( av[ac], beg, len ); /* copy word to arg vector */
*( av[ac] + len ) = '\0'; /* null terminate word */
ac++; /* increment arg counter */
}
#if ( DEBUG )
printf( "ac is %d\n", ac );
#endif
if ( ac == 0 ) {
/* no args found */
PVM_FREE( av ); /* free allocated memory */
av = (char **)0; /* make av a NULL pointer */
#if ( DEBUG )
} else {
/* printout result */
for ( i = 0; i < ac; i++ )
printf( "av[%2d] is \"%s\"\n", i, av[i] );
#endif
}
PVM_FREE( nargs ); /* free allocated memory */
pvmd:
/* hopefully pvm_start_pvmd is freeing allocated mem for av */
*info = pvm_start_pvmd( ac, av, *block );
return;
bail:
*info = -1;
return;
}
/*
*----------------------------------------------------------------------
* RCS identification
*----------------------------------------------------------------------
* $Author: pvmsrc $
* $Date: 1997/06/27 16:34:39 $
* $Locker: $
* $Revision: 1.1 $
* $Source: /home/nova/u3/pvmsrc/.CVS/PVM/pvm3.4/libfpvm/WIN32/Pvmfstartpvmd.c,v $
* $State: Exp $
*----------------------------------------------------------------------
* For GNU Emacs:
*----------------------------------------------------------------------
* Local Variables:
* mode: C
* abbrev-mode: t
* comment-column: 40
* version-control: t
* End:
*----------------------------------------------------------------------
*/
|