Started a libbsd.so with some useful stuff for porting applications.
Very limited right now, but might even be enough. We might want to move arc4random.c from traceroute over, though. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18382 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+7
-4
@@ -1,10 +1,13 @@
|
||||
SubDir HAIKU_TOP src libs ;
|
||||
|
||||
SubInclude HAIKU_TOP src libs agg ;
|
||||
SubInclude HAIKU_TOP src libs bsd ;
|
||||
#SubInclude HAIKU_TOP src libs edit ;
|
||||
SubInclude HAIKU_TOP src libs fluidsynth ;
|
||||
SubInclude HAIKU_TOP src libs freetype2 ;
|
||||
SubInclude HAIKU_TOP src libs zlib ;
|
||||
SubInclude HAIKU_TOP src libs png ;
|
||||
SubInclude HAIKU_TOP src libs termcap ;
|
||||
SubInclude HAIKU_TOP src libs stdc++ ;
|
||||
#SubInclude HAIKU_TOP src libs ncurses ;
|
||||
SubInclude HAIKU_TOP src libs pdflib ;
|
||||
SubInclude HAIKU_TOP src libs png ;
|
||||
SubInclude HAIKU_TOP src libs stdc++ ;
|
||||
SubInclude HAIKU_TOP src libs termcap ;
|
||||
SubInclude HAIKU_TOP src libs zlib ;
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
SubDir HAIKU_TOP src libs bsd ;
|
||||
|
||||
SetSubDirSupportedPlatforms $(HAIKU_BONE_COMPATIBLE_PLATFORMS) ;
|
||||
|
||||
UseHeaders [ FDirName $(HAIKU_TOP) headers compatibility bsd ] : true ;
|
||||
|
||||
SharedLibrary libbsd.so :
|
||||
err.c
|
||||
progname.c
|
||||
stringlist.c
|
||||
;
|
||||
@@ -0,0 +1,215 @@
|
||||
/*-
|
||||
* Copyright (c) 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
//#include "libc_private.h"
|
||||
#define __weak_reference(a, b)
|
||||
|
||||
extern const char *_getprogname(void);
|
||||
|
||||
static FILE *err_file; /* file to use for error output */
|
||||
static void (*err_exit)(int);
|
||||
|
||||
void _err(int eval, const char *fmt, ...);
|
||||
void _warn(const char *fmt, ...);
|
||||
|
||||
/*
|
||||
* This is declared to take a `void *' so that the caller is not required
|
||||
* to include <stdio.h> first. However, it is really a `FILE *', and the
|
||||
* manual page documents it as such.
|
||||
*/
|
||||
void
|
||||
err_set_file(void *fp)
|
||||
{
|
||||
if (fp)
|
||||
err_file = fp;
|
||||
else
|
||||
err_file = stderr;
|
||||
}
|
||||
|
||||
void
|
||||
err_set_exit(void (*ef)(int))
|
||||
{
|
||||
err_exit = ef;
|
||||
}
|
||||
|
||||
__weak_reference(_err, err);
|
||||
|
||||
void
|
||||
_err(int eval, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
verrc(eval, errno, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
verr(eval, fmt, ap)
|
||||
int eval;
|
||||
const char *fmt;
|
||||
va_list ap;
|
||||
{
|
||||
verrc(eval, errno, fmt, ap);
|
||||
}
|
||||
|
||||
void
|
||||
errc(int eval, int code, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
verrc(eval, code, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
verrc(eval, code, fmt, ap)
|
||||
int eval;
|
||||
int code;
|
||||
const char *fmt;
|
||||
va_list ap;
|
||||
{
|
||||
if (err_file == 0)
|
||||
err_set_file((FILE *)0);
|
||||
fprintf(err_file, "%s: ", _getprogname());
|
||||
if (fmt != NULL) {
|
||||
vfprintf(err_file, fmt, ap);
|
||||
fprintf(err_file, ": ");
|
||||
}
|
||||
fprintf(err_file, "%s\n", strerror(code));
|
||||
if (err_exit)
|
||||
err_exit(eval);
|
||||
exit(eval);
|
||||
}
|
||||
|
||||
void
|
||||
errx(int eval, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
verrx(eval, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
verrx(eval, fmt, ap)
|
||||
int eval;
|
||||
const char *fmt;
|
||||
va_list ap;
|
||||
{
|
||||
if (err_file == 0)
|
||||
err_set_file((FILE *)0);
|
||||
fprintf(err_file, "%s: ", _getprogname());
|
||||
if (fmt != NULL)
|
||||
vfprintf(err_file, fmt, ap);
|
||||
fprintf(err_file, "\n");
|
||||
if (err_exit)
|
||||
err_exit(eval);
|
||||
exit(eval);
|
||||
}
|
||||
|
||||
__weak_reference(_warn, warn);
|
||||
|
||||
void
|
||||
_warn(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vwarnc(errno, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
vwarn(fmt, ap)
|
||||
const char *fmt;
|
||||
va_list ap;
|
||||
{
|
||||
vwarnc(errno, fmt, ap);
|
||||
}
|
||||
|
||||
void
|
||||
warnc(int code, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vwarnc(code, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
vwarnc(code, fmt, ap)
|
||||
int code;
|
||||
const char *fmt;
|
||||
va_list ap;
|
||||
{
|
||||
if (err_file == 0)
|
||||
err_set_file((FILE *)0);
|
||||
fprintf(err_file, "%s: ", _getprogname());
|
||||
if (fmt != NULL) {
|
||||
vfprintf(err_file, fmt, ap);
|
||||
fprintf(err_file, ": ");
|
||||
}
|
||||
fprintf(err_file, "%s\n", strerror(code));
|
||||
}
|
||||
|
||||
void
|
||||
warnx(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vwarnx(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
vwarnx(fmt, ap)
|
||||
const char *fmt;
|
||||
va_list ap;
|
||||
{
|
||||
if (err_file == 0)
|
||||
err_set_file((FILE *)0);
|
||||
fprintf(err_file, "%s: ", _getprogname());
|
||||
if (fmt != NULL)
|
||||
vfprintf(err_file, fmt, ap);
|
||||
fprintf(err_file, "\n");
|
||||
}
|
||||
|
||||
#pragma weak err=_err
|
||||
#pragma weak warn=_warn
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright 2006, Haiku, Inc. All Rights Reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*
|
||||
* Authors:
|
||||
* Axel Dörfler, [email protected]
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
extern const char *__progname;
|
||||
|
||||
const char *_getprogname(void);
|
||||
|
||||
|
||||
const char *
|
||||
_getprogname(void)
|
||||
{
|
||||
return __progname;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
setprogname(const char *programName)
|
||||
{
|
||||
const char *slash = strrchr(programName, '/');
|
||||
if (slash != NULL)
|
||||
__progname = slash + 1;
|
||||
else
|
||||
__progname = programName;
|
||||
}
|
||||
|
||||
#pragma weak getprogname=_getprogname
|
||||
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
* Copyright (c) 1994 Christos Zoulas
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Christos Zoulas.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <err.h>
|
||||
#include <stdlib.h>
|
||||
#include <stringlist.h>
|
||||
|
||||
#define _SL_CHUNKSIZE 20
|
||||
|
||||
/*
|
||||
* sl_init(): Initialize a string list
|
||||
*/
|
||||
StringList *
|
||||
sl_init()
|
||||
{
|
||||
StringList *sl;
|
||||
|
||||
sl = malloc(sizeof(StringList));
|
||||
if (sl == NULL)
|
||||
err(1, "stringlist: %m");
|
||||
|
||||
sl->sl_cur = 0;
|
||||
sl->sl_max = _SL_CHUNKSIZE;
|
||||
sl->sl_str = malloc(sl->sl_max * sizeof(char *));
|
||||
if (sl->sl_str == NULL)
|
||||
err(1, "stringlist: %m");
|
||||
return sl;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sl_add(): Add an item to the string list
|
||||
*/
|
||||
int
|
||||
sl_add(sl, name)
|
||||
StringList *sl;
|
||||
char *name;
|
||||
{
|
||||
if (sl->sl_cur == sl->sl_max - 1) {
|
||||
char **string;
|
||||
|
||||
sl->sl_max += _SL_CHUNKSIZE;
|
||||
|
||||
string = realloc(sl->sl_str, sl->sl_max * sizeof(char *));
|
||||
if (string == NULL)
|
||||
return (-1);
|
||||
|
||||
sl->sl_str = string;
|
||||
}
|
||||
sl->sl_str[sl->sl_cur++] = name;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sl_free(): Free a stringlist
|
||||
*/
|
||||
void
|
||||
sl_free(sl, all)
|
||||
StringList *sl;
|
||||
int all;
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (sl == NULL)
|
||||
return;
|
||||
if (sl->sl_str) {
|
||||
if (all)
|
||||
for (i = 0; i < sl->sl_cur; i++)
|
||||
free(sl->sl_str[i]);
|
||||
free(sl->sl_str);
|
||||
}
|
||||
free(sl);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sl_find(): Find a name in the string list
|
||||
*/
|
||||
char *
|
||||
sl_find(sl, name)
|
||||
StringList *sl;
|
||||
char *name;
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < sl->sl_cur; i++)
|
||||
if (strcmp(sl->sl_str[i], name) == 0)
|
||||
return sl->sl_str[i];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
Reference in New Issue
Block a user