* Removed variable names from ansi style prototype

* Add -I. to CPPFLAGS
* Added new function t_agetstr which dynamically allocates area buffer.
This commit is contained in:
blymn 2000-05-20 13:55:10 +00:00
parent 9f7a44710e
commit 22a94f7041
5 changed files with 112 additions and 10 deletions

View File

@ -1,8 +1,8 @@
# $NetBSD: Makefile,v 1.21 1999/08/15 10:59:01 blymn Exp $
# $NetBSD: Makefile,v 1.22 2000/05/20 13:55:10 blymn Exp $
# @(#)Makefile 8.1 (Berkeley) 6/4/93
LIB= termcap
CPPFLAGS+=-DCM_N -DCM_GT -DCM_B -DCM_D
CPPFLAGS+=-I. -DCM_N -DCM_GT -DCM_B -DCM_D
SRCS= termcap.c tgoto.c tputs.c
MAN= termcap.3

View File

@ -1,5 +1,5 @@
# $NetBSD: shlib_version,v 1.5 2000/04/19 13:41:28 blymn Exp $
# $NetBSD: shlib_version,v 1.6 2000/05/20 13:55:10 blymn Exp $
# Remember to update distrib/sets/lists/base/shl.* when changing
#
major=0
minor=2
minor=3

View File

@ -1,4 +1,4 @@
.\" $NetBSD: termcap.3,v 1.18 2000/05/10 11:13:35 blymn Exp $
.\" $NetBSD: termcap.3,v 1.19 2000/05/20 13:55:10 blymn Exp $
.\"
.\" Copyright (c) 1980, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
@ -73,6 +73,8 @@
.Fn t_getflag "struct tinfo *info" "char *id"
.Ft char *
.Fn t_getstr "struct tinfo *info" "char *id" "char **area" "size_t *limit"
.Ft char *
.Fn t_agetstr "struct tinfo *info" "char *id" "char **buffer" "char **area"
.Ft int
.Fn t_getterm "struct tinfo *info" "char **area" "size_t *limit"
.Ft int
@ -293,7 +295,59 @@ When the information pointed to by
is no longer required any storage associated with the object can be
released by calling
.Fn t_freent .
The functions
The function
.Fn t_agetstr
performs the same function as
.Fn t_getstr
except sufficient memory is first allocated to hold the desired string
argument before adding it to the buffer. To initialise the buffer for
.Fn t_agetstr
the first call must be done with the contents of
.Fa buffer
set to NULL. Subsequent calls to
.Fn t_agetstr
can pass
.Fa buffer
and
.Fa area
in unmodified and the requested string argument will be appended to
the buffer after sufficient memory has been allocated. Modifying either
.Fa buffer
or
.Fa area
between calls to
.Fn t_agetstr
will certainly lead to the function misbehaving. When the storage
allocated by
.Fn t_agetstr
is no longer required it can be freed by passing the pointer contained
in
.Fa buffer
to
.Fn free .
If an error occurs within
.Fn t_agetstr
a NULL will be returned and
.Fa buffer
and
.Fa area
will remain unmodified.
.Em NOTE
.Fn t_agetstr
uses
.Fn realloc
to reallocate the buffer memory so saving a copy of either
.Fa buffer
or
.Fa area
for use after subsequent calls to
.Fn t_agetstr
is likely to fail. It is best to keep offsets from
.Fa buffer
to the desired string and calculate pointer addresses only after all
the calls to
.Fn t_agetstr
have been done. The functions
.Fn t_getnum
and
.Fn t_getflag

View File

@ -1,4 +1,4 @@
/* $NetBSD: termcap.c,v 1.29 2000/05/14 01:14:29 lukem Exp $ */
/* $NetBSD: termcap.c,v 1.30 2000/05/20 13:55:10 blymn Exp $ */
/*
* Copyright (c) 1980, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)termcap.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: termcap.c,v 1.29 2000/05/14 01:14:29 lukem Exp $");
__RCSID("$NetBSD: termcap.c,v 1.30 2000/05/20 13:55:10 blymn Exp $");
#endif
#endif /* not lint */
@ -375,6 +375,53 @@ tgetstr(id, area)
return t_getstr(fbuf, ids, area, NULL);
}
/*
* Get a string valued option specified by id and append it to the
* given buffer. If bufptr is NULL then a new buffer is allocated, if
* bufptr is non-NULL then extend the memory allocation to allow the
* new string to be appended to the buffer. The pointer area is
* updated to point to the start of the new entry and this address is
* also returned to the caller. If the string is not found or a
* memory allocation fails then NULL is returned and bufptr and area
* are unchanged.
*/
char *
t_agetstr(struct tinfo *info, const char *id, char **bufptr, char **area)
{
size_t new_size, offset;
char *new_buf;
_DIAGASSERT(info != NULL);
_DIAGASSERT(id != NULL);
_DIAGASSERT(bufptr != NULL);
_DIAGASSERT(area != NULL);
_DIAGASSERT(size != NULL);
t_getstr(info, id, NULL, &new_size);
/* either the string is empty or the capability does not exist. */
if (new_size == 0)
return NULL;
/* check if we have a buffer, if not malloc one and fill it in. */
if (*bufptr == NULL) {
if ((new_buf = (char *) malloc(new_size)) == NULL)
return NULL;
*bufptr = new_buf;
*area = new_buf;
} else {
offset = *area - *bufptr;
if ((new_buf = realloc(*bufptr, offset + new_size)) == NULL)
return NULL;
*bufptr = new_buf;
*area = *bufptr + offset; /* we need to do this just in case
realloc shifted the buffer. */
}
return t_getstr(info, id, area, NULL);
}
/*
* Free the buffer allocated by t_getent
*

View File

@ -1,4 +1,4 @@
/* $NetBSD: termcap.h,v 1.10 2000/04/19 13:41:29 blymn Exp $ */
/* $NetBSD: termcap.h,v 1.11 2000/05/20 13:55:11 blymn Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -60,7 +60,8 @@ int t_getent __P((struct tinfo **, const char *));
int t_getnum __P((struct tinfo *, const char *));
int t_getflag __P((struct tinfo *, const char *));
char *t_getstr __P((struct tinfo *, const char *, char **, size_t *));
int t_getterm(struct tinfo *info, char **area, size_t *limit);
char *t_agetstr(struct tinfo *, const char *, char **, char **);
int t_getterm(struct tinfo *, char **, size_t *);
int t_goto __P((struct tinfo *, const char *, int, int, char *, size_t));
int t_puts __P((struct tinfo *, const char *, int,
void (*)(char, void *), void *));