summaryrefslogtreecommitdiff
path: root/build_brew/brew_db.h
diff options
context:
space:
mode:
Diffstat (limited to 'build_brew/brew_db.h')
-rw-r--r--build_brew/brew_db.h150
1 files changed, 150 insertions, 0 deletions
diff --git a/build_brew/brew_db.h b/build_brew/brew_db.h
new file mode 100644
index 0000000..b6f7a90
--- /dev/null
+++ b/build_brew/brew_db.h
@@ -0,0 +1,150 @@
+/*-
+ * $Id$
+ *
+ * The following provides the information necessary to build Berkeley DB
+ * on BREW.
+ */
+
+#include <AEEAppGen.h>
+#include <AEEShell.h>
+#include <AEEFile.h>
+#include <AEEStdLib.h>
+
+#include "errno.h"
+#include "db.h"
+#include "clib_port.h"
+
+/*
+ * BREW doesn't have stdio.
+ */
+#define EOF (-1) /* Declare stdio's EOF. */
+#define stderr ((IFile *)1) /* Flag to call DBGPRINTF. */
+#define stdout ((IFile *)1)
+
+/*
+ * POSIX time structure/function compatibility.
+ *
+ * !!!
+ * This is likely wrong, we should probably move all Berkeley DB time-specific
+ * functionality into os/.
+ */
+struct tm {
+ int tm_sec; /* seconds after the minute - [0,59] */
+ int tm_min; /* minutes after the hour - [0,59] */
+ int tm_hour; /* hours since midnight - [0,23] */
+ int tm_mday; /* day of the month - [1,31] */
+ int tm_mon; /* months since January - [0,11] */
+ int tm_year; /* years since 1900 */
+ int tm_wday; /* days since Sunday - [0,6] */
+ int tm_yday; /* days since January 1 - [0,365] */
+ int tm_isdst; /* daylight savings time flag */
+ /*
+ * We don't provide tm_zone or tm_gmtoff because BREW doesn't
+ * provide them.
+ */
+};
+
+/*
+* The ctime() function converts the time pointed to by clock, representing
+* time in seconds since the Epoch to local time in the form of a string.
+*
+* Berkeley DB uses POSIX time values internally.
+*
+* The POSIX time function returns seconds since the Epoch, which was
+* 1970/01/01 00:00:00 UTC.
+*
+* BREW's GETUTCSECONDS() returns the number of seconds since
+* 1980/01/06 00:00:00 UTC.
+*
+* To convert from BREW to POSIX, add the seconds between 1970 and 1980 plus
+* 6 more days.
+*/
+#define BREW_EPOCH_OFFSET (315964800L)
+
+/*
+ * Map ANSI C library functions to BREW specific APIs.
+ */
+#define atoi(a) ATOI(a)
+#define free(a) FREE(a)
+#define malloc(a) MALLOC(a)
+#define memcmp(a, b, c) MEMCMP(a, b, c)
+#define memmove(a, b, c) MEMMOVE(a, b, c)
+#define memset(a, b, c) MEMSET(a, b, c)
+#define realloc(a, b) REALLOC(a, b)
+#define snprintf SNPRINTF
+#define sprintf SPRINTF
+#define strcat(a, b) STRCAT(a, b)
+#define strchr(a, b) STRCHR(a, b)
+#define strcmp(a, b) STRCMP(a, b)
+#define strcpy(a, b) STRCPY(a, b)
+#define strdup(a) STRDUP(a)
+#define strlen(a) STRLEN(a)
+#define strncmp(a, b, c) STRNCMP(a, b, c)
+#define strncpy(a, b, c) STRNCPY(a, b, c)
+#define strrchr(a, b) STRRCHR(a, b)
+#define strtoul(a, b, c) STRTOUL(a, b, c)
+#define vsnprintf(a, b, c, d) VSNPRINTF(a, b, c, d)
+
+/*
+ * !!!
+ * Don't #define memcpy to MEMCPY, even though it exists, because that results
+ * in a C pre-processor loop and compile failure.
+ *
+ * Don't #define memcpy to MEMMOVE directly, that results in failure as well.
+ */
+#define memcpy memmove
+
+/*
+ * BREW does not have concept of 'sync'.
+ *
+ * It depends on the implementation of the BREW on various platforms, but
+ * Mobilus confirms the version of BREW that ships to North America in 3G
+ * models has sync features guaranteeing safe physical writes whenever a
+ * write is performed using BREW API. Therefore, the issue is not on the
+ * applications running top of BREW, but the implementation of BREW itself
+ * that has to be checked in order to provide durability.
+ */
+#define __os_fsync(a, b) (0)
+#define fflush(a) (0)
+
+/*
+ * The ANSI C library functions for which we wrote local versions.
+ */
+int fclose(FILE *);
+int fgetc(FILE *);
+char *fgets(char *, int, FILE *);
+FILE *fopen(const char *, const char *);
+size_t fwrite(const void *, size_t, size_t, FILE *);
+char *getcwd(char *, size_t);
+struct tm *localtime(const time_t *);
+time_t time(time_t *);
+
+/*
+ * FILE_MANAGER_CREATE --
+ * Instantiate file manager instance.
+ */
+#define FILE_MANAGER_CREATE(dbenv, mgr, ret) do { \
+ AEEApplet *__app = (AEEApplet *)GETAPPINSTANCE(); \
+ int __ret; \
+ if ((__ret = ISHELL_CreateInstance(__app->m_pIShell, \
+ AEECLSID_FILEMGR, (void **)&(mgr))) == SUCCESS) \
+ ret = 0; \
+ else { \
+ __db_syserr(dbenv, __ret, "ISHELL_CreateInstance"); \
+ ret = __os_posix_err(__ret); \
+ } \
+} while (0)
+
+/*
+ * FILE_MANAGER_ERR --
+ * Handle file manager method error.
+ */
+#define FILE_MANAGER_ERR(dbenv, mgr, name, op, ret) do { \
+ int __ret; \
+ __ret = IFILEMGR_GetLastError(mgr); \
+ if ((name) == NULL) \
+ __db_syserr(dbenv, __ret, "%s", op); \
+ else \
+ __db_syserr(dbenv, __ret, "%s: %s", name, op); \
+ (ret) = __os_posix_err(__ret); \
+} while (0)