A number of small QOL changes related to lfs_util.h

- 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.

- 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.

- 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.
This commit is contained in:
Christopher Haster
2019-08-06 20:51:53 -05:00
parent db054684a6
commit f3e4f78fe4
4 changed files with 35 additions and 33 deletions

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"
/// Caching block device operations /// /// Caching block device operations ///

22
lfs.h
View File

@@ -7,8 +7,7 @@
#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"
@@ -66,25 +65,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 {

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
@@ -44,6 +45,28 @@ extern "C"
#endif #endif
// Possible error codes, these are negative to allow valid positive
// return values. May be redefined to system error codes as long as
// they are negative.
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
@@ -146,8 +169,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