A number of small lfs_util.h QOL changes

- Changed the name of the LFS_CONFIG macro to LFS_UTIL to avoid
  confusion with the lfs_config struct. This also hints that LFS_UTIL
  is related to lfs_util.h.

  LFS_UTIL allows the user to override lfs_util.h so they can provide
  their own system-level dependencies such as malloc, tracing, builtins,
  stdint definitions, string.h, and others.

- Removed stdlib includes from lfs.h, these should all go through
  lfs_util.h to let users override these definitions if stdlib is
  unavailable on their system.

- Moved error code definitions to lfs_util.h. This lets users override
  the error codes to replace them with their own error codes and avoid
  a translation layer in some situations. Note the error codes must
  still be in the range of a negative int.

- Used proper stdint definitions in lfs_scmp.
This commit is contained in:
Christopher Haster
2019-08-06 20:51:53 -05:00
parent 4c9146ea53
commit ef9ba2d912
7 changed files with 39 additions and 43 deletions

View File

@@ -8,7 +8,6 @@
#define LFS_FILEBD_H #define LFS_FILEBD_H
#include "lfs.h" #include "lfs.h"
#include "lfs_util.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"

View File

@@ -8,7 +8,6 @@
#define LFS_RAMBD_H #define LFS_RAMBD_H
#include "lfs.h" #include "lfs.h"
#include "lfs_util.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"

View File

@@ -9,7 +9,6 @@
#define LFS_TESTBD_H #define LFS_TESTBD_H
#include "lfs.h" #include "lfs.h"
#include "lfs_util.h"
#include "bd/lfs_rambd.h" #include "bd/lfs_rambd.h"
#include "bd/lfs_filebd.h" #include "bd/lfs_filebd.h"

1
lfs.c
View File

@@ -5,7 +5,6 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
#include "lfs.h" #include "lfs.h"
#include "lfs_util.h"
#define LFS_BLOCK_NULL ((lfs_block_t)-1) #define LFS_BLOCK_NULL ((lfs_block_t)-1)
#define LFS_BLOCK_INLINE ((lfs_block_t)-2) #define LFS_BLOCK_INLINE ((lfs_block_t)-2)

28
lfs.h
View File

@@ -7,12 +7,10 @@
#ifndef LFS_H #ifndef LFS_H
#define LFS_H #define LFS_H
#include <stdint.h> #include "lfs_util.h"
#include <stdbool.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C" {
{
#endif #endif
@@ -66,26 +64,6 @@ typedef uint32_t lfs_block_t;
#define LFS_ATTR_MAX 1022 #define LFS_ATTR_MAX 1022
#endif #endif
// Possible error codes, these are negative to allow
// valid positive return values
enum lfs_error {
LFS_ERR_OK = 0, // No error
LFS_ERR_IO = -5, // Error during device operation
LFS_ERR_CORRUPT = -84, // Corrupted
LFS_ERR_NOENT = -2, // No directory entry
LFS_ERR_EXIST = -17, // Entry already exists
LFS_ERR_NOTDIR = -20, // Entry is not a dir
LFS_ERR_ISDIR = -21, // Entry is a dir
LFS_ERR_NOTEMPTY = -39, // Dir is not empty
LFS_ERR_BADF = -9, // Bad file number
LFS_ERR_FBIG = -27, // File too large
LFS_ERR_INVAL = -22, // Invalid parameter
LFS_ERR_NOSPC = -28, // No space left on device
LFS_ERR_NOMEM = -12, // No more memory available
LFS_ERR_NOATTR = -61, // No data/attr available
LFS_ERR_NAMETOOLONG = -36, // File name too long
};
// File types // File types
enum lfs_type { enum lfs_type {
// file types // file types
@@ -649,7 +627,7 @@ int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ }
#endif #endif
#endif #endif

View File

@@ -7,7 +7,7 @@
#include "lfs_util.h" #include "lfs_util.h"
// Only compile if user does not provide custom config // Only compile if user does not provide custom config
#ifndef LFS_CONFIG #ifndef LFS_UTIL
// Software CRC implementation with small lookup table // Software CRC implementation with small lookup table

View File

@@ -3,20 +3,21 @@
* *
* Copyright (c) 2017, Arm Limited. All rights reserved. * Copyright (c) 2017, Arm Limited. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*
* Can be overridden by users with their own configuration by defining
* LFS_UTIL as a header file (-DLFS_UTIL=my_lfs_util.h)
*
* If LFS_UTIL is defined, none of the default definitions will be
* emitted and must be provided by the user's header file. To start, I would
* suggest copying lfs_util.h and modifying as needed.
*/ */
#ifndef LFS_UTIL_H #ifndef LFS_UTIL_H
#define LFS_UTIL_H #define LFS_UTIL_H
// Users can override lfs_util.h with their own configuration by defining #ifdef LFS_UTIL
// LFS_CONFIG as a header file to include (-DLFS_CONFIG=lfs_config.h).
//
// If LFS_CONFIG is used, none of the default utils will be emitted and must be
// provided by the config file. To start, I would suggest copying lfs_util.h
// and modifying as needed.
#ifdef LFS_CONFIG
#define LFS_STRINGIZE(x) LFS_STRINGIZE2(x) #define LFS_STRINGIZE(x) LFS_STRINGIZE2(x)
#define LFS_STRINGIZE2(x) #x #define LFS_STRINGIZE2(x) #x
#include LFS_STRINGIZE(LFS_CONFIG) #include LFS_STRINGIZE(LFS_UTIL)
#else #else
// System includes // System includes
@@ -39,11 +40,32 @@
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C" {
{
#endif #endif
// Possible error codes, these are negative to allow valid positive
// return values. May be redefined to system-specific error codes as long
// as they fit in a negative integer.
enum lfs_error {
LFS_ERR_OK = 0, // No error
LFS_ERR_IO = -5, // Error during device operation
LFS_ERR_CORRUPT = -84, // Corrupted
LFS_ERR_NOENT = -2, // No directory entry
LFS_ERR_EXIST = -17, // Entry already exists
LFS_ERR_NOTDIR = -20, // Entry is not a dir
LFS_ERR_ISDIR = -21, // Entry is a dir
LFS_ERR_NOTEMPTY = -39, // Dir is not empty
LFS_ERR_BADF = -9, // Bad file number
LFS_ERR_FBIG = -27, // File too large
LFS_ERR_INVAL = -22, // Invalid parameter
LFS_ERR_NOSPC = -28, // No space left on device
LFS_ERR_NOMEM = -12, // No more memory available
LFS_ERR_NOATTR = -61, // No data/attr available
LFS_ERR_NAMETOOLONG = -36, // File name too long
};
// Macros, may be replaced by system specific wrappers. Arguments to these // Macros, may be replaced by system specific wrappers. Arguments to these
// macros must not have side-effects as the macros can be removed for a smaller // macros must not have side-effects as the macros can be removed for a smaller
// code footprint // code footprint
@@ -150,8 +172,8 @@ static inline uint32_t lfs_popc(uint32_t a) {
// Find the sequence comparison of a and b, this is the distance // Find the sequence comparison of a and b, this is the distance
// between a and b ignoring overflow // between a and b ignoring overflow
static inline int lfs_scmp(uint32_t a, uint32_t b) { static inline int32_t lfs_scmp(uint32_t a, uint32_t b) {
return (int)(unsigned)(a - b); return (int32_t)(uint32_t)(a - b);
} }
// Convert between 32-bit little-endian and native order // Convert between 32-bit little-endian and native order
@@ -227,7 +249,7 @@ static inline void lfs_free(void *p) {
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ }
#endif #endif
#endif #endif