home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HyperLib 1997 Winter - Disc 1
/
HYPERLIB-1997-Winter-CD1.ISO.7z
/
HYPERLIB-1997-Winter-CD1.ISO
/
オンラインウェア
/
PRG
/
bwbasic-2.10.sit
/
bwbasic-2.10
/
bwb_str.c
< prev
next >
Wrap
Text File
|
1996-10-09
|
7KB
|
355 lines
/***************************************************************
bwb_str.c String-Management Routines
for Bywater BASIC Interpreter
Copyright (c) 1993, Ted A. Campbell
Bywater Software
email: tcamp@delphi.com
Copyright and Permissions Information:
All U.S. and international rights are claimed by the author,
Ted A. Campbell.
This software is released under the terms of the GNU General
Public License (GPL), which is distributed with this software
in the file "COPYING". The GPL specifies the terms under
which users may copy and use the software in this distribution.
A separate license is available for commercial distribution,
for information on which you should contact the author.
***************************************************************/
#include <stdio.h>
#include "bwbasic.h"
#include "bwb_mes.h"
#if INTENSIVE_DEBUG || TEST_BSTRING
static char tbuf[ MAXSTRINGSIZE + 1 ];
#endif
/***************************************************************
FUNCTION: str_btob()
DESCRIPTION: This C function assigns a bwBASIC string
structure to another bwBASIC string
structure.
***************************************************************/
#if ANSI_C
int
str_btob( bstring *d, bstring *s )
#else
int
str_btob( d, s )
bstring *d;
bstring *s;
#endif
{
char *t;
register int i;
#if TEST_BSTRING
sprintf( tbuf, "in str_btob(): entry, source b string name is <%s>", s->name );
bwb_debug( tbuf );
sprintf( tbuf, "in str_btob(): entry, destination b string name is <%s>", d->name );
bwb_debug( tbuf );
#endif
/* get memory for new buffer */
if ( ( t = (char *) calloc( s->length + 1, 1 )) == NULL )
{
#if PROG_ERRORS
bwb_error( "in str_btob(): failed to get memory for new buffer" );
#else
bwb_error( err_getmem );
#endif
return FALSE;
}
/* write the c string to the b string */
t[ 0 ] = '¥0';
for ( i = 0; i < (int) s->length; ++i )
{
t[ i ] = s->sbuffer[ i ];
#if INTENSIVE_DEBUG
tbuf[ i ] = s->sbuffer[ i ];
tbuf[ i + 1 ] = '¥0';
#endif
}
/* deallocate old memory */
#if INTENSIVE_DEBUG
if ( d->rab == TRUE )
{
sprintf( bwb_ebuf, "in str_btob(): reallocating RAB" );
bwb_debug( bwb_ebuf );
}
#endif
if (( d->rab != TRUE ) && ( d->sbuffer != NULL ))
{
#if INTENSIVE_DEBUG
sprintf( tbuf, "in str_btob(): deallocating string memory" );
bwb_debug ( tbuf );
#endif
free( d->sbuffer );
}
else
{
d->rab = (char) FALSE;
}
/* reassign buffer */
d->sbuffer = t;
/* reassign length */
d->length = s->length;
#if INTENSIVE_DEBUG
sprintf( bwb_ebuf, "in str_btob(): exit length <%d> string <%s>",
d->length, tbuf );
bwb_debug( bwb_ebuf );
#endif
/* return */
return TRUE;
}
/***************************************************************
FUNCTION: str_ctob()
DESCRIPTION: This C function assigns a null-terminated
C string to a bwBASIC string structure.
***************************************************************/
#if ANSI_C
int
str_ctob( bstring *s, char *buffer )
#else
int
str_ctob( s, buffer )
bstring *s;
char *buffer;
#endif
{
char *t;
register int i;
#if INTENSIVE_DEBUG
sprintf( tbuf, "in str_ctob(): entry, c string is <%s>", buffer );
bwb_debug( tbuf );
#endif
#if TEST_BSTRING
sprintf( tbuf, "in str_ctob(): entry, b string name is <%s>", s->name );
bwb_debug( tbuf );
#endif
/* get memory for new buffer */
if ( ( t = (char *) calloc( strlen( buffer ) + 1, 1 )) == NULL )
{
#if PROG_ERRORS
bwb_error( "in str_ctob(): failed to get memory for new buffer" );
#else
bwb_error( err_getmem );
#endif
return FALSE;
}
/* write the c string to the b string */
t[ 0 ] = '¥0';
for ( i = 0; i < (int) strlen( buffer ); ++i )
{
t[ i ] = buffer[ i ];
#if INTENSIVE_DEBUG
tbuf[ i ] = buffer[ i ];
tbuf[ i + 1 ] = '¥0';
#endif
}
/* deallocate old memory */
#if INTENSIVE_DEBUG
if ( s->rab == TRUE )
{
sprintf( bwb_ebuf, "in str_ctob(): reallocating RAB" );
bwb_debug( bwb_ebuf );
}
#endif
if (( s->rab != TRUE ) && ( s->sbuffer != NULL ))
{
free( s->sbuffer );
}
else
{
s->rab = (char) FALSE;
}
/* reassign buffer */
s->sbuffer = t;
/* reassign length */
s->length = (unsigned char) strlen( buffer );
#if INTENSIVE_DEBUG
sprintf( bwb_ebuf, "in str_ctob(): exit length <%d> string <%s>",
s->length, tbuf );
bwb_debug( bwb_ebuf );
#endif
/* return */
return TRUE;
}
/***************************************************************
FUNCTION: str_btoc()
DESCRIPTION: This C function assigns a null-terminated
C string to a bwBASIC string structure.
***************************************************************/
#if ANSI_C
int
str_btoc( char *buffer, bstring *s )
#else
int
str_btoc( buffer, s )
char *buffer;
bstring *s;
#endif
{
register int i;
#if INTENSIVE_DEBUG
sprintf( tbuf, "in str_btoc(): entry, b string length is <%d>",
s->length );
bwb_debug( tbuf );
#endif
#if TEST_BSTRING
sprintf( tbuf, "in str_btoc(): entry, b string name is <%s>", s->name );
bwb_debug( tbuf );
#endif
/* write the b string to the c string */
buffer[ 0 ] = '¥0';
for ( i = 0; i < (int) s->length; ++i )
{
buffer[ i ] = s->sbuffer[ i ];
buffer[ i + 1 ] = '¥0';
if ( i >= MAXSTRINGSIZE )
{
i = s->length + 1;
}
}
#if INTENSIVE_DEBUG
sprintf( tbuf, "in str_btoc(): exit, c string is <%s>", buffer );
bwb_debug( tbuf );
#endif
/* return */
return TRUE;
}
/***************************************************************
FUNCTION: str_cat()
DESCRIPTION: This C function performs the equivalent
of the C strcat() function, using BASIC
strings.
***************************************************************/
#if ANSI_C
char *
str_cat( bstring *a, bstring *b )
#else
char *
str_cat( a, b )
bstring *a;
bstring *b;
#endif
{
char abuf[ MAXSTRINGSIZE + 1 ];
char bbuf[ MAXSTRINGSIZE + 1 ];
char *r;
str_btoc( abuf, a );
str_btoc( bbuf, b );
#if INTENSIVE_DEBUG
sprintf( bwb_ebuf, "in str_cat(): a <%s> b <%s>", abuf, bbuf );
bwb_debug( bwb_ebuf );
#endif
strcat( abuf, bbuf );
str_ctob( a, abuf );
#if INTENSIVE_DEBUG
sprintf( bwb_ebuf, "in str_cat(): returns <%s>", abuf );
bwb_debug( bwb_ebuf );
#endif
r= abuf;
return r;
}
/***************************************************************
FUNCTION: str_cmp()
DESCRIPTION: This C function performs the equivalent
of the C strcmp() function, using BASIC
strings.
***************************************************************/
#if ANSI_C
int
str_cmp( bstring *a, bstring *b )
#else
int
str_cmp( a, b )
bstring *a;
bstring *b;
#endif
{
char abuf[ MAXSTRINGSIZE + 1 ];
char bbuf[ MAXSTRINGSIZE + 1 ];
str_btoc( abuf, a );
str_btoc( bbuf, b );
return strcmp( abuf, bbuf );
}