Commit 7fa7e2cf authored by William Gropp's avatar William Gropp
Browse files

[svn-r10759] Update the trmem routines and macros (defined when malloc took an...

[svn-r10759] Update the trmem routines and macros (defined when malloc took an unsigned int for size) to use size_t instead, as well as some int/size_t cleanup (again for code that correctly used signed int when it was written)
parent c729f748
......@@ -1955,17 +1955,19 @@ int _mpi_lineno = __LINE__;
// header isn't C++ clean. Instead, we just include a definition
// for size_t. If this is not the correct size, then edit this line
// (Note that this is needed only when memory tracing is enabled)
// FIXME: determine whether the type definition is needed, and include the
// correct definition.
typedef unsigned int size_t;
extern \"C\" void *MPIU_trmalloc( unsigned int, int, const char [] );
extern \"C\" void *MPIU_trmalloc( size_t, int, const char [] );
extern \"C\" void MPIU_trfree( void *, int, const char [] );
extern \"C\" void MPIU_trdump( void *, int );
void *operator new(size_t size) {
void *p = MPIU_trmalloc( (unsigned int) size, _mpi_lineno, __FILE__ );
void *p = MPIU_trmalloc( size, _mpi_lineno, __FILE__ );
return p;}
void operator delete(void *p) {
MPIU_trfree( p, _mpi_lineno, __FILE__ );}
void *operator new[]( size_t size) {
void *p = MPIU_trmalloc( (unsigned int) size, _mpi_lineno, __FILE__ );
void *p = MPIU_trmalloc( size, _mpi_lineno, __FILE__ );
return p;}
void operator delete[](void *p) {
MPIU_trfree( p, _mpi_lineno, __FILE__ );}
......
......@@ -54,10 +54,10 @@ void MPIR_Ext_cs_enter_allfunc(void);
void MPIR_Ext_cs_exit_allfunc(void);
/* prototypes for the mem tracing routines */
void *MPIU_trmalloc(unsigned int a, int lineno, const char fname[]);
void *MPIU_trmalloc(size_t a, int lineno, const char fname[]);
void MPIU_trfree(void *a_ptr, int line, const char fname[]);
void *MPIU_trcalloc(unsigned int nelem, unsigned int elsize, int lineno, const char fname[]);
void *MPIU_trrealloc(void *p, int size, int lineno, const char fname[]);
void *MPIU_trcalloc(size_t nelem, size_t elsize, int lineno, const char fname[]);
void *MPIU_trrealloc(void *p, size_t size, int lineno, const char fname[]);
void *MPIU_trstrdup(const char *str, int lineno, const char fname[]);
#endif /* defined(GLUE_ROMIO_H_INCLUDED) */
......
......@@ -53,7 +53,7 @@ struct MPID_Comm;
request is not currently available */
typedef struct MPIR_Bsend_msg {
void *msgbuf;
int count;
int count; /* int type to match needs of Pack routine */
MPI_Datatype dtype;
int tag;
struct MPID_Comm *comm_ptr;
......@@ -62,14 +62,14 @@ typedef struct MPIR_Bsend_msg {
/* BsendData describes a bsend request */
typedef struct MPIR_Bsend_data {
int size; /* size that is available for data */
int total_size; /* total size of this segment,
size_t size; /* size that is available for data */
size_t total_size; /* total size of this segment,
including all headers */
struct MPIR_Bsend_data *next, *prev;
MPIR_Bsend_kind_t kind;
struct MPID_Request *request;
MPIR_Bsend_msg_t msg;
double alignpad; /* make sure that the struct
MPIR_Bsend_msg_t msg;
double alignpad; /* make sure that the struct
shares double alignment */
} MPIR_Bsend_data_t;
......
......@@ -6,6 +6,10 @@
#ifndef MPIMEM_H_INCLUDED
#define MPIMEM_H_INCLUDED
#ifndef MPICHCONF_H_INCLUDED
#error 'mpimem.h requires that mpichconf.h be included first'
#endif
/* Make sure that we have the definitions for the malloc routines and size_t */
#include <stdio.h>
#include <stdlib.h>
......@@ -138,17 +142,17 @@ int MPIU_Str_get_string(char **str_ptr, char *val, int maxlen);
/* ------------------------------------------------------------------------- */
void MPIU_trinit(int);
void *MPIU_trmalloc(unsigned int, int, const char []);
void *MPIU_trmalloc(size_t, int, const char []);
void MPIU_trfree(void *, int, const char []);
int MPIU_trvalid(const char []);
void MPIU_trspace(int *, int *);
void MPIU_trid(int);
void MPIU_trlevel(int);
void MPIU_trDebugLevel(int);
void *MPIU_trcalloc(unsigned int, unsigned int, int, const char []);
void *MPIU_trrealloc(void *, int, int, const char[]);
void *MPIU_trcalloc(size_t, size_t, int, const char []);
void *MPIU_trrealloc(void *, size_t, int, const char[]);
void *MPIU_trstrdup(const char *, int, const char[]);
void MPIU_TrSetMaxMem(int);
void MPIU_TrSetMaxMem(size_t);
void MPIU_trdump(FILE *, int);
#ifdef USE_MEMORY_TRACING
......@@ -173,7 +177,7 @@ void MPIU_trdump(FILE *, int);
.ve
However, it can also be defined as
.vb
#define MPIU_Malloc(n) MPIU_trmalloc(n,__FILE__,__LINE__)
#define MPIU_Malloc(n) MPIU_trmalloc(n,__LINE__,__FILE__)
.ve
where 'MPIU_trmalloc' is a tracing version of 'malloc' that is included with
MPICH.
......@@ -181,7 +185,7 @@ void MPIU_trdump(FILE *, int);
Module:
Utility
M*/
#define MPIU_Malloc(a) MPIU_trmalloc((unsigned)(a),__LINE__,__FILE__)
#define MPIU_Malloc(a) MPIU_trmalloc((a),__LINE__,__FILE__)
/*M
MPIU_Calloc - Allocate memory that is initialized to zero.
......@@ -203,7 +207,7 @@ void MPIU_trdump(FILE *, int);
Utility
M*/
#define MPIU_Calloc(a,b) \
MPIU_trcalloc((unsigned)(a),(unsigned)(b),__LINE__,__FILE__)
MPIU_trcalloc((a),(b),__LINE__,__FILE__)
/*M
MPIU_Free - Free memory
......@@ -224,7 +228,7 @@ void MPIU_trdump(FILE *, int);
.ve
However, it can also be defined as
.vb
#define MPIU_Free(n) MPIU_trfree(n,__FILE__,__LINE__)
#define MPIU_Free(n) MPIU_trfree(n,__LINE__,__FILE__)
.ve
where 'MPIU_trfree' is a tracing version of 'free' that is included with
MPICH.
......
......@@ -57,10 +57,10 @@ static void MPIR_Bsend_dump( void );
static struct BsendBuffer {
void *buffer; /* Pointer to the begining of the user-
provided buffer */
int buffer_size; /* Size of the user-provided buffer */
size_t buffer_size; /* Size of the user-provided buffer */
void *origbuffer; /* Pointer to the buffer provided by
the user */
int origbuffer_size; /* Size of the buffer as provided
size_t origbuffer_size;/* Size of the buffer as provided
by the user */
MPIR_Bsend_data_t *avail; /* Pointer to the first available block
of space */
......@@ -157,7 +157,9 @@ int MPIR_Bsend_attach( void *buffer, int buffer_size )
/*
* Detach a buffer. This routine must wait until any pending bsends
* are complete.
* are complete. Note that MPI specifies the type of the returned "size"
* argument as an "int" (the definition predates that of ssize_t as a
* standard type).
*/
#undef FUNCNAME
#define FUNCNAME MPIR_Bsend_detach
......@@ -183,7 +185,9 @@ int MPIR_Bsend_detach( void *bufferp, int *size )
/* Note that this works even when the buffer does not exist */
*(void **) bufferp = BsendBuffer.origbuffer;
*size = BsendBuffer.origbuffer_size;
/* This cast to int will work because the user must use an int to describe
the buffer size */
*size = (int)BsendBuffer.origbuffer_size;
BsendBuffer.origbuffer = NULL;
BsendBuffer.origbuffer_size = 0;
BsendBuffer.buffer = 0;
......
......@@ -46,7 +46,10 @@ PMPI_LOCAL int MPIR_fd_send(int fd, void *buffer, int length)
while (length)
{
num_bytes = send(fd, buffer, length, 0);
/* The expectation is that the length of a join message will fit
in an int. For Unixes that define send as returning ssize_t,
we can safely cast this to an int. */
num_bytes = (int)send(fd, buffer, length, 0);
/* --BEGIN ERROR HANDLING-- */
if (num_bytes == -1)
{
......@@ -75,7 +78,8 @@ PMPI_LOCAL int MPIR_fd_recv(int fd, void *buffer, int length)
while (length)
{
num_bytes = recv(fd, buffer, length, 0);
/* See discussion on send above for the cast to int. */
num_bytes = (int)recv(fd, buffer, length, 0);
/* --BEGIN ERROR HANDLING-- */
if (num_bytes == -1)
{
......
......@@ -84,7 +84,7 @@ static inline void setupProcessorName( void )
static inline void setupProcessorName( void )
{
if (gethostname(processorName, MPI_MAX_PROCESSOR_NAME) == 0) {
processorNameLen = strlen( processorName );
processorNameLen = (int)strlen( processorName );
}
}
......@@ -92,7 +92,7 @@ static inline void setupProcessorName( void )
static inline void setupProcessorName( void );
{
if (sysinfo(SI_HOSTNAME, processorName, MPI_MAX_PROCESSOR_NAME) == 0) {
processorNameLen = strlen( processorName );
processorNameLen = (int)strlen( processorName );
}
}
......@@ -102,6 +102,6 @@ static inline void setupProcessorName( void );
/* Set the name as the rank of the process */
MPIU_Snprintf( processorName, MPI_MAX_PROCESSOR_NAME, "%d",
MPIDI_Process.my_pg_rank );
processorNameLen = strlen( processorName );
processorNameLen = (int)strlen( processorName );
}
#endif
......@@ -245,7 +245,7 @@ static int get_port_name_tag(int * port_name_tag)
port_name_tag_mask[i]) {
/* Mark the appropriate bit as used and return that */
port_name_tag_mask[i] |= (1 << ((8 * sizeof(int)) - j - 1));
*port_name_tag = ((i * 8 * sizeof(int)) + j);
*port_name_tag = ((i * 8 * (int)sizeof(int)) + j);
goto fn_exit;
}
}
......@@ -268,8 +268,8 @@ static void free_port_name_tag(int tag)
{
int idx, rem_tag;
idx = tag / (sizeof(int) * 8);
rem_tag = tag - (idx * sizeof(int) * 8);
idx = tag / ((int)sizeof(int) * 8);
rem_tag = tag - (int)(idx * sizeof(int) * 8);
port_name_tag_mask[idx] &= ~(1 << ((8 * sizeof(int)) - 1 - rem_tag));
}
......
......@@ -730,9 +730,9 @@ static int connToStringKVS( char **buf_p, int *slen, MPIDI_PG_t *pg )
char *string = 0;
char *pg_idStr = (char *)pg->id; /* In the PMI/KVS space,
the pg id is a string */
char buf[MPIDI_MAX_KVS_VALUE_LEN];
int i, j, vallen, rc, mpi_errno = MPI_SUCCESS, len;
int curSlen;
char buf[MPIDI_MAX_KVS_VALUE_LEN];
int i, j, rc, mpi_errno = MPI_SUCCESS, len;
size_t vallen, curSlen;
/* Make an initial allocation of a string with an estimate of the
needed space */
......@@ -782,7 +782,7 @@ static int connToStringKVS( char **buf_p, int *slen, MPIDI_PG_t *pg )
if (len + vallen + 1 >= curSlen) {
char *nstring = 0;
curSlen += (pg->size - i) * (vallen + 1 );
nstring = MPIU_Realloc( string, curSlen);
nstring = MPIU_Realloc( string, curSlen );
if (!nstring) {
MPIU_ERR_SETANDJUMP(mpi_errno,MPI_ERR_OTHER,"**nomem");
}
......
......@@ -12,7 +12,7 @@
does not alias any pointer prior to the call.
*/
void MPL_trinit(int);
void *MPL_trmalloc(unsigned int, int, const char[]);
void *MPL_trmalloc(size_t, int, const char[]);
void MPL_trfree(void *, int, const char[]);
int MPL_trvalid(const char[]);
int MPL_trvalid2(const char[],int,const char[]);
......@@ -20,10 +20,10 @@ void MPL_trspace(int *, int *);
void MPL_trid(int);
void MPL_trlevel(int);
void MPL_trDebugLevel(int);
void *MPL_trcalloc(unsigned int, unsigned int, int, const char[]);
void *MPL_trrealloc(void *, int, int, const char[]);
void *MPL_trcalloc(size_t, size_t, int, const char[]);
void *MPL_trrealloc(void *, size_t, int, const char[]);
void *MPL_trstrdup(const char *, int, const char[]);
void MPL_TrSetMaxMem(int);
void MPL_TrSetMaxMem(size_t);
/* Make sure that FILE is defined */
#include <stdio.h>
......
......@@ -202,7 +202,7 @@ Input Parameters:
double aligned pointer to requested storage, or null if not
available.
+*/
void *MPL_trmalloc(unsigned int a, int lineno, const char fname[])
void *MPL_trmalloc(size_t a, int lineno, const char fname[])
{
TRSPACE *head;
char *new = NULL;
......@@ -753,11 +753,11 @@ Input Parameters:
Double aligned pointer to requested storage, or null if not
available.
+*/
void *MPL_trcalloc(unsigned int nelem, unsigned int elsize, int lineno, const char fname[])
void *MPL_trcalloc(size_t nelem, size_t elsize, int lineno, const char fname[])
{
void *p;
p = MPL_trmalloc((unsigned) (nelem * elsize), lineno, fname);
p = MPL_trmalloc(nelem * elsize, lineno, fname);
if (p) {
memset(p, 0, nelem * elsize);
}
......@@ -778,7 +778,7 @@ Input Parameters:
available. This implementation ALWAYS allocates new space and copies
the contents into the new space.
+*/
void *MPL_trrealloc(void *p, int size, int lineno, const char fname[])
void *MPL_trrealloc(void *p, size_t size, int lineno, const char fname[])
{
void *pnew;
size_t nsize;
......@@ -809,7 +809,7 @@ void *MPL_trrealloc(void *p, int size, int lineno, const char fname[])
return NULL;
}
pnew = MPL_trmalloc((unsigned) size, lineno, fname);
pnew = MPL_trmalloc(size, lineno, fname);
if (p && pnew) {
nsize = size;
......@@ -846,7 +846,7 @@ void *MPL_trstrdup(const char *str, int lineno, const char fname[])
void *p;
size_t len = strlen(str) + 1;
p = MPL_trmalloc((unsigned)len, lineno, (char *) fname);
p = MPL_trmalloc(len, lineno, fname);
if (p) {
memcpy(p, str, len);
}
......@@ -991,7 +991,7 @@ void MPL_trdumpGrouped(FILE * fp, int minid)
fflush(fp);
}
void MPL_TrSetMaxMem(int size)
void MPL_TrSetMaxMem(size_t size)
{
TRMaxMemAllow = size;
}
......
......@@ -12,7 +12,7 @@
does not alias any pointer prior to the call.
*/
void MPL_trinit(int);
void *MPL_trmalloc(unsigned int, int, const char[]);
void *MPL_trmalloc(size_t, int, const char[]);
void MPL_trfree(void *, int, const char[]);
int MPL_trvalid(const char[]);
int MPL_trvalid2(const char[],int,const char[]);
......@@ -20,10 +20,10 @@ void MPL_trspace(int *, int *);
void MPL_trid(int);
void MPL_trlevel(int);
void MPL_trDebugLevel(int);
void *MPL_trcalloc(unsigned int, unsigned int, int, const char[]);
void *MPL_trrealloc(void *, int, int, const char[]);
void *MPL_trcalloc(size_t, size_t, int, const char[]);
void *MPL_trrealloc(void *, size_t, int, const char[]);
void *MPL_trstrdup(const char *, int, const char[]);
void MPL_TrSetMaxMem(int);
void MPL_TrSetMaxMem(size_t);
/* Make sure that FILE is defined */
#include <stdio.h>
......
......@@ -202,7 +202,7 @@ Input Parameters:
double aligned pointer to requested storage, or null if not
available.
+*/
void *MPL_trmalloc(unsigned int a, int lineno, const char fname[])
void *MPL_trmalloc(size_t a, int lineno, const char fname[])
{
TRSPACE *head;
char *new = NULL;
......@@ -753,11 +753,11 @@ Input Parameters:
Double aligned pointer to requested storage, or null if not
available.
+*/
void *MPL_trcalloc(unsigned int nelem, unsigned int elsize, int lineno, const char fname[])
void *MPL_trcalloc(size_t nelem, size_t elsize, int lineno, const char fname[])
{
void *p;
p = MPL_trmalloc((unsigned) (nelem * elsize), lineno, fname);
p = MPL_trmalloc(nelem * elsize, lineno, fname);
if (p) {
memset(p, 0, nelem * elsize);
}
......@@ -778,7 +778,7 @@ Input Parameters:
available. This implementation ALWAYS allocates new space and copies
the contents into the new space.
+*/
void *MPL_trrealloc(void *p, int size, int lineno, const char fname[])
void *MPL_trrealloc(void *p, size_t size, int lineno, const char fname[])
{
void *pnew;
size_t nsize;
......@@ -809,7 +809,7 @@ void *MPL_trrealloc(void *p, int size, int lineno, const char fname[])
return NULL;
}
pnew = MPL_trmalloc((unsigned) size, lineno, fname);
pnew = MPL_trmalloc(size, lineno, fname);
if (p && pnew) {
nsize = size;
......@@ -846,7 +846,7 @@ void *MPL_trstrdup(const char *str, int lineno, const char fname[])
void *p;
size_t len = strlen(str) + 1;
p = MPL_trmalloc((unsigned)len, lineno, (char *) fname);
p = MPL_trmalloc(len, lineno, fname);
if (p) {
memcpy(p, str, len);
}
......@@ -991,7 +991,7 @@ void MPL_trdumpGrouped(FILE * fp, int minid)
fflush(fp);
}
void MPL_TrSetMaxMem(int size)
void MPL_TrSetMaxMem(size_t size)
{
TRMaxMemAllow = size;
}
......
......@@ -102,7 +102,8 @@ int MPIE_ArgsCheckForEnv( int argc, char *argv[], ProcessWorld *pWorld,
while (*lPtr) {
name = lPtr++;
while (*lPtr && *lPtr != ',') lPtr++;
namelen = lPtr - name;
/* The length of any environment string will fit in an int */
namelen = (int)(lPtr - name);
p = (EnvData *)MPIU_Malloc( sizeof(EnvData) );
p->value = 0;
p->name = (const char *)MPIU_Malloc( namelen + 1 );
......@@ -243,7 +244,8 @@ int MPIE_EnvInitData( EnvData *elist, int getValue )
{
const char *value;
char *str;
int slen, rc;
int rc;
size_t slen;
while (elist) {
/* Skip variables that already have value strings */
......
......@@ -238,7 +238,7 @@ void TimeoutInit( int seconds )
#ifdef HAVE_TIME
time_t t;
t = time( NULL );
end_time = seconds + t;
end_time = seconds + (int)t;
#elif defined(HAVE_GETTIMEOFDAY)
struct timeval tp;
gettimeofday( &tp, NULL );
......@@ -264,7 +264,7 @@ int TimeoutGetRemaining( void )
#ifdef HAVE_TIME
time_t t;
t = time( NULL );
time_left = end_time - t;
time_left = end_time - (int)t;
#elif defined(HAVE_GETTIMEOFDAY)
struct timeval tp;
gettimeofday( &tp, NULL );
......
......@@ -209,7 +209,7 @@ static int IOLabelSetLabelText( const char pattern[], char label[],
switch (*pin) {
case '%': *pout++ = '%'; lenleft--; break;
case 'd':
dlen = strlen( rankAsChar );
dlen = (int)strlen( rankAsChar );
if (dlen < lenleft) {
MPIU_Strncpy( pout, rankAsChar, lenleft );
pout += dlen;
......@@ -221,7 +221,7 @@ static int IOLabelSetLabelText( const char pattern[], char label[],
}
break;
case 'w':
dlen = strlen(worldnumAsChar);
dlen = (int)strlen(worldnumAsChar);
if (dlen < lenleft) {
MPIU_Strncpy( pout, worldnumAsChar, lenleft );
pout += dlen;
......@@ -248,7 +248,7 @@ static int IOLabelSetLabelText( const char pattern[], char label[],
/* Recursively invoke the label routine */
IOLabelSetLabelText( wPattern, wLabel, sizeof(wLabel),
rank, worldnum );
dlen = strlen(wLabel);
dlen = (int)strlen(wLabel);
if (dlen < lenleft) {
MPIU_Strncpy( pout, wLabel, lenleft );
pout += dlen;
......
......@@ -1391,7 +1391,7 @@ static int PMIUBufferedReadLine( PMIProcess *pentry, char *buf, int maxlen )
/* Carefully read data into buffer. This could be
written to read more at one time, but would then
need to know the size of the readbuf */
n = read( fd, readbuf, 1 );
n = (int)read( fd, readbuf, 1 );
} while (n == -1 && errno == EINTR);
if (n == 0) {
/* EOF */
......
......@@ -54,12 +54,17 @@ extern int MPIE_Debug;
#define DBG_PRINTF(a) DBG_PRINTFCOND(MPIE_Debug,a)
/* #define USE_LOG_SYSCALLS */
/* For the system calls used in PMI, values returned by the system
calls will fit in an int, and need to be an int (signed) to
test for error, since a return of -1 (typically) indicates error,
even for system calls such as write that may return an unsigned value (!)
*/
#ifdef USE_LOG_SYSCALLS
#include <errno.h>
#define MPIE_SYSCALL(a_,b_,c_) { \
printf( "about to call %s (%s,%d)\n", #b_ ,__FILE__, __LINE__);\
fflush(stdout); errno = 0;\
a_ = b_ c_; \
a_ = (int)b_ c_; \
if ((a_)>=0 || errno==0) {\
printf( "%s returned %d\n", #b_, a_ );\
} \
......@@ -68,7 +73,7 @@ extern int MPIE_Debug;
#b_, a_, errno, strerror(errno));\
}; fflush(stdout);}
#else
#define MPIE_SYSCALL(a_,b_,c_) a_ = b_ c_
#define MPIE_SYSCALL(a_,b_,c_) a_ = (int)b_ c_
#endif
......
......@@ -210,7 +210,8 @@ MachineTable *MPIE_ReadMachines( const char *arch, int nNeeded,
char dirname[PATH_MAX];
const char *path=getenv("MPIEXEC_MACHINES_PATH");
MachineTable *mt;
int len, nFound = 0;
size_t len;
int nFound = 0;
/* Try to open the machines file. arch may be null, in which
case we open the default file */
......@@ -341,13 +342,14 @@ MachineTable *MPIE_ReadMachines( const char *arch, int nNeeded,
mt->desc[nFound].login = 0;
if (npstring) {
char *newp;
int n = strtol( npstring, &newp, 0 );
size_t n = strtol( npstring, &newp, 0 );
if (newp == npstring) {
/* This indicates an error in the file. How do we
report that? */
n = 1;
}
mt->desc[nFound].np = n;
/* Length of hostname will fit in an int. */
mt->desc[nFound].np = (int)n;
}
else
mt->desc[nFound].np = 1;
......
......@@ -132,7 +132,11 @@ int PMIU_readline( int fd, char *buf, int maxlen )
if (nextChar == lastChar) {
lastfd = fd;
do {
n = read( fd, readbuf, sizeof(readbuf)-1 );
/* The size of the read buffer will always fit within
an int. */
/* FIXME: the read length should be the size of the buffer,
not the size of the pointer to buffer */
n = (int)read( fd, readbuf, sizeof(readbuf)-1 );
} while (n == -1 && errno == EINTR);
if (n == 0) {
/* EOF */
......@@ -172,7 +176,8 @@ int PMIU_readline( int fd, char *buf, int maxlen )
int PMIU_writeline( int fd, char *buf )
{
int size, n;
int n;
size_t size;
size = strlen( buf );
if ( size > PMIU_MAXLINE ) {
......@@ -184,7 +189,10 @@ int PMIU_writeline( int fd, char *buf )
buf );
else {
do {
n = write( fd, buf, size );
/* We assume that the size of any buf to be written fits
in an int. For the PMI interface, this should always
be true */
n = (int)write( fd, buf, size );
} while (n == -1 && errno == EINTR);
if ( n < 0 ) {
......@@ -204,8 +212,8 @@ int PMIU_writeline( int fd, char *buf )
*/
int PMIU_parse_keyvals( char *st )
{
char *p, *keystart, *valstart;
int offset;
char *p, *keystart, *valstart;
size_t offset;
if ( !st )
return( -1 );
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment