RedfishPkg: Apply uncrustify changes

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737

Apply uncrustify changes to .c/.h files in the RedfishPkg package

Cc: Andrew Fish <afish@apple.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Reviewed-by: Abner Chang <abner.chang@hpe.com>
This commit is contained in:
Michael Kubacki
2021-12-05 14:54:11 -08:00
committed by mergify[bot]
parent 5220bd211d
commit 39de741e2d
56 changed files with 6067 additions and 4616 deletions

View File

@@ -14,17 +14,20 @@
#include <Library/SortLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
int errno = 0;
char errnum_message [] = "We don't support to map errnum to the error message on edk2 Redfish\n";
int errno = 0;
char errnum_message[] = "We don't support to map errnum to the error message on edk2 Redfish\n";
// This is required to keep VC++ happy if you use floating-point
int _fltused = 1;
int _fltused = 1;
/**
Determine if a particular character is an alphanumeric character
@return Returns 1 if c is an alphanumeric character, otherwise returns 0.
**/
int isalnum (int c)
int
isalnum (
int c
)
{
//
// <alnum> ::= [0-9] | [a-z] | [A-Z]
@@ -39,7 +42,10 @@ int isalnum (int c)
@return Returns 1 if c is an digital character, otherwise returns 0.
**/
int isdchar (int c)
int
isdchar (
int c
)
{
//
// [0-9] | [e +-.]
@@ -55,7 +61,10 @@ int isdchar (int c)
@return Returns 1 if c is a space character
**/
int isspace (int c)
int
isspace (
int c
)
{
//
// <space> ::= [ ]
@@ -66,15 +75,21 @@ int isspace (int c)
/**
Allocates memory blocks
*/
void *malloc (size_t size)
void *
malloc (
size_t size
)
{
return AllocatePool ((UINTN) size);
return AllocatePool ((UINTN)size);
}
/**
De-allocates or frees a memory block
*/
void free (void *ptr)
void
free (
void *ptr
)
{
//
// In Standard C, free() handles a null pointer argument transparently. This
@@ -90,15 +105,20 @@ void free (void *ptr)
@return Returns the pointer to duplicated string.
**/
char * strdup(const char *str)
char *
strdup (
const char *str
)
{
size_t len;
char *copy;
size_t len;
char *copy;
len = strlen(str) + 1;
if ((copy = malloc(len)) == NULL)
len = strlen (str) + 1;
if ((copy = malloc (len)) == NULL) {
return (NULL);
memcpy(copy, str, len);
}
memcpy (copy, str, len);
return (copy);
}
@@ -115,13 +135,14 @@ char * strdup(const char *str)
returned unchanged.
**/
int
toupper(
IN int c
toupper (
IN int c
)
{
if ( (c >= 'a') && (c <= 'z') ) {
if ((c >= 'a') && (c <= 'z')) {
c = c - ('a' - 'A');
}
return c;
}
@@ -131,15 +152,18 @@ toupper(
@return Returns the value of digit.
**/
int
Digit2Val( int c)
Digit2Val (
int c
)
{
if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) { /* If c is one of [A-Za-z]... */
c = toupper(c) - 7; // Adjust so 'A' is ('9' + 1)
if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) {
/* If c is one of [A-Za-z]... */
c = toupper (c) - 7; // Adjust so 'A' is ('9' + 1)
}
return c - '0'; // Value returned is between 0 and 35, inclusive.
}
/** The strtoll function converts the initial portion of the string pointed to
by nptr to long long int representation.
@@ -152,9 +176,13 @@ Digit2Val( int c)
and the value of the macro ERANGE is stored in errno.
**/
long long
strtoll(const char * nptr, char ** endptr, int base)
strtoll (
const char *nptr,
char **endptr,
int base
)
{
const char *pEnd;
const char *pEnd;
long long Result = 0;
long long Previous;
int temp;
@@ -162,71 +190,86 @@ strtoll(const char * nptr, char ** endptr, int base)
pEnd = nptr;
if((base < 0) || (base == 1) || (base > 36)) {
if(endptr != NULL) {
*endptr = NULL;
if ((base < 0) || (base == 1) || (base > 36)) {
if (endptr != NULL) {
*endptr = NULL;
}
return 0;
}
// Skip leading spaces.
while(isspace(*nptr)) ++nptr;
// Process Subject sequence: optional sign followed by digits.
if(*nptr == '+') {
Negative = FALSE;
// Skip leading spaces.
while (isspace (*nptr)) {
++nptr;
}
else if(*nptr == '-') {
// Process Subject sequence: optional sign followed by digits.
if (*nptr == '+') {
Negative = FALSE;
++nptr;
} else if (*nptr == '-') {
Negative = TRUE;
++nptr;
}
if(*nptr == '0') { /* Might be Octal or Hex */
if(toupper(nptr[1]) == 'X') { /* Looks like Hex */
if((base == 0) || (base == 16)) {
if (*nptr == '0') {
/* Might be Octal or Hex */
if (toupper (nptr[1]) == 'X') {
/* Looks like Hex */
if ((base == 0) || (base == 16)) {
nptr += 2; /* Skip the "0X" */
base = 16; /* In case base was 0 */
base = 16; /* In case base was 0 */
}
}
else { /* Looks like Octal */
if((base == 0) || (base == 8)) {
} else {
/* Looks like Octal */
if ((base == 0) || (base == 8)) {
++nptr; /* Skip the leading "0" */
base = 8; /* In case base was 0 */
}
}
}
if(base == 0) { /* If still zero then must be decimal */
if (base == 0) {
/* If still zero then must be decimal */
base = 10;
}
if(*nptr == '0') {
for( ; *nptr == '0'; ++nptr); /* Skip any remaining leading zeros */
if (*nptr == '0') {
for ( ; *nptr == '0'; ++nptr) {
/* Skip any remaining leading zeros */
}
pEnd = nptr;
}
while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
while ( isalnum (*nptr) && ((temp = Digit2Val (*nptr)) < base)) {
Previous = Result;
Result = MultS64x64 (Result, base) + (long long int)temp;
if( Result <= Previous) { // Detect Overflow
if(Negative) {
Result = MultS64x64 (Result, base) + (long long int)temp;
if ( Result <= Previous) {
// Detect Overflow
if (Negative) {
Result = LLONG_MIN;
}
else {
} else {
Result = LLONG_MAX;
}
Negative = FALSE;
errno = ERANGE;
errno = ERANGE;
break;
}
pEnd = ++nptr;
}
if(Negative) {
if (Negative) {
Result = -Result;
}
// Save pointer to final sequence
if(endptr != NULL) {
if (endptr != NULL) {
*endptr = (char *)pEnd;
}
return Result;
}
@@ -285,9 +328,13 @@ strtoll(const char * nptr, char ** endptr, int base)
is stored in errno.
**/
long
strtol(const char * nptr, char ** endptr, int base)
strtol (
const char *nptr,
char **endptr,
int base
)
{
const char *pEnd;
const char *pEnd;
long Result = 0;
long Previous;
int temp;
@@ -295,71 +342,86 @@ strtol(const char * nptr, char ** endptr, int base)
pEnd = nptr;
if((base < 0) || (base == 1) || (base > 36)) {
if(endptr != NULL) {
*endptr = NULL;
if ((base < 0) || (base == 1) || (base > 36)) {
if (endptr != NULL) {
*endptr = NULL;
}
return 0;
}
// Skip leading spaces.
while(isspace(*nptr)) ++nptr;
// Process Subject sequence: optional sign followed by digits.
if(*nptr == '+') {
Negative = FALSE;
// Skip leading spaces.
while (isspace (*nptr)) {
++nptr;
}
else if(*nptr == '-') {
// Process Subject sequence: optional sign followed by digits.
if (*nptr == '+') {
Negative = FALSE;
++nptr;
} else if (*nptr == '-') {
Negative = TRUE;
++nptr;
}
if(*nptr == '0') { /* Might be Octal or Hex */
if(toupper(nptr[1]) == 'X') { /* Looks like Hex */
if((base == 0) || (base == 16)) {
if (*nptr == '0') {
/* Might be Octal or Hex */
if (toupper (nptr[1]) == 'X') {
/* Looks like Hex */
if ((base == 0) || (base == 16)) {
nptr += 2; /* Skip the "0X" */
base = 16; /* In case base was 0 */
base = 16; /* In case base was 0 */
}
}
else { /* Looks like Octal */
if((base == 0) || (base == 8)) {
} else {
/* Looks like Octal */
if ((base == 0) || (base == 8)) {
++nptr; /* Skip the leading "0" */
base = 8; /* In case base was 0 */
}
}
}
if(base == 0) { /* If still zero then must be decimal */
if (base == 0) {
/* If still zero then must be decimal */
base = 10;
}
if(*nptr == '0') {
for( ; *nptr == '0'; ++nptr); /* Skip any remaining leading zeros */
if (*nptr == '0') {
for ( ; *nptr == '0'; ++nptr) {
/* Skip any remaining leading zeros */
}
pEnd = nptr;
}
while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
while ( isalnum (*nptr) && ((temp = Digit2Val (*nptr)) < base)) {
Previous = Result;
Result = (Result * base) + (long int)temp;
if( Result <= Previous) { // Detect Overflow
if(Negative) {
Result = (Result * base) + (long int)temp;
if ( Result <= Previous) {
// Detect Overflow
if (Negative) {
Result = LONG_MIN;
}
else {
} else {
Result = LONG_MAX;
}
Negative = FALSE;
errno = ERANGE;
errno = ERANGE;
break;
}
pEnd = ++nptr;
}
if(Negative) {
if (Negative) {
Result = -Result;
}
// Save pointer to final sequence
if(endptr != NULL) {
if (endptr != NULL) {
*endptr = (char *)pEnd;
}
return Result;
}
@@ -374,66 +436,85 @@ strtol(const char * nptr, char ** endptr, int base)
returned and the value of the macro ERANGE is stored in errno.
**/
unsigned long long
strtoull(const char * nptr, char ** endptr, int base)
strtoull (
const char *nptr,
char **endptr,
int base
)
{
const char *pEnd;
unsigned long long Result = 0;
unsigned long long Previous;
int temp;
const char *pEnd;
unsigned long long Result = 0;
unsigned long long Previous;
int temp;
pEnd = nptr;
if((base < 0) || (base == 1) || (base > 36)) {
if(endptr != NULL) {
*endptr = NULL;
if ((base < 0) || (base == 1) || (base > 36)) {
if (endptr != NULL) {
*endptr = NULL;
}
return 0;
}
// Skip leading spaces.
while(isspace(*nptr)) ++nptr;
// Process Subject sequence: optional + sign followed by digits.
if(*nptr == '+') {
// Skip leading spaces.
while (isspace (*nptr)) {
++nptr;
}
if(*nptr == '0') { /* Might be Octal or Hex */
if(toupper(nptr[1]) == 'X') { /* Looks like Hex */
if((base == 0) || (base == 16)) {
// Process Subject sequence: optional + sign followed by digits.
if (*nptr == '+') {
++nptr;
}
if (*nptr == '0') {
/* Might be Octal or Hex */
if (toupper (nptr[1]) == 'X') {
/* Looks like Hex */
if ((base == 0) || (base == 16)) {
nptr += 2; /* Skip the "0X" */
base = 16; /* In case base was 0 */
base = 16; /* In case base was 0 */
}
}
else { /* Looks like Octal */
if((base == 0) || (base == 8)) {
} else {
/* Looks like Octal */
if ((base == 0) || (base == 8)) {
++nptr; /* Skip the leading "0" */
base = 8; /* In case base was 0 */
}
}
}
if(base == 0) { /* If still zero then must be decimal */
if (base == 0) {
/* If still zero then must be decimal */
base = 10;
}
if(*nptr == '0') {
for( ; *nptr == '0'; ++nptr); /* Skip any remaining leading zeros */
if (*nptr == '0') {
for ( ; *nptr == '0'; ++nptr) {
/* Skip any remaining leading zeros */
}
pEnd = nptr;
}
while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
while ( isalnum (*nptr) && ((temp = Digit2Val (*nptr)) < base)) {
Previous = Result;
Result = DivU64x32 (Result, base) + (unsigned long long)temp;
if( Result < Previous) { // If we overflowed
Result = DivU64x32 (Result, base) + (unsigned long long)temp;
if ( Result < Previous) {
// If we overflowed
Result = ULLONG_MAX;
errno = ERANGE;
errno = ERANGE;
break;
}
pEnd = ++nptr;
}
// Save pointer to final sequence
if(endptr != NULL) {
if (endptr != NULL) {
*endptr = (char *)pEnd;
}
return Result;
}
@@ -462,27 +543,34 @@ strtoull(const char * nptr, char ** endptr, int base)
@return Return 0.
**/
double
strtod (const char * __restrict nptr, char ** __restrict endptr) {
DEBUG((DEBUG_INFO, "We don't supprot double type on edk2 yet!"));
ASSERT(FALSE);
return (double)0;
strtod (
const char *__restrict nptr,
char **__restrict endptr
)
{
DEBUG ((DEBUG_INFO, "We don't supprot double type on edk2 yet!"));
ASSERT (FALSE);
return (double)0;
}
static UINT8 BitMask[] = {
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
};
};
#define WHICH8(c) ((unsigned char)(c) >> 3)
#define WHICH_BIT(c) (BitMask[((c) & 0x7)])
#define BITMAP64 ((UINT64 *)bitmap)
#define BITMAP64 ((UINT64 *)bitmap)
static
void
BuildBitmap(unsigned char * bitmap, const char *s2, int n)
BuildBitmap (
unsigned char *bitmap,
const char *s2,
int n
)
{
unsigned char bit;
int index;
unsigned char bit;
int index;
// Initialize bitmap. Bit 0 is always 1 which corresponds to '\0'
for (BITMAP64[0] = index = 1; index < n; index++) {
@@ -490,9 +578,9 @@ BuildBitmap(unsigned char * bitmap, const char *s2, int n)
}
// Set bits in bitmap corresponding to the characters in s2
for (; *s2 != '\0'; s2++) {
index = WHICH8(*s2);
bit = WHICH_BIT(*s2);
for ( ; *s2 != '\0'; s2++) {
index = WHICH8 (*s2);
bit = WHICH_BIT (*s2);
bitmap[index] = bitmap[index] | bit;
}
}
@@ -504,21 +592,25 @@ BuildBitmap(unsigned char * bitmap, const char *s2, int n)
null pointer if no character from s2 occurs in s1.
**/
char *
strpbrk(const char *s1, const char *s2)
strpbrk (
const char *s1,
const char *s2
)
{
UINT8 bitmap[ (((UCHAR_MAX + 1) / CHAR_BIT) + (CHAR_BIT - 1)) & ~7U];
UINT8 bit;
int index;
UINT8 bitmap[(((UCHAR_MAX + 1) / CHAR_BIT) + (CHAR_BIT - 1)) & ~7U];
UINT8 bit;
int index;
BuildBitmap( bitmap, s2, sizeof(bitmap) / sizeof(UINT64));
BuildBitmap (bitmap, s2, sizeof (bitmap) / sizeof (UINT64));
for( ; *s1 != '\0'; ++s1) {
index = WHICH8(*s1);
bit = WHICH_BIT(*s1);
if( (bitmap[index] & bit) != 0) {
for ( ; *s1 != '\0'; ++s1) {
index = WHICH8 (*s1);
bit = WHICH_BIT (*s1);
if ((bitmap[index] & bit) != 0) {
return (char *)s1;
}
}
return NULL;
}
@@ -535,7 +627,9 @@ strpbrk(const char *s1, const char *s2)
a subsequent call to the strerror function.
**/
char *
strerror(int errnum)
strerror (
int errnum
)
{
return errnum_message;
}
@@ -544,20 +638,24 @@ strerror(int errnum)
Allocate and zero-initialize array.
**/
void *
calloc(size_t Num, size_t Size)
calloc (
size_t Num,
size_t Size
)
{
void *RetVal;
size_t NumSize;
void *RetVal;
size_t NumSize;
NumSize = Num * Size;
RetVal = NULL;
if (NumSize != 0) {
RetVal = malloc(NumSize);
if( RetVal != NULL) {
(VOID)ZeroMem( RetVal, NumSize);
RetVal = malloc (NumSize);
if ( RetVal != NULL) {
(VOID)ZeroMem (RetVal, NumSize);
}
}
}
DEBUG((DEBUG_POOL, "0x%p = calloc(%d, %d)\n", RetVal, Num, Size));
DEBUG ((DEBUG_POOL, "0x%p = calloc(%d, %d)\n", RetVal, Num, Size));
return RetVal;
}
@@ -567,7 +665,7 @@ calloc(size_t Num, size_t Size)
// month number used as the index (1 -> 12) for regular and leap years.
// The value at index 13 is for the whole year.
//
UINTN CumulativeDays[2][14] = {
UINTN CumulativeDays[2][14] = {
{
0,
0,
@@ -602,15 +700,18 @@ UINTN CumulativeDays[2][14] = {
}
};
#define IsLeap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
#define SECSPERMIN (60)
#define SECSPERHOUR (60 * 60)
#define SECSPERDAY (24 * SECSPERHOUR)
#define IsLeap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
#define SECSPERMIN (60)
#define SECSPERHOUR (60 * 60)
#define SECSPERDAY (24 * SECSPERHOUR)
/**
Get the system time as seconds elapsed since midnight, January 1, 1970.
**/
time_t time (time_t *timer)
time_t
time (
time_t *timer
)
{
EFI_TIME Time;
time_t CalTime;
@@ -626,7 +727,7 @@ time_t time (time_t *timer)
// UTime should now be set to 00:00:00 on Jan 1 of the current year.
//
for (Year = 1970, CalTime = 0; Year != Time.Year; Year++) {
CalTime = CalTime + (time_t)(CumulativeDays[IsLeap(Year)][13] * SECSPERDAY);
CalTime = CalTime + (time_t)(CumulativeDays[IsLeap (Year)][13] * SECSPERDAY);
}
//
@@ -634,7 +735,7 @@ time_t time (time_t *timer)
//
CalTime = CalTime +
(time_t)((Time.TimeZone != EFI_UNSPECIFIED_TIMEZONE) ? (Time.TimeZone * 60) : 0) +
(time_t)(CumulativeDays[IsLeap(Time.Year)][Time.Month] * SECSPERDAY) +
(time_t)(CumulativeDays[IsLeap (Time.Year)][Time.Month] * SECSPERDAY) +
(time_t)(((Time.Day > 0) ? Time.Day - 1 : 0) * SECSPERDAY) +
(time_t)(Time.Hour * SECSPERHOUR) +
(time_t)(Time.Minute * 60) +
@@ -650,9 +751,14 @@ time_t time (time_t *timer)
/**
Performs a quick sort
**/
void qsort (void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
void
qsort (
void *base,
size_t num,
size_t width,
int ( *compare )(const void *, const void *)
)
{
ASSERT (base != NULL);
ASSERT (compare != NULL);
@@ -666,54 +772,93 @@ void qsort (void *base, size_t num, size_t width, int (*compare)(const void *, c
@return Returns the character currently pointed by the internal file position indicator of the specified stream
**/
int fgetc(FILE * _File){
return EOF;
int
fgetc (
FILE *_File
)
{
return EOF;
}
/**
Open stream file, we don't support file operastion on edk2 JSON library.
@return 0 Unsupported
**/
FILE *fopen (const char *filename, const char *mode) {
FILE *
fopen (
const char *filename,
const char *mode
)
{
return NULL;
}
/**
Read stream from file, we don't support file operastion on edk2 JSON library.
@return 0 Unsupported
**/
size_t fread (void * ptr, size_t size, size_t count, FILE * stream) {
size_t
fread (
void *ptr,
size_t size,
size_t count,
FILE *stream
)
{
return 0;
}
/**
Write stream from file, we don't support file operastion on edk2 JSON library.
@return 0 Unsupported
**/
size_t fwrite (const void * ptr, size_t size, size_t count, FILE * stream) {
size_t
fwrite (
const void *ptr,
size_t size,
size_t count,
FILE *stream
)
{
return 0;
}
/**
Close file, we don't support file operastion on edk2 JSON library.
@return 0 Unsupported
**/
int fclose (FILE * stream) {
int
fclose (
FILE *stream
)
{
return EOF;
}
/**
Write the formatted string to file, we don't support file operastion on edk2 JSON library.
@return 0 Unsupported
**/
int fprintf (FILE * stream, const char * format, ...) {
int
fprintf (
FILE *stream,
const char *format,
...
)
{
return -1;
}
/**
This function check if this is the formating string specifier.
@@ -730,12 +875,12 @@ int fprintf (FILE * stream, const char * format, ...) {
**/
BOOLEAN
CheckFormatingString (
IN CONST CHAR8 *FormatString,
IN OUT UINTN *CurrentPosition,
IN UINTN StrLength
IN CONST CHAR8 *FormatString,
IN OUT UINTN *CurrentPosition,
IN UINTN StrLength
)
{
CHAR8 FormatStringParamater;
CHAR8 FormatStringParamater;
while (*(FormatString + *CurrentPosition) != 's') {
//
@@ -749,14 +894,17 @@ CheckFormatingString (
(FormatStringParamater != '*') &&
(FormatStringParamater != '.') &&
!(((UINTN)FormatStringParamater >= (UINTN)'0') && ((UINTN)FormatStringParamater <= (UINTN)'9'))
) {
)
{
return FALSE;
}
(*CurrentPosition)++;
if (*CurrentPosition >= StrLength) {
return FALSE;
}
};
}
return TRUE;
}
@@ -772,15 +920,15 @@ CheckFormatingString (
**/
CHAR8 *
ReplaceUnicodeToAsciiStrFormat (
IN CONST CHAR8 *FormatString
)
IN CONST CHAR8 *FormatString
)
{
UINTN FormatStrSize;
UINTN FormatStrIndex;
UINTN FormatStrSpecifier;
BOOLEAN PercentageMark;
CHAR8 *TempFormatBuffer;
BOOLEAN IsFormatString;
UINTN FormatStrSize;
UINTN FormatStrIndex;
UINTN FormatStrSpecifier;
BOOLEAN PercentageMark;
CHAR8 *TempFormatBuffer;
BOOLEAN IsFormatString;
//
// Error checking.
@@ -788,15 +936,18 @@ ReplaceUnicodeToAsciiStrFormat (
if (FormatString == NULL) {
return NULL;
}
FormatStrSize = AsciiStrSize(FormatString);
FormatStrSize = AsciiStrSize (FormatString);
if (FormatStrSize == 0) {
return NULL;
}
TempFormatBuffer = AllocatePool(FormatStrSize); // Allocate memory for the
// new string.
if (TempFormatBuffer== NULL) {
TempFormatBuffer = AllocatePool (FormatStrSize); // Allocate memory for the
// new string.
if (TempFormatBuffer == NULL) {
return NULL;
}
//
// Clone *FormatString but replace "%s" wih "%a".
// "%%" is not considered as the format tag.
@@ -809,18 +960,21 @@ ReplaceUnicodeToAsciiStrFormat (
// Previous character is "%".
//
PercentageMark = FALSE;
if (*(FormatString + FormatStrIndex) != '%') { // Check if this is double "%".
if (*(FormatString + FormatStrIndex) != '%') {
// Check if this is double "%".
FormatStrSpecifier = FormatStrIndex;
//
// Check if this is the formating string specifier.
//
IsFormatString = CheckFormatingString (FormatString, &FormatStrSpecifier, FormatStrSize);
if ((FormatStrSpecifier - FormatStrIndex) != 0) {
CopyMem((VOID *)(TempFormatBuffer + FormatStrIndex),
(VOID *)(FormatString + FormatStrIndex),
FormatStrSpecifier - FormatStrIndex
);
CopyMem (
(VOID *)(TempFormatBuffer + FormatStrIndex),
(VOID *)(FormatString + FormatStrIndex),
FormatStrSpecifier - FormatStrIndex
);
}
FormatStrIndex = FormatStrSpecifier;
if (IsFormatString == TRUE) {
//
@@ -828,18 +982,22 @@ ReplaceUnicodeToAsciiStrFormat (
// format on edk2 environment.
//
*(TempFormatBuffer + FormatStrSpecifier) = 'a';
FormatStrIndex ++;
FormatStrIndex++;
}
continue;
}
goto ContinueCheck;
}
if (*(FormatString + FormatStrIndex) == '%') {
//
// This character is "%", set the flag.
//
PercentageMark = TRUE;
}
ContinueCheck:
//
// Clone character to the new string and advance FormatStrIndex
@@ -847,7 +1005,8 @@ ContinueCheck:
//
*(TempFormatBuffer + FormatStrIndex) = *(FormatString + FormatStrIndex);
FormatStrIndex++;
};
}
return TempFormatBuffer;
}
@@ -870,14 +1029,14 @@ ContinueCheck:
UINTN
EFIAPI
RedfishAsciiVSPrint (
OUT CHAR8 *StartOfBuffer,
IN UINTN BufferSize,
IN CONST CHAR8 *FormatString,
IN VA_LIST Marker
OUT CHAR8 *StartOfBuffer,
IN UINTN BufferSize,
IN CONST CHAR8 *FormatString,
IN VA_LIST Marker
)
{
CHAR8 *TempFormatBuffer;
UINTN LenStrProduced;
CHAR8 *TempFormatBuffer;
UINTN LenStrProduced;
//
// Looking for "%s" in the format string and replace it
@@ -888,6 +1047,7 @@ RedfishAsciiVSPrint (
if (TempFormatBuffer == NULL) {
return 0;
}
LenStrProduced = AsciiVSPrint (StartOfBuffer, BufferSize, (CONST CHAR8 *)TempFormatBuffer, Marker);
FreePool (TempFormatBuffer);
return LenStrProduced;
@@ -919,11 +1079,10 @@ RedfishAsciiSPrint (
...
)
{
VA_LIST Marker;
UINTN LenStrProduced;
VA_LIST Marker;
UINTN LenStrProduced;
VA_START(Marker, FormatString);
VA_START (Marker, FormatString);
LenStrProduced = RedfishAsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
return LenStrProduced;
}

View File

@@ -27,7 +27,7 @@
REDFISH_SERVICE
EFIAPI
RedfishCreateService (
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo
)
{
REDFISH_SERVICE RedfishService;
@@ -69,7 +69,8 @@ ON_EXIT:
if (UserId != NULL) {
FreePool (UserId);
}
if (Password!= NULL) {
if (Password != NULL) {
FreePool (Password);
}
@@ -85,7 +86,7 @@ ON_EXIT:
VOID
EFIAPI
RedfishCleanupService (
IN REDFISH_SERVICE RedfishService
IN REDFISH_SERVICE RedfishService
)
{
if (RedfishService == NULL) {
@@ -94,6 +95,7 @@ RedfishCleanupService (
cleanupServiceEnumerator (RedfishService);
}
/**
Create REDFISH_PAYLOAD instance in local with JSON represented resource value and
the Redfish Service.
@@ -112,11 +114,11 @@ RedfishCleanupService (
REDFISH_PAYLOAD
EFIAPI
RedfishCreatePayload (
IN EDKII_JSON_VALUE Value,
IN REDFISH_SERVICE RedfishService
IN EDKII_JSON_VALUE Value,
IN REDFISH_SERVICE RedfishService
)
{
EDKII_JSON_VALUE CopyValue;
EDKII_JSON_VALUE CopyValue;
CopyValue = JsonValueClone (Value);
return createRedfishPayload (CopyValue, RedfishService);
@@ -131,14 +133,14 @@ RedfishCreatePayload (
VOID
EFIAPI
RedfishCleanupPayload (
IN REDFISH_PAYLOAD Payload
IN REDFISH_PAYLOAD Payload
)
{
if (Payload == NULL) {
return;
}
cleanupPayload ((redfishPayload *) Payload);
cleanupPayload ((redfishPayload *)Payload);
}
/**
@@ -155,14 +157,14 @@ RedfishCleanupPayload (
EDKII_JSON_VALUE
EFIAPI
RedfishJsonInPayload (
IN REDFISH_PAYLOAD Payload
IN REDFISH_PAYLOAD Payload
)
{
if (Payload == NULL) {
return NULL;
}
return ((redfishPayload*)Payload)->json;
return ((redfishPayload *)Payload)->json;
}
/**
@@ -187,15 +189,15 @@ RedfishJsonInPayload (
CHAR8 *
EFIAPI
RedfishBuildPathWithSystemUuid (
IN CONST CHAR8 *RedPath,
IN BOOLEAN FromSmbios,
IN CHAR8 *IdString OPTIONAL
IN CONST CHAR8 *RedPath,
IN BOOLEAN FromSmbios,
IN CHAR8 *IdString OPTIONAL
)
{
UINTN BufSize;
CHAR8* RetRedPath;
EFI_GUID SystemUuid;
EFI_STATUS Status;
UINTN BufSize;
CHAR8 *RetRedPath;
EFI_GUID SystemUuid;
EFI_STATUS Status;
if (RedPath == NULL) {
return NULL;
@@ -205,10 +207,11 @@ RedfishBuildPathWithSystemUuid (
// Find system UUID from SMBIOS table.
//
if (FromSmbios) {
Status = NetLibGetSystemGuid(&SystemUuid);
Status = NetLibGetSystemGuid (&SystemUuid);
if (EFI_ERROR (Status)) {
return NULL;
}
// AsciiStrLen ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") = 36
BufSize = AsciiStrSize (RedPath) + AsciiStrLen ("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
} else {
@@ -219,13 +222,16 @@ RedfishBuildPathWithSystemUuid (
if (RetRedPath == NULL) {
return NULL;
}
if (FromSmbios) {
AsciiSPrint (RetRedPath, BufSize, RedPath, &SystemUuid);
} else {
AsciiSPrint (RetRedPath, BufSize, RedPath, IdString);
}
return RetRedPath;
}
/**
Get a redfish response addressed by a RedPath string, including HTTP StatusCode, Headers
and Payload which record any HTTP response messages.
@@ -252,24 +258,24 @@ RedfishBuildPathWithSystemUuid (
EFI_STATUS
EFIAPI
RedfishGetByService (
IN REDFISH_SERVICE RedfishService,
IN CONST CHAR8 *RedPath,
OUT REDFISH_RESPONSE *RedResponse
IN REDFISH_SERVICE RedfishService,
IN CONST CHAR8 *RedPath,
OUT REDFISH_RESPONSE *RedResponse
)
{
if (RedfishService == NULL || RedPath == NULL || RedResponse == NULL) {
if ((RedfishService == NULL) || (RedPath == NULL) || (RedResponse == NULL)) {
return EFI_INVALID_PARAMETER;
}
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
RedResponse->Payload = (REDFISH_PAYLOAD) getPayloadByPath (RedfishService, RedPath, &(RedResponse->StatusCode));
RedResponse->Payload = (REDFISH_PAYLOAD)getPayloadByPath (RedfishService, RedPath, &(RedResponse->StatusCode));
//
// 1. If the returned Payload is NULL, indicates any error happen.
// 2. If the returned StatusCode is NULL, indicates any error happen.
//
if (RedResponse->Payload == NULL || RedResponse->StatusCode == NULL) {
if ((RedResponse->Payload == NULL) || (RedResponse->StatusCode == NULL)) {
return EFI_DEVICE_ERROR;
}
@@ -278,13 +284,15 @@ RedfishGetByService (
// NOTE: If there is any error message returned from server, it will be returned in
// Payload within RedResponse.
//
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
{
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}
/**
Get a redfish response addressed by URI, including HTTP StatusCode, Headers
and Payload which record any HTTP response messages.
@@ -310,27 +318,27 @@ RedfishGetByService (
EFI_STATUS
EFIAPI
RedfishGetByUri (
IN REDFISH_SERVICE RedfishService,
IN CONST CHAR8 *Uri,
OUT REDFISH_RESPONSE *RedResponse
IN REDFISH_SERVICE RedfishService,
IN CONST CHAR8 *Uri,
OUT REDFISH_RESPONSE *RedResponse
)
{
EDKII_JSON_VALUE JsonValue;
EDKII_JSON_VALUE JsonValue;
if (RedfishService == NULL || Uri == NULL || RedResponse == NULL) {
if ((RedfishService == NULL) || (Uri == NULL) || (RedResponse == NULL)) {
return EFI_INVALID_PARAMETER;
}
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
JsonValue = getUriFromService (RedfishService, Uri, &RedResponse->StatusCode);
RedResponse->Payload = createRedfishPayload(JsonValue, RedfishService);
JsonValue = getUriFromService (RedfishService, Uri, &RedResponse->StatusCode);
RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
//
// 1. If the returned Payload is NULL, indicates any error happen.
// 2. If the returned StatusCode is NULL, indicates any error happen.
//
if (RedResponse->Payload == NULL || RedResponse->StatusCode == NULL) {
if ((RedResponse->Payload == NULL) || (RedResponse->StatusCode == NULL)) {
return EFI_DEVICE_ERROR;
}
@@ -339,12 +347,15 @@ RedfishGetByUri (
// NOTE: If there is any error message returned from server, it will be returned in
// Payload within RedResponse.
//
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
{
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}
/**
Get a redfish response addressed by the input Payload and relative RedPath string,
including HTTP StatusCode, Headers and Payload which record any HTTP response messages.
@@ -374,18 +385,18 @@ RedfishGetByUri (
EFI_STATUS
EFIAPI
RedfishGetByPayload (
IN REDFISH_PAYLOAD Payload,
IN CONST CHAR8 *RedPath,
OUT REDFISH_RESPONSE *RedResponse
IN REDFISH_PAYLOAD Payload,
IN CONST CHAR8 *RedPath,
OUT REDFISH_RESPONSE *RedResponse
)
{
if (Payload == NULL || RedPath == NULL || RedResponse == NULL) {
if ((Payload == NULL) || (RedPath == NULL) || (RedResponse == NULL)) {
return EFI_INVALID_PARAMETER;
}
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
RedResponse->Payload = (REDFISH_PAYLOAD) getPayloadForPathString (Payload, RedPath, &(RedResponse->StatusCode));
RedResponse->Payload = (REDFISH_PAYLOAD)getPayloadForPathString (Payload, RedPath, &(RedResponse->StatusCode));
//
// 1. If the returned Payload is NULL, indicates any error happen.
@@ -400,15 +411,17 @@ RedfishGetByPayload (
// NOTE: If there is any error message returned from server, it will be returned in
// Payload within RedResponse.
//
if (RedResponse->StatusCode != NULL && \
(*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT
)) {
if ((RedResponse->StatusCode != NULL) && \
((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)
))
{
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}
/**
Use HTTP PATCH to perform updates on pre-existing Redfish resource.
@@ -442,30 +455,30 @@ RedfishGetByPayload (
EFI_STATUS
EFIAPI
RedfishPatchToUri (
IN REDFISH_SERVICE RedfishService,
IN CONST CHAR8 *Uri,
IN CONST CHAR8 *Content,
OUT REDFISH_RESPONSE *RedResponse
IN REDFISH_SERVICE RedfishService,
IN CONST CHAR8 *Uri,
IN CONST CHAR8 *Content,
OUT REDFISH_RESPONSE *RedResponse
)
{
EFI_STATUS Status;
EDKII_JSON_VALUE JsonValue;
EFI_STATUS Status;
EDKII_JSON_VALUE JsonValue;
Status = EFI_SUCCESS;
JsonValue = NULL;
if (RedfishService == NULL || Uri == NULL || Content == NULL || RedResponse == NULL) {
if ((RedfishService == NULL) || (Uri == NULL) || (Content == NULL) || (RedResponse == NULL)) {
return EFI_INVALID_PARAMETER;
}
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
JsonValue = (EDKII_JSON_VALUE) patchUriFromService (
RedfishService,
Uri,
Content,
&(RedResponse->StatusCode)
);
JsonValue = (EDKII_JSON_VALUE)patchUriFromService (
RedfishService,
Uri,
Content,
&(RedResponse->StatusCode)
);
//
// 1. If the returned StatusCode is NULL, indicates any error happen.
@@ -480,8 +493,9 @@ RedfishPatchToUri (
// NOTE: If there is any error message returned from server, it will be returned in
// Payload within RedResponse.
//
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
{
Status = EFI_DEVICE_ERROR;
}
@@ -499,6 +513,7 @@ ON_EXIT:
return Status;
}
/**
Use HTTP PATCH to perform updates on target payload. Patch to odata.id in Payload directly.
@@ -530,22 +545,22 @@ ON_EXIT:
EFI_STATUS
EFIAPI
RedfishPatchToPayload (
IN REDFISH_PAYLOAD Target,
IN REDFISH_PAYLOAD Payload,
OUT REDFISH_RESPONSE *RedResponse
IN REDFISH_PAYLOAD Target,
IN REDFISH_PAYLOAD Payload,
OUT REDFISH_RESPONSE *RedResponse
)
{
if (Target == NULL || Payload == NULL || RedResponse == NULL) {
if ((Target == NULL) || (Payload == NULL) || (RedResponse == NULL)) {
return EFI_INVALID_PARAMETER;
}
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
RedResponse->Payload = (REDFISH_PAYLOAD) patchPayload (
Target,
Payload,
&(RedResponse->StatusCode)
);
RedResponse->Payload = (REDFISH_PAYLOAD)patchPayload (
Target,
Payload,
&(RedResponse->StatusCode)
);
//
// 1. If the returned StatusCode is NULL, indicates any error happen.
@@ -559,13 +574,15 @@ RedfishPatchToPayload (
// NOTE: If there is any error message returned from server, it will be returned in
// Payload within RedResponse.
//
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
{
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}
/**
Use HTTP POST to create a new resource in target payload.
@@ -596,22 +613,22 @@ RedfishPatchToPayload (
EFI_STATUS
EFIAPI
RedfishPostToPayload (
IN REDFISH_PAYLOAD Target,
IN REDFISH_PAYLOAD Payload,
OUT REDFISH_RESPONSE *RedResponse
IN REDFISH_PAYLOAD Target,
IN REDFISH_PAYLOAD Payload,
OUT REDFISH_RESPONSE *RedResponse
)
{
if (Target == NULL || Payload == NULL || RedResponse == NULL) {
if ((Target == NULL) || (Payload == NULL) || (RedResponse == NULL)) {
return EFI_INVALID_PARAMETER;
}
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
RedResponse->Payload = (REDFISH_PAYLOAD) postPayload (
Target,
Payload,
&(RedResponse->StatusCode)
);
RedResponse->Payload = (REDFISH_PAYLOAD)postPayload (
Target,
Payload,
&(RedResponse->StatusCode)
);
//
// 1. If the returned StatusCode is NULL, indicates any error happen.
@@ -625,13 +642,15 @@ RedfishPostToPayload (
// NOTE: If there is any error message returned from server, it will be returned in
// Payload within RedResponse.
//
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
{
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}
/**
Use HTTP DELETE to remove a resource.
@@ -662,28 +681,28 @@ RedfishPostToPayload (
EFI_STATUS
EFIAPI
RedfishDeleteByUri (
IN REDFISH_SERVICE RedfishService,
IN CONST CHAR8 *Uri,
OUT REDFISH_RESPONSE *RedResponse
IN REDFISH_SERVICE RedfishService,
IN CONST CHAR8 *Uri,
OUT REDFISH_RESPONSE *RedResponse
)
{
EFI_STATUS Status;
EDKII_JSON_VALUE JsonValue;
EFI_STATUS Status;
EDKII_JSON_VALUE JsonValue;
Status = EFI_SUCCESS;
JsonValue = NULL;
if (RedfishService == NULL || Uri == NULL || RedResponse == NULL) {
if ((RedfishService == NULL) || (Uri == NULL) || (RedResponse == NULL)) {
return EFI_INVALID_PARAMETER;
}
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
JsonValue = (EDKII_JSON_VALUE) deleteUriFromService (
RedfishService,
Uri,
&(RedResponse->StatusCode)
);
JsonValue = (EDKII_JSON_VALUE)deleteUriFromService (
RedfishService,
Uri,
&(RedResponse->StatusCode)
);
//
// 1. If the returned StatusCode is NULL, indicates any error happen.
@@ -698,8 +717,9 @@ RedfishDeleteByUri (
// NOTE: If there is any error message returned from server, it will be returned in
// Payload within RedResponse.
//
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
{
Status = EFI_DEVICE_ERROR;
}
@@ -717,6 +737,7 @@ ON_EXIT:
return Status;
}
/**
Dump text in fractions.
@@ -725,37 +746,40 @@ ON_EXIT:
**/
VOID
RedfishDumpJsonStringFractions (
IN CHAR8 *String
IN CHAR8 *String
)
{
CHAR8 *NextFraction;
UINTN StringFractionSize;
UINTN StrLen;
UINTN Count;
CHAR8 BackupChar;
CHAR8 *NextFraction;
UINTN StringFractionSize;
UINTN StrLen;
UINTN Count;
CHAR8 BackupChar;
StringFractionSize = 200;
if (String == NULL) {
return ;
return;
}
DEBUG((DEBUG_INFO, "JSON text:\n"));
DEBUG ((DEBUG_INFO, "JSON text:\n"));
NextFraction = String;
StrLen = AsciiStrLen (String);
StrLen = AsciiStrLen (String);
if (StrLen == 0) {
return;
}
for (Count = 0; Count < (StrLen / StringFractionSize); Count++) {
BackupChar = *(NextFraction + StringFractionSize);
BackupChar = *(NextFraction + StringFractionSize);
*(NextFraction + StringFractionSize) = 0;
DEBUG((DEBUG_INFO, "%a", NextFraction));
DEBUG ((DEBUG_INFO, "%a", NextFraction));
*(NextFraction + StringFractionSize) = BackupChar;
NextFraction += StringFractionSize;
NextFraction += StringFractionSize;
}
if ((StrLen % StringFractionSize) != 0) {
DEBUG((DEBUG_INFO, "%a\n\n", NextFraction));
DEBUG ((DEBUG_INFO, "%a\n\n", NextFraction));
}
}
/**
Dump text in JSON value.
@@ -767,15 +791,17 @@ RedfishDumpJson (
IN EDKII_JSON_VALUE JsonValue
)
{
CHAR8 *String;
CHAR8 *String;
String = JsonDumpString (JsonValue, 0);
if (String == NULL) {
return;
}
RedfishDumpJsonStringFractions (String);
FreePool(String);
FreePool (String);
}
/**
Extract the JSON text content from REDFISH_PAYLOAD and dump to debug console.
@@ -784,14 +810,14 @@ RedfishDumpJson (
**/
VOID
RedfishDumpPayload (
IN REDFISH_PAYLOAD Payload
IN REDFISH_PAYLOAD Payload
)
{
EDKII_JSON_VALUE JsonValue;
CHAR8 *String;
EDKII_JSON_VALUE JsonValue;
CHAR8 *String;
JsonValue = NULL;
String = NULL;
String = NULL;
if (Payload == NULL) {
return;
@@ -808,8 +834,9 @@ RedfishDumpPayload (
}
RedfishDumpJsonStringFractions (String);
FreePool(String);
FreePool (String);
}
/**
This function will cleanup the HTTP header and Redfish payload resources.
@@ -832,8 +859,8 @@ RedfishFreeResponse (
StatusCode = NULL;
}
if (HeaderCount != 0 && Headers != NULL) {
HttpFreeHeaderFields(Headers, HeaderCount);
if ((HeaderCount != 0) && (Headers != NULL)) {
HttpFreeHeaderFields (Headers, HeaderCount);
Headers = NULL;
}
@@ -842,6 +869,7 @@ RedfishFreeResponse (
Payload = NULL;
}
}
/**
Check if the "@odata.type" in Payload is valid or not.
@@ -855,17 +883,17 @@ RedfishFreeResponse (
**/
BOOLEAN
RedfishIsValidOdataType (
IN REDFISH_PAYLOAD Payload,
IN CONST CHAR8 *OdataTypeName,
IN REDFISH_ODATA_TYPE_MAPPING *OdataTypeMappingList,
IN UINTN OdataTypeMappingListSize
IN REDFISH_PAYLOAD Payload,
IN CONST CHAR8 *OdataTypeName,
IN REDFISH_ODATA_TYPE_MAPPING *OdataTypeMappingList,
IN UINTN OdataTypeMappingListSize
)
{
UINTN Index;
EDKII_JSON_VALUE OdataType;
EDKII_JSON_VALUE JsonValue;
UINTN Index;
EDKII_JSON_VALUE OdataType;
EDKII_JSON_VALUE JsonValue;
if (Payload == NULL || OdataTypeName == NULL) {
if ((Payload == NULL) || (OdataTypeName == NULL)) {
return FALSE;
}
@@ -875,19 +903,22 @@ RedfishIsValidOdataType (
}
OdataType = JsonObjectGetValue (JsonValueGetObject (JsonValue), "@odata.type");
if (!JsonValueIsString (OdataType) || JsonValueGetAsciiString (OdataType) == NULL) {
if (!JsonValueIsString (OdataType) || (JsonValueGetAsciiString (OdataType) == NULL)) {
return FALSE;
}
for (Index = 0; Index < OdataTypeMappingListSize; Index ++) {
if (AsciiStrCmp (OdataTypeMappingList[Index].OdataTypeName, OdataTypeName) == 0 &&
AsciiStrCmp (OdataTypeMappingList[Index].OdataType, JsonValueGetAsciiString (OdataType)) == 0) {
for (Index = 0; Index < OdataTypeMappingListSize; Index++) {
if ((AsciiStrCmp (OdataTypeMappingList[Index].OdataTypeName, OdataTypeName) == 0) &&
(AsciiStrCmp (OdataTypeMappingList[Index].OdataType, JsonValueGetAsciiString (OdataType)) == 0))
{
return TRUE;
}
}
DEBUG ((DEBUG_INFO, "%a: This Odata type is not in the list.\n", __FUNCTION__));
return FALSE;
}
/**
Check if the payload is collection
@@ -898,11 +929,12 @@ RedfishIsValidOdataType (
**/
BOOLEAN
RedfishIsPayloadCollection (
IN REDFISH_PAYLOAD Payload
)
IN REDFISH_PAYLOAD Payload
)
{
return isPayloadCollection (Payload);
}
/**
Get collection size.
@@ -913,21 +945,23 @@ RedfishIsPayloadCollection (
@return EFI_INVALID_PARAMETER The payload is not a collection.
**/
EFI_STATUS
RedfishGetCollectionSize(
IN REDFISH_PAYLOAD Payload,
IN UINTN *CollectionSize
RedfishGetCollectionSize (
IN REDFISH_PAYLOAD Payload,
IN UINTN *CollectionSize
)
{
if (Payload == NULL || CollectionSize == NULL) {
return EFI_INVALID_PARAMETER;
}
if (!RedfishIsPayloadCollection(Payload)) {
if ((Payload == NULL) || (CollectionSize == NULL)) {
return EFI_INVALID_PARAMETER;
}
*CollectionSize = (UINTN)getCollectionSize(Payload);
if (!RedfishIsPayloadCollection (Payload)) {
return EFI_INVALID_PARAMETER;
}
*CollectionSize = (UINTN)getCollectionSize (Payload);
return EFI_SUCCESS;
}
/**
Get Redfish payload of collection member
@@ -939,20 +973,23 @@ RedfishGetCollectionSize(
**/
REDFISH_PAYLOAD
RedfishGetPayloadByIndex (
IN REDFISH_PAYLOAD Payload,
IN UINTN Index
)
IN REDFISH_PAYLOAD Payload,
IN UINTN Index
)
{
REDFISH_RESPONSE RedfishResponse;
REDFISH_PAYLOAD PayloadReturn;
REDFISH_RESPONSE RedfishResponse;
REDFISH_PAYLOAD PayloadReturn;
PayloadReturn = (VOID *)getPayloadByIndex (Payload, Index, &RedfishResponse.StatusCode);
if(PayloadReturn == NULL ||
(*(RedfishResponse.StatusCode) < HTTP_STATUS_200_OK && *(RedfishResponse.StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)){
if ((PayloadReturn == NULL) ||
((*(RedfishResponse.StatusCode) < HTTP_STATUS_200_OK) && (*(RedfishResponse.StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)))
{
return NULL;
}
return PayloadReturn;
}
/**
Check and return Redfish resource of the given Redpath.
@@ -964,30 +1001,33 @@ RedfishGetPayloadByIndex (
**/
EFI_STATUS
RedfishCheckIfRedpathExist (
IN REDFISH_SERVICE RedfishService,
IN CHAR8 *Redpath,
IN REDFISH_RESPONSE *Response OPTIONAL
IN REDFISH_SERVICE RedfishService,
IN CHAR8 *Redpath,
IN REDFISH_RESPONSE *Response OPTIONAL
)
{
EFI_STATUS Status;
REDFISH_RESPONSE TempResponse;
EFI_STATUS Status;
REDFISH_RESPONSE TempResponse;
if (Redpath == NULL) {
return EFI_INVALID_PARAMETER;
}
Status = RedfishGetByService (RedfishService, Redpath, &TempResponse);
if (EFI_ERROR (Status)) {
return Status;
}
if (Response == NULL) {
RedfishFreeResponse(
RedfishFreeResponse (
TempResponse.StatusCode,
TempResponse.HeaderCount,
TempResponse.Headers,
TempResponse.Payload
);
);
} else {
CopyMem ((VOID *)Response, (VOID *)&TempResponse, sizeof (REDFISH_RESPONSE));
}
return EFI_SUCCESS;
}

View File

@@ -10,7 +10,7 @@
#include "RedfishMisc.h"
EDKII_REDFISH_CREDENTIAL_PROTOCOL *mCredentialProtocol = NULL;
EDKII_REDFISH_CREDENTIAL_PROTOCOL *mCredentialProtocol = NULL;
/**
This function returns the string of Redfish service version.
@@ -23,25 +23,28 @@ EDKII_REDFISH_CREDENTIAL_PROTOCOL *mCredentialProtocol = NULL;
**/
EFI_STATUS
RedfishGetServiceVersion (
IN REDFISH_SERVICE RedfishService,
OUT CHAR8 **ServiceVersionStr
IN REDFISH_SERVICE RedfishService,
OUT CHAR8 **ServiceVersionStr
)
{
redfishService *Redfish;
CHAR8 **KeysArray;
UINTN KeysNum;
redfishService *Redfish;
CHAR8 **KeysArray;
UINTN KeysNum;
if (RedfishService == NULL || ServiceVersionStr == NULL) {
if ((RedfishService == NULL) || (ServiceVersionStr == NULL)) {
return EFI_INVALID_PARAMETER;
}
Redfish = (redfishService *)RedfishService;
if (Redfish->versions == NULL) {
return EFI_INVALID_PARAMETER;
}
KeysArray = JsonObjectGetKeys (Redfish->versions, &KeysNum);
if (KeysNum == 0 || KeysArray == NULL) {
if ((KeysNum == 0) || (KeysArray == NULL)) {
return EFI_NOT_FOUND;
}
*ServiceVersionStr = *KeysArray;
return EFI_SUCCESS;
}
@@ -65,18 +68,17 @@ RedfishGetServiceVersion (
**/
REDFISH_SERVICE
RedfishCreateLibredfishService (
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
IN EDKII_REDFISH_AUTH_METHOD AuthMethod,
IN CHAR8 *UserId,
IN CHAR8 *Password
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
IN EDKII_REDFISH_AUTH_METHOD AuthMethod,
IN CHAR8 *UserId,
IN CHAR8 *Password
)
{
UINTN Flags;
enumeratorAuthentication Auth;
redfishService *Redfish;
UINTN Flags;
enumeratorAuthentication Auth;
redfishService* Redfish;
Redfish = NULL;
Redfish = NULL;
ZeroMem (&Auth, sizeof (Auth));
if (AuthMethod == AuthMethodHttpBasic) {
@@ -84,25 +86,26 @@ RedfishCreateLibredfishService (
} else if (AuthMethod == AuthMethodRedfishSession) {
Auth.authType = REDFISH_AUTH_SESSION;
}
Auth.authCodes.userPass.username = UserId;
Auth.authCodes.userPass.password = Password;
Flags = REDFISH_FLAG_SERVICE_NO_VERSION_DOC;
if (AuthMethod != AuthMethodNone) {
Redfish = createServiceEnumerator(RedfishConfigServiceInfo, NULL, &Auth, (unsigned int ) Flags);
Redfish = createServiceEnumerator (RedfishConfigServiceInfo, NULL, &Auth, (unsigned int)Flags);
} else {
Redfish = createServiceEnumerator(RedfishConfigServiceInfo, NULL, NULL, (unsigned int) Flags);
Redfish = createServiceEnumerator (RedfishConfigServiceInfo, NULL, NULL, (unsigned int)Flags);
}
//
// Zero the Password after use.
//
if (Password != NULL) {
ZeroMem (Password, AsciiStrLen(Password));
ZeroMem (Password, AsciiStrLen (Password));
}
return (REDFISH_SERVICE) Redfish;
return (REDFISH_SERVICE)Redfish;
}
/**
@@ -130,14 +133,14 @@ RedfishCreateLibredfishService (
**/
EFI_STATUS
RedfishGetAuthInfo (
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
OUT CHAR8 **UserId,
OUT CHAR8 **Password
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
OUT CHAR8 **UserId,
OUT CHAR8 **Password
)
{
EFI_STATUS Status;
EFI_STATUS Status;
if (AuthMethod == NULL || UserId == NULL || Password == NULL) {
if ((AuthMethod == NULL) || (UserId == NULL) || (Password == NULL)) {
return EFI_INVALID_PARAMETER;
}
@@ -161,6 +164,7 @@ RedfishGetAuthInfo (
return Status;
}
/**
This function returns the string of Redfish service version.
@@ -175,15 +179,15 @@ RedfishGetAuthInfo (
**/
EFI_STATUS
RedfishBuildRedpathUseId (
IN CHAR8 *ServiceVerisonStr,
IN CHAR8 *Url,
IN CHAR8 *Id,
OUT CHAR8 **Redpath
IN CHAR8 *ServiceVerisonStr,
IN CHAR8 *Url,
IN CHAR8 *Id,
OUT CHAR8 **Redpath
)
{
UINTN RedpathSize;
UINTN RedpathSize;
if (Redpath == NULL || ServiceVerisonStr == NULL || Url == NULL || Id == NULL) {
if ((Redpath == NULL) || (ServiceVerisonStr == NULL) || (Url == NULL) || (Id == NULL)) {
return EFI_INVALID_PARAMETER;
}
@@ -192,10 +196,11 @@ RedfishBuildRedpathUseId (
AsciiStrLen (Url) +
AsciiStrLen ("[Id=]") +
AsciiStrLen (Id) + 1;
*Redpath = AllocatePool(RedpathSize);
*Redpath = AllocatePool (RedpathSize);
if (*Redpath == NULL) {
return EFI_OUT_OF_RESOURCES;
}
AsciiSPrint (*Redpath, RedpathSize, "/%a%a[Id=%a]", ServiceVerisonStr, Url, Id);
return EFI_SUCCESS;
}

View File

@@ -22,7 +22,7 @@
#include <Protocol/EdkIIRedfishCredential.h>
#include <redfish.h>
#define ARRAY_SIZE(Array) (sizeof (Array) / sizeof ((Array)[0]))
#define ARRAY_SIZE(Array) (sizeof (Array) / sizeof ((Array)[0]))
/**
Creates a REDFISH_SERVICE which can be later used to access the Redfish resources.
@@ -43,10 +43,10 @@
**/
REDFISH_SERVICE
RedfishCreateLibredfishService (
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
IN EDKII_REDFISH_AUTH_METHOD AuthMethod,
IN CHAR8 *UserId,
IN CHAR8 *Password
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
IN EDKII_REDFISH_AUTH_METHOD AuthMethod,
IN CHAR8 *UserId,
IN CHAR8 *Password
);
/**
@@ -74,9 +74,9 @@ RedfishCreateLibredfishService (
**/
EFI_STATUS
RedfishGetAuthInfo (
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
OUT CHAR8 **UserId,
OUT CHAR8 **Password
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
OUT CHAR8 **UserId,
OUT CHAR8 **Password
);
#endif

View File

@@ -14,6 +14,7 @@
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef LIBREDFISH_REDFISH_H_
#define LIBREDFISH_REDFISH_H_

View File

@@ -14,6 +14,7 @@
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef LIBREDFISH_REDFISH_PAYLOAD_H_
#define LIBREDFISH_REDFISH_PAYLOAD_H_
@@ -23,17 +24,83 @@
#include <redfishService.h>
#include <redpath.h>
redfishPayload* createRedfishPayload(json_t* value, redfishService* service);
redfishPayload* getPayloadByNodeName(redfishPayload* payload, const char* nodeName, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload* getPayloadByIndex(redfishPayload* payload, size_t index, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload* getPayloadForPath(redfishPayload* payload, redPathNode* redpath, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload* getPayloadForPathString(redfishPayload* payload, const char* string, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload* patchPayload(redfishPayload* target, redfishPayload* payload, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload* postContentToPayload(redfishPayload* target, const char* data, size_t dataSize, const char* contentType, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload* postPayload(redfishPayload* target, redfishPayload* payload, EFI_HTTP_STATUS_CODE** StatusCode);
void cleanupPayload(redfishPayload* payload);
bool isPayloadCollection (redfishPayload *Payload);
size_t getCollectionSize(redfishPayload* payload);
redfishPayload* getPayloadByIndex (redfishPayload* payload, size_t index, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload *
createRedfishPayload (
json_t *value,
redfishService *service
);
redfishPayload *
getPayloadByNodeName (
redfishPayload *payload,
const char *nodeName,
EFI_HTTP_STATUS_CODE **StatusCode
);
redfishPayload *
getPayloadByIndex (
redfishPayload *payload,
size_t index,
EFI_HTTP_STATUS_CODE **StatusCode
);
redfishPayload *
getPayloadForPath (
redfishPayload *payload,
redPathNode *redpath,
EFI_HTTP_STATUS_CODE **StatusCode
);
redfishPayload *
getPayloadForPathString (
redfishPayload *payload,
const char *string,
EFI_HTTP_STATUS_CODE **StatusCode
);
redfishPayload *
patchPayload (
redfishPayload *target,
redfishPayload *payload,
EFI_HTTP_STATUS_CODE **StatusCode
);
redfishPayload *
postContentToPayload (
redfishPayload *target,
const char *data,
size_t dataSize,
const char *contentType,
EFI_HTTP_STATUS_CODE **StatusCode
);
redfishPayload *
postPayload (
redfishPayload *target,
redfishPayload *payload,
EFI_HTTP_STATUS_CODE **StatusCode
);
void
cleanupPayload (
redfishPayload *payload
);
bool
isPayloadCollection (
redfishPayload *Payload
);
size_t
getCollectionSize (
redfishPayload *payload
);
redfishPayload *
getPayloadByIndex (
redfishPayload *payload,
size_t index,
EFI_HTTP_STATUS_CODE **StatusCode
);
#endif

View File

@@ -38,64 +38,114 @@
#include <jansson.h>
typedef struct {
char* host;
json_t* versions;
unsigned int flags;
char* sessionToken;
char* basicAuthStr;
//
// point to the <HOST> part in above "host" field, which will be put into
// the "Host" header of HTTP request message.
//
char* HostHeaderValue;
EFI_REST_EX_PROTOCOL *RestEx;
char *host;
json_t *versions;
unsigned int flags;
char *sessionToken;
char *basicAuthStr;
//
// point to the <HOST> part in above "host" field, which will be put into
// the "Host" header of HTTP request message.
//
char *HostHeaderValue;
EFI_REST_EX_PROTOCOL *RestEx;
} redfishService;
typedef struct {
json_t* json;
redfishService* service;
json_t *json;
redfishService *service;
} redfishPayload;
#define REDFISH_AUTH_BASIC 0
#define REDFISH_AUTH_BEARER_TOKEN 1
#define REDFISH_AUTH_SESSION 2
#define REDFISH_AUTH_BASIC 0
#define REDFISH_AUTH_BEARER_TOKEN 1
#define REDFISH_AUTH_SESSION 2
#define REDFISH_HTTP_RESPONSE_TIMEOUT 5000 /// 5 seconds in uints of millisecond.
#define REDFISH_HTTP_RESPONSE_TIMEOUT 5000 /// 5 seconds in uints of millisecond.
///
/// Library class public defines
///
#define HTTP_FLAG L"http://"
#define HTTPS_FLAG L"https://"
#define HTTP_FLAG L"http://"
#define HTTPS_FLAG L"https://"
///
/// The redfish first URL should be "/redfish/v1/", while we use "/redfish/v1" here without "/"
/// in the end is to avoid the 301 Perment redirect response from Redfish profile simulator.
///
#define REDFISH_FIRST_URL L"/redfish/v1"
#define REDFISH_FIRST_URL L"/redfish/v1"
typedef struct {
unsigned int authType;
union {
struct {
char* username;
char* password;
} userPass;
struct {
char* token;
} authToken;
} authCodes;
unsigned int authType;
union {
struct {
char *username;
char *password;
} userPass;
struct {
char *token;
} authToken;
} authCodes;
} enumeratorAuthentication;
//Values for flags
#define REDFISH_FLAG_SERVICE_NO_VERSION_DOC 0x00000001 //The Redfish Service lacks the version document (in violation of the Redfish spec)
redfishService* createServiceEnumerator(REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo, const char* rootUri, enumeratorAuthentication* auth, unsigned int flags);
json_t* getUriFromService(redfishService* service, const char* uri, EFI_HTTP_STATUS_CODE** StatusCode);
json_t* patchUriFromService(redfishService* service, const char* uri, const char* content, EFI_HTTP_STATUS_CODE** StatusCode);
json_t* postUriFromService(redfishService* service, const char* uri, const char* content, size_t contentLength, const char* contentType, EFI_HTTP_STATUS_CODE** StatusCode);
json_t* deleteUriFromService(redfishService* service, const char* uri, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload* getRedfishServiceRoot(redfishService* service, const char* version, EFI_HTTP_STATUS_CODE** StatusCode);
redfishPayload* getPayloadByPath(redfishService* service, const char* path, EFI_HTTP_STATUS_CODE** StatusCode);
void cleanupServiceEnumerator(redfishService* service);
// Values for flags
#define REDFISH_FLAG_SERVICE_NO_VERSION_DOC 0x00000001// The Redfish Service lacks the version document (in violation of the Redfish spec)
redfishService *
createServiceEnumerator (
REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
const char *rootUri,
enumeratorAuthentication *auth,
unsigned int flags
);
json_t *
getUriFromService (
redfishService *service,
const char *uri,
EFI_HTTP_STATUS_CODE **StatusCode
);
json_t *
patchUriFromService (
redfishService *service,
const char *uri,
const char *content,
EFI_HTTP_STATUS_CODE **StatusCode
);
json_t *
postUriFromService (
redfishService *service,
const char *uri,
const char *content,
size_t contentLength,
const char *contentType,
EFI_HTTP_STATUS_CODE **StatusCode
);
json_t *
deleteUriFromService (
redfishService *service,
const char *uri,
EFI_HTTP_STATUS_CODE **StatusCode
);
redfishPayload *
getRedfishServiceRoot (
redfishService *service,
const char *version,
EFI_HTTP_STATUS_CODE **StatusCode
);
redfishPayload *
getPayloadByPath (
redfishService *service,
const char *path,
EFI_HTTP_STATUS_CODE **StatusCode
);
void
cleanupServiceEnumerator (
redfishService *service
);
#endif

View File

@@ -14,6 +14,7 @@
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef LIBREDFISH_REDPATH_H_
#define LIBREDFISH_REDPATH_H_
@@ -21,22 +22,28 @@
#include <jansson.h>
typedef struct _redPathNode
{
bool isRoot;
bool isIndex;
typedef struct _redPathNode {
bool isRoot;
bool isIndex;
char* version;
char* nodeName;
size_t index;
char* op;
char* propName;
char* value;
char *version;
char *nodeName;
size_t index;
char *op;
char *propName;
char *value;
struct _redPathNode* next;
struct _redPathNode *next;
} redPathNode;
redPathNode* parseRedPath(const char* path);
void cleanupRedPath(redPathNode* node);
redPathNode *
parseRedPath (
const char *path
);
void
cleanupRedPath (
redPathNode *node
);
#endif

View File

@@ -16,177 +16,209 @@
**/
#include <redpath.h>
static char* getVersion(const char* path, char** end);
static void parseNode(const char* path, redPathNode* node, redPathNode** end);
static char *
getVersion (
const char *path,
char **end
);
static char* getStringTill(const char* string, const char* terminator, char** retEnd);
static void
parseNode (
const char *path,
redPathNode *node,
redPathNode **end
);
redPathNode* parseRedPath(const char* path)
static char *
getStringTill (
const char *string,
const char *terminator,
char **retEnd
);
redPathNode *
parseRedPath (
const char *path
)
{
redPathNode* node;
redPathNode* endNode;
char* curPath;
char* end;
redPathNode *node;
redPathNode *endNode;
char *curPath;
char *end;
if(!path || strlen(path) == 0)
{
return NULL;
}
if (!path || (strlen (path) == 0)) {
return NULL;
}
node = (redPathNode*)calloc(1, sizeof(redPathNode));
if(!node)
{
return NULL;
}
if(path[0] == '/')
{
node->isRoot = true;
if(path[1] == 'v')
{
node->version = getVersion(path+1, &curPath);
if(curPath == NULL)
{
return node;
}
if(curPath[0] == '/')
{
curPath++;
}
node->next = parseRedPath(curPath);
}
else
{
node->next = parseRedPath(path+1);
}
node = (redPathNode *)calloc (1, sizeof (redPathNode));
if (!node) {
return NULL;
}
if (path[0] == '/') {
node->isRoot = true;
if (path[1] == 'v') {
node->version = getVersion (path+1, &curPath);
if (curPath == NULL) {
return node;
}
if (curPath[0] == '/') {
curPath++;
}
node->next = parseRedPath (curPath);
} else {
node->next = parseRedPath (path+1);
}
node->isRoot = false;
curPath = getStringTill(path, "/", &end);
endNode = node;
parseNode(curPath, node, &endNode);
free(curPath);
if(end != NULL)
{
endNode->next = parseRedPath(end+1);
}
return node;
}
node->isRoot = false;
curPath = getStringTill (path, "/", &end);
endNode = node;
parseNode (curPath, node, &endNode);
free (curPath);
if (end != NULL) {
endNode->next = parseRedPath (end+1);
}
return node;
}
void cleanupRedPath(redPathNode* node)
void
cleanupRedPath (
redPathNode *node
)
{
if(!node)
{
return;
}
cleanupRedPath(node->next);
node->next = NULL;
if(node->version)
{
free(node->version);
}
if(node->nodeName)
{
free(node->nodeName);
}
if(node->op)
{
free(node->op);
}
if(node->propName)
{
free(node->propName);
}
if(node->value)
{
free(node->value);
}
free(node);
if (!node) {
return;
}
cleanupRedPath (node->next);
node->next = NULL;
if (node->version) {
free (node->version);
}
if (node->nodeName) {
free (node->nodeName);
}
if (node->op) {
free (node->op);
}
if (node->propName) {
free (node->propName);
}
if (node->value) {
free (node->value);
}
free (node);
}
static char* getVersion(const char* path, char** end)
static char *
getVersion (
const char *path,
char **end
)
{
return getStringTill(path, "/", end);
return getStringTill (path, "/", end);
}
static void parseNode(const char* path, redPathNode* node, redPathNode** end)
static void
parseNode (
const char *path,
redPathNode *node,
redPathNode **end
)
{
char* indexStart;
char* index;
char* indexEnd;
char* nodeName = getStringTill(path, "[", &indexStart);
size_t tmpIndex;
char* opChars;
char *indexStart;
char *index;
char *indexEnd;
char *nodeName = getStringTill (path, "[", &indexStart);
size_t tmpIndex;
char *opChars;
node->nodeName = nodeName;
if(indexStart == NULL)
{
*end = node;
return;
}
node->next = (redPathNode*)calloc(1, sizeof(redPathNode));
if(!node->next)
{
return;
}
//Skip past [
indexStart++;
*end = node->next;
index = getStringTill(indexStart, "]", NULL);
tmpIndex = (size_t)strtoull(index, &indexEnd, 0);
if(indexEnd != index)
{
free(index);
node->next->index = tmpIndex;
node->next->isIndex = true;
return;
}
opChars = strpbrk(index, "<>=~");
if(opChars == NULL)
{
//TODO handle last() and position()
node->next->op = strdup("exists");
node->next->propName = index;
return;
}
node->next->propName = (char*)malloc((opChars - index)+1);
memcpy(node->next->propName, index, (opChars - index));
node->next->propName[(opChars - index)] = 0;
node->nodeName = nodeName;
if (indexStart == NULL) {
*end = node;
return;
}
tmpIndex = 1;
while(1)
{
if(opChars[tmpIndex] == '=' || opChars[tmpIndex] == '<' || opChars[tmpIndex] == '>' || opChars[tmpIndex] == '~')
{
tmpIndex++;
continue;
}
break;
node->next = (redPathNode *)calloc (1, sizeof (redPathNode));
if (!node->next) {
return;
}
// Skip past [
indexStart++;
*end = node->next;
index = getStringTill (indexStart, "]", NULL);
tmpIndex = (size_t)strtoull (index, &indexEnd, 0);
if (indexEnd != index) {
free (index);
node->next->index = tmpIndex;
node->next->isIndex = true;
return;
}
opChars = strpbrk (index, "<>=~");
if (opChars == NULL) {
// TODO handle last() and position()
node->next->op = strdup ("exists");
node->next->propName = index;
return;
}
node->next->propName = (char *)malloc ((opChars - index)+1);
memcpy (node->next->propName, index, (opChars - index));
node->next->propName[(opChars - index)] = 0;
tmpIndex = 1;
while (1) {
if ((opChars[tmpIndex] == '=') || (opChars[tmpIndex] == '<') || (opChars[tmpIndex] == '>') || (opChars[tmpIndex] == '~')) {
tmpIndex++;
continue;
}
node->next->op = (char*)malloc(tmpIndex+1);
memcpy(node->next->op, opChars, tmpIndex);
node->next->op[tmpIndex] = 0;
break;
}
node->next->value = strdup(opChars+tmpIndex);
free(index);
node->next->op = (char *)malloc (tmpIndex+1);
memcpy (node->next->op, opChars, tmpIndex);
node->next->op[tmpIndex] = 0;
node->next->value = strdup (opChars+tmpIndex);
free (index);
}
static char* getStringTill(const char* string, const char* terminator, char** retEnd)
static char *
getStringTill (
const char *string,
const char *terminator,
char **retEnd
)
{
char* ret;
char* end;
end = strstr((char*)string, terminator);
if(retEnd)
{
*retEnd = end;
}
if(end == NULL)
{
//No terminator
return strdup(string);
}
ret = (char*)malloc((end-string)+1);
memcpy(ret, string, (end-string));
ret[(end-string)] = 0;
return ret;
char *ret;
char *end;
end = strstr ((char *)string, terminator);
if (retEnd) {
*retEnd = end;
}
if (end == NULL) {
// No terminator
return strdup (string);
}
ret = (char *)malloc ((end-string)+1);
memcpy (ret, string, (end-string));
ret[(end-string)] = 0;
return ret;
}