Add Socket Libraries.
Add Posix functions for porting compatibility. Fix compliance issues with ISO/IEC 9899:199409 New Functions: setenv(), fparseln(), GetFileNameFromPath(), rename(), realpath(), setprogname(), getprogname(), strlcat(), strlcpy(), strsep(), setitimer(), getitimer(), timegm(), getopt(), basename(), mkstemp(), ffs(), vsnprintf(), snprintf(), getpass(), usleep(), select(), writev(), strcasecmp(), getcwd(), chdir(), tcgetpgrp(), getpgrp(), gettimeofday(), bcopy(), git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12061 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
42
StdLib/PosixLib/Err/LibErr.inf
Normal file
42
StdLib/PosixLib/Err/LibErr.inf
Normal file
@@ -0,0 +1,42 @@
|
||||
## @file
|
||||
# Library used for supplying some POSIX routines.
|
||||
#
|
||||
# Copyright (c) 2011, Intel Corporation. All rights reserved. <BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010006
|
||||
BASE_NAME = LibErr
|
||||
FILE_GUID = FC1D4706-88FB-42b0-98B0-A4B2E607EBAA
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = LibErr|UEFI_APPLICATION UEFI_DRIVER
|
||||
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources.common]
|
||||
warn_err.c
|
||||
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
StdLib/StdLib.dec
|
||||
StdLibPrivateInternalFiles/DoNotUse.dec
|
||||
|
||||
[Libraries]
|
||||
LibC
|
||||
LibStdio
|
||||
LibStdLib
|
||||
LibString
|
99
StdLib/PosixLib/Err/warn_err.c
Normal file
99
StdLib/PosixLib/Err/warn_err.c
Normal file
@@ -0,0 +1,99 @@
|
||||
/** @file
|
||||
Implement the warning and error output messages.
|
||||
|
||||
Copyright (c) 2011, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
* Copyright (c) 1994 Michael L. Hitch
|
||||
* 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 Michael L. Hitch.
|
||||
* 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 <LibConfig.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static void
|
||||
_Vdomessage(int doerrno, const char *fmt, va_list args)
|
||||
{
|
||||
fprintf(stderr, "%s: ", getprogname());
|
||||
if (fmt) {
|
||||
vfprintf(stderr, fmt, args);
|
||||
fprintf(stderr, ": ");
|
||||
}
|
||||
if (doerrno && errno < EMAXERRORVAL) {
|
||||
fprintf(stderr, "%s", strerror(errno));
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
void
|
||||
err(int eval, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
_Vdomessage(1, fmt, ap);
|
||||
va_end(ap);
|
||||
exit(eval);
|
||||
}
|
||||
|
||||
void
|
||||
errx(int eval, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
_Vdomessage(0, fmt, ap);
|
||||
va_end(ap);
|
||||
exit(eval);
|
||||
}
|
||||
|
||||
void
|
||||
warn(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
_Vdomessage(1, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
warnx(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
_Vdomessage(0, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
41
StdLib/PosixLib/Gen/LibGen.inf
Normal file
41
StdLib/PosixLib/Gen/LibGen.inf
Normal file
@@ -0,0 +1,41 @@
|
||||
## @file
|
||||
# Library used for supplying glob POSIX routines.
|
||||
#
|
||||
# Copyright (c) 2011, Intel Corporation. All rights reserved. <BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010006
|
||||
BASE_NAME = LibGen
|
||||
FILE_GUID = CA599759-90A7-4fe4-BC8B-4B71C350DCAC
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = LibGen|UEFI_APPLICATION UEFI_DRIVER
|
||||
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources.common]
|
||||
dirname.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
StdLib/StdLib.dec
|
||||
StdLibPrivateInternalFiles/DoNotUse.dec
|
||||
|
||||
[Libraries]
|
||||
LibString
|
||||
LibStdLib
|
||||
|
||||
[Pcd]
|
88
StdLib/PosixLib/Gen/dirname.c
Normal file
88
StdLib/PosixLib/Gen/dirname.c
Normal file
@@ -0,0 +1,88 @@
|
||||
/** @file
|
||||
|
||||
* Copyright (c) 1997, 2002 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Klaus Klein and Jason R. Thorpe.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
|
||||
|
||||
NetBSD: dirname.c,v 1.10 2008/05/10 22:39:40 christos Exp
|
||||
*/
|
||||
#include <LibConfig.h>
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
//#include "namespace.h"
|
||||
//#include <libgen.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(dirname,_dirname)
|
||||
#endif
|
||||
|
||||
#if !HAVE_DIRNAME
|
||||
char *
|
||||
dirname(char *path)
|
||||
{
|
||||
static char singledot[] = ".";
|
||||
static char result[PATH_MAX];
|
||||
const char *lastp;
|
||||
size_t len;
|
||||
|
||||
/*
|
||||
* If `path' is a null pointer or points to an empty string,
|
||||
* return a pointer to the string ".".
|
||||
*/
|
||||
if ((path == NULL) || (*path == '\0'))
|
||||
return (singledot);
|
||||
|
||||
/* Strip trailing slashes, if any. */
|
||||
lastp = path + strlen(path) - 1;
|
||||
while (lastp != path && *lastp == '/')
|
||||
lastp--;
|
||||
|
||||
/* Terminate path at the last occurence of '/'. */
|
||||
do {
|
||||
if (*lastp == '/') {
|
||||
/* Strip trailing slashes, if any. */
|
||||
while (lastp != path && *lastp == '/')
|
||||
lastp--;
|
||||
|
||||
/* ...and copy the result into the result buffer. */
|
||||
len = (lastp - path) + 1 /* last char */;
|
||||
if (len > (PATH_MAX - 1))
|
||||
len = PATH_MAX - 1;
|
||||
|
||||
memcpy(result, path, len);
|
||||
result[len] = '\0';
|
||||
|
||||
return (result);
|
||||
}
|
||||
} while (--lastp >= path);
|
||||
|
||||
/* No /'s found, return a pointer to the string ".". */
|
||||
return (singledot);
|
||||
}
|
||||
#endif
|
135
StdLib/PosixLib/Glob/DirFunctions.c
Normal file
135
StdLib/PosixLib/Glob/DirFunctions.c
Normal file
@@ -0,0 +1,135 @@
|
||||
/** @file
|
||||
Implement the opendir, closedir, and readdir functions.
|
||||
|
||||
Copyright (c) 2011, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "internal.h"
|
||||
#include <Library/ShellLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
SHELL_FILE_HANDLE DirHandle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
struct dirent *DirentStructure;
|
||||
} DIR_STRUCTURE;
|
||||
|
||||
DIR * opendir(const char * AsciiFileName)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
DIR_STRUCTURE *DirStruct;
|
||||
CHAR16 *FileName;
|
||||
|
||||
DirStruct = (DIR_STRUCTURE*)AllocateZeroPool(sizeof(DIR_STRUCTURE));
|
||||
if (DirStruct == NULL) {
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FileName = (CHAR16*)AllocateZeroPool((1+AsciiStrLen(AsciiFileName))*sizeof(CHAR16));
|
||||
if (FileName == NULL) {
|
||||
FreePool(DirStruct);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
AsciiStrToUnicodeStr(AsciiFileName, FileName);
|
||||
|
||||
Status = ShellOpenFileByName(FileName, &DirStruct->DirHandle, EFI_FILE_MODE_READ, 0);
|
||||
FreePool(FileName);
|
||||
if (EFI_ERROR(Status)) {
|
||||
errno = ENOENT;
|
||||
FreePool(DirStruct);
|
||||
return NULL;
|
||||
}
|
||||
DirStruct->Signature = 0x08675309;
|
||||
return ((DIR*)DirStruct);
|
||||
}
|
||||
|
||||
int closedir(DIR * DirPointer)
|
||||
{
|
||||
DIR_STRUCTURE *DirStruct;
|
||||
|
||||
if (DirPointer == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
DirStruct = (DIR_STRUCTURE*)DirPointer;
|
||||
if (DirStruct->Signature != 0x08675309) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
ShellCloseFile(DirStruct->DirHandle);
|
||||
SHELL_FREE_NON_NULL(DirStruct->FileInfo);
|
||||
SHELL_FREE_NON_NULL(DirStruct->DirentStructure);
|
||||
SHELL_FREE_NON_NULL(DirStruct);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct dirent * readdir(DIR * DirPointer)
|
||||
{
|
||||
DIR_STRUCTURE *DirStruct;
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN NoFile;
|
||||
|
||||
NoFile = FALSE;
|
||||
|
||||
if (DirPointer == NULL) {
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DirStruct = (DIR_STRUCTURE*)DirPointer;
|
||||
if (DirStruct->Signature != 0x08675309) {
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (DirStruct->FileInfo == NULL) {
|
||||
Status = ShellFindFirstFile(DirStruct->DirHandle, &(DirStruct->FileInfo));
|
||||
} else {
|
||||
Status = ShellFindNextFile(DirStruct->DirHandle, DirStruct->FileInfo, &NoFile);
|
||||
}
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
errno = ENOENT;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (NoFile) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
SHELL_FREE_NON_NULL(DirStruct->DirentStructure);
|
||||
|
||||
DirStruct->DirentStructure = AllocateZeroPool(sizeof(DIR_STRUCTURE)+(StrSize(DirStruct->FileInfo->FileName)));
|
||||
if (DirStruct->DirentStructure == NULL) {
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
StrCpy(DirStruct->FileInfo->FileName, DirStruct->DirentStructure->FileName);
|
||||
|
||||
DirStruct->DirentStructure->FileSize = DirStruct->FileInfo->FileSize;
|
||||
DirStruct->DirentStructure->PhysicalSize = DirStruct->FileInfo->PhysicalSize;
|
||||
DirStruct->DirentStructure->Attribute = DirStruct->FileInfo->Attribute;
|
||||
DirStruct->DirentStructure->CreateTime.tv_sec = Efi2Time(&DirStruct->FileInfo->CreateTime);
|
||||
DirStruct->DirentStructure->CreateTime.tv_nsec = DirStruct->FileInfo->CreateTime.Nanosecond;
|
||||
DirStruct->DirentStructure->LastAccessTime.tv_nsec = Efi2Time(&DirStruct->FileInfo->LastAccessTime);
|
||||
DirStruct->DirentStructure->LastAccessTime.tv_sec = DirStruct->FileInfo->LastAccessTime.Nanosecond;
|
||||
DirStruct->DirentStructure->ModificationTime.tv_sec = Efi2Time(&DirStruct->FileInfo->ModificationTime);
|
||||
DirStruct->DirentStructure->ModificationTime.tv_nsec = DirStruct->FileInfo->ModificationTime.Nanosecond;
|
||||
DirStruct->DirentStructure->Size = StrSize(DirStruct->DirentStructure->FileName) + sizeof(DIR_STRUCTURE);
|
||||
|
||||
return (DirStruct->DirentStructure);
|
||||
}
|
47
StdLib/PosixLib/Glob/LibGlob.inf
Normal file
47
StdLib/PosixLib/Glob/LibGlob.inf
Normal file
@@ -0,0 +1,47 @@
|
||||
## @file
|
||||
# Library used for supplying glob POSIX routines.
|
||||
#
|
||||
# Copyright (c) 2011, Intel Corporation. All rights reserved. <BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010006
|
||||
BASE_NAME = LibGlob
|
||||
FILE_GUID = 1D57B5D5-BAB4-4d2b-B7EB-0EB41D7B189C
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = LibGlob|UEFI_APPLICATION UEFI_DRIVER
|
||||
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources.common]
|
||||
DirFunctions.c
|
||||
glob.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ShellPkg/ShellPkg.dec
|
||||
StdLib/StdLib.dec
|
||||
StdLibPrivateInternalFiles/DoNotUse.dec
|
||||
|
||||
[Libraries]
|
||||
MemoryAllocationLib
|
||||
ShellLib
|
||||
BaseLib
|
||||
LibStdio
|
||||
LibStdLib
|
||||
LibString
|
||||
|
||||
[Pcd]
|
1033
StdLib/PosixLib/Glob/glob.c
Normal file
1033
StdLib/PosixLib/Glob/glob.c
Normal file
File diff suppressed because it is too large
Load Diff
23
StdLib/PosixLib/Glob/internal.h
Normal file
23
StdLib/PosixLib/Glob/internal.h
Normal file
@@ -0,0 +1,23 @@
|
||||
/** @file
|
||||
Implement the invalid functions to return failures.
|
||||
|
||||
Copyright (c) 2011, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <errno.h>
|
||||
#include <dirent.h>
|
||||
#include <sysexits.h>
|
||||
|
||||
typedef VOID* DIR;
|
||||
|
||||
struct dirent * readdir(DIR *);
|
||||
int closedir(DIR *);
|
||||
DIR * opendir(const char *);
|
41
StdLib/PosixLib/Stringlist/LibStringlist.inf
Normal file
41
StdLib/PosixLib/Stringlist/LibStringlist.inf
Normal file
@@ -0,0 +1,41 @@
|
||||
## @file
|
||||
# Library used for supplying glob POSIX routines.
|
||||
#
|
||||
# Copyright (c) 2011, Intel Corporation. All rights reserved. <BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010006
|
||||
BASE_NAME = LibStringlist
|
||||
FILE_GUID = 19D17940-BA8D-4fa7-A704-F33D9FAFAB9D
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = LibStringlist|UEFI_APPLICATION UEFI_DRIVER
|
||||
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources.common]
|
||||
stringlist.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
StdLib/StdLib.dec
|
||||
StdLibPrivateInternalFiles/DoNotUse.dec
|
||||
|
||||
[Libraries]
|
||||
LibC
|
||||
LibStdio
|
||||
LibStdLib
|
||||
LibString
|
154
StdLib/PosixLib/Stringlist/stringlist.c
Normal file
154
StdLib/PosixLib/Stringlist/stringlist.c
Normal file
@@ -0,0 +1,154 @@
|
||||
/* $NetBSD: stringlist.c,v 1.13 2008/04/28 20:22:59 martin Exp $
|
||||
|
||||
* Copyright (c) 1994, 1999 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Christos Zoulas.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
|
||||
*/
|
||||
|
||||
#pragma warning ( disable : 4018 )
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: stringlist.c,v 1.13 2008/04/28 20:22:59 martin Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stringlist.h>
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(sl_add,_sl_add)
|
||||
__weak_alias(sl_find,_sl_find)
|
||||
__weak_alias(sl_free,_sl_free)
|
||||
__weak_alias(sl_init,_sl_init)
|
||||
__weak_alias(sl_delete,_sl_delete)
|
||||
#endif
|
||||
|
||||
#define _SL_CHUNKSIZE 20
|
||||
|
||||
/*
|
||||
* sl_init(): Initialize a string list
|
||||
*/
|
||||
StringList *
|
||||
sl_init(void)
|
||||
{
|
||||
StringList *sl;
|
||||
|
||||
sl = malloc(sizeof(StringList));
|
||||
if (sl == NULL)
|
||||
return NULL;
|
||||
|
||||
sl->sl_cur = 0;
|
||||
sl->sl_max = _SL_CHUNKSIZE;
|
||||
sl->sl_str = malloc(sl->sl_max * sizeof(char *));
|
||||
if (sl->sl_str == NULL) {
|
||||
free(sl);
|
||||
sl = NULL;
|
||||
}
|
||||
return sl;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sl_add(): Add an item to the string list
|
||||
*/
|
||||
int
|
||||
sl_add(StringList *sl, char *name)
|
||||
{
|
||||
|
||||
_DIAGASSERT(sl != NULL);
|
||||
|
||||
if (sl->sl_cur == sl->sl_max - 1) {
|
||||
char **new;
|
||||
|
||||
new = realloc(sl->sl_str,
|
||||
(sl->sl_max + _SL_CHUNKSIZE) * sizeof(char *));
|
||||
if (new == NULL)
|
||||
return -1;
|
||||
sl->sl_max += _SL_CHUNKSIZE;
|
||||
sl->sl_str = new;
|
||||
}
|
||||
sl->sl_str[sl->sl_cur++] = name;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sl_free(): Free a stringlist
|
||||
*/
|
||||
void
|
||||
sl_free(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(StringList *sl, const char *name)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
_DIAGASSERT(sl != NULL);
|
||||
|
||||
for (i = 0; i < sl->sl_cur; i++)
|
||||
if (strcmp(sl->sl_str[i], name) == 0)
|
||||
return sl->sl_str[i];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
sl_delete(StringList *sl, const char *name, int all)
|
||||
{
|
||||
size_t i, j;
|
||||
|
||||
for (i = 0; i < sl->sl_cur; i++)
|
||||
if (strcmp(sl->sl_str[i], name) == 0) {
|
||||
if (all)
|
||||
free(sl->sl_str[i]);
|
||||
for (j = i + 1; j < sl->sl_cur; j++)
|
||||
sl->sl_str[j - 1] = sl->sl_str[j];
|
||||
sl->sl_str[--sl->sl_cur] = NULL;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user