summaryrefslogtreecommitdiff
path: root/source4/lib/appweb/ejs-2.0/mpr/mpr.h
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/appweb/ejs-2.0/mpr/mpr.h')
-rw-r--r--source4/lib/appweb/ejs-2.0/mpr/mpr.h1027
1 files changed, 1027 insertions, 0 deletions
diff --git a/source4/lib/appweb/ejs-2.0/mpr/mpr.h b/source4/lib/appweb/ejs-2.0/mpr/mpr.h
new file mode 100644
index 0000000000..67505a6e01
--- /dev/null
+++ b/source4/lib/appweb/ejs-2.0/mpr/mpr.h
@@ -0,0 +1,1027 @@
+/*
+ * @file mpr.h
+ * @brief Header for the Mbedthis Portable Runtime (MPR) Base.
+ * @copy default
+ *
+ * Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
+ *
+ * This software is distributed under commercial and open source licenses.
+ * You may use the GPL open source license described below or you may acquire
+ * a commercial license from Mbedthis Software. You agree to be fully bound
+ * by the terms of either license. Consult the LICENSE.TXT distributed with
+ * this software for full details.
+ *
+ * This software is open source; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See the GNU General Public License for more
+ * details at: http://www.mbedthis.com/downloads/gplLicense.html
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * This GPL license does NOT permit incorporating this software into
+ * proprietary programs. If you are unable to comply with the GPL, you must
+ * acquire a commercial license to use this software. Commercial licenses
+ * for this software and support services are available from Mbedthis
+ * Software at http://www.mbedthis.com
+ *
+ * @end
+ */
+/******************************* Documentation ********************************/
+/*
+ * See mpr.dox for additional documentation.
+ */
+
+/******************************************************************************/
+
+#ifndef _h_MPR
+#define _h_MPR 1
+
+/***********************************Includes **********************************/
+
+#include "mprOs.h"
+
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/********************************** Constants *********************************/
+
+#if BLD_FEATURE_SQUEEZE
+#if BREW || DOXYGEN
+/*
+ * Maximum length of a file path name. Reduced from the system maximum to
+ * save memory space.
+ */
+#define MPR_MAX_FNAME 64 /**< Reasonable filename size */
+#define MPR_MAX_PATH 64 /**< Reasonable path name size */
+#define MPR_DEFAULT_STACK (16 * 1024) /**< Default stack size */
+#else
+#define MPR_MAX_FNAME 128 /**< Reasonable filename size */
+#define MPR_MAX_PATH 256 /**< Reasonable path name size */
+#define MPR_DEFAULT_STACK (32 * 1024) /**< Default stack size */
+#endif
+/*
+ * Reasonable length of a file name used by the product. Use where you know
+ * the expected file name and it is certain to be less than this limit.
+ */
+#define MPR_DEFAULT_ALLOC 64 /**< Default small alloc size */
+#define MPR_DEFAULT_HASH_SIZE 23 /**< Default size of hash table */
+#define MPR_MAX_ARGC 32 /**< Reasonable max of args */
+#define MPR_MAX_STRING 512 /**< Maximum (stack) string size */
+#define MPR_MAX_LOG_STRING 512 /**< Maximum log message */
+#define MPR_MAX_URL 256 /**< Reasonable size of a URL */
+#define MPR_BUFSIZE 512 /**< Reasonable size for buffers */
+#define MPR_SLAB_STR_MAX 32 /**< Size of string slab blocks */
+#define MPR_SLAB_STR_INC 32 /**< Pre-allocate increment */
+#define MPR_SLAB_DEFAULT_INC 8 /**< Default pre-allocate inc */
+#define MPR_ARRAY_INCR 8 /**< Default array growth inc */
+#define MPR_BUF_INCR 1024 /**< Default array growth inc */
+#define MPR_MAX_BUF (1024*4096) /**< Default array growth inc */
+
+#define MPR_BLK_HDR_SIZE ((sizeof(struct MprBlk) + 3) & ~3)
+
+#else
+#define MPR_MAX_FNAME 256
+#define MPR_MAX_PATH 1024
+#define MPR_DEFAULT_ALLOC 256
+#define MPR_DEFAULT_HASH_SIZE 43
+#define MPR_DEFAULT_STACK (64 * 1024)
+#define MPR_MAX_ARGC 128
+#define MPR_MAX_STRING 4096
+#define MPR_MAX_LOG_STRING 8192
+#define MPR_MAX_URL 1024
+#define MPR_BUFSIZE 1024
+#define MPR_SLAB_STR_MAX 32
+#define MPR_SLAB_STR_INC 64
+#define MPR_SLAB_DEFAULT_INC 16
+#define MPR_ARRAY_INCR 16
+#define MPR_BUF_INCR 1024
+#define MPR_MAX_BUF (1024*4096)
+
+#define MPR_BLK_HDR_SIZE ((sizeof(struct MprBlk) + 15) & ~15)
+#endif
+
+/**
+ * Maximum size of a host name string
+ */
+#define MPR_MAX_IP_NAME 64
+
+/**
+ * Maximum size of an IP address
+ */
+#define MPR_MAX_IP_ADDR 16
+
+/**
+ * Maximum size of an IP address including port number
+ */
+#define MPR_MAX_IP_ADDR_PORT 32
+
+#define MPR_MAX_SLAB 16 /* Slabs from 32-512 bytes */
+
+#define MPR_MAX_TIME_SYNC (10 * 1000) /* Time sync adjustments */
+
+/**
+ * @overview Memory context type
+ * @description Blocks of memory are allocated using a memory context
+ * as the parent with the \ref MprApp structure being the root of the
+ * tree. Any allocated memory block may serve as the memory context for
+ * subsequent memory allocations. Freeing a block via \ref mprFree will
+ * release the allocated block and all child blocks.
+ * @stability Prototype.
+ * @library libmpr.
+ * @see mprInit, mprAlloc, mprFree
+ */
+typedef const void *MprCtx;
+
+/*
+ * Allocated memory destructor type
+ */
+typedef int (*MprDestructor)(void *);
+
+/******************************** Error Codes *********************************/
+
+/*
+ * Standard MPR return and error codes
+ */
+
+#define MPR_ERR_OK (0)
+/**< Success */
+
+#define MPR_ERR_BASE (-200)
+/**< Base error code */
+
+#define MPR_ERR_GENERAL (MPR_ERR_BASE - 1)
+/**< General error */
+#define MPR_ERR_ABORTED (MPR_ERR_BASE - 2)
+/**< Action aborted */
+#define MPR_ERR_ALREADY_EXISTS (MPR_ERR_BASE - 3)
+/**< Item already exists */
+#define MPR_ERR_BAD_ARGS (MPR_ERR_BASE - 4)
+/**< Bad arguments or paramaeters */
+#define MPR_ERR_BAD_FORMAT (MPR_ERR_BASE - 5)
+/**< Bad input format */
+#define MPR_ERR_BAD_HANDLE (MPR_ERR_BASE - 6)
+#define MPR_ERR_BAD_STATE (MPR_ERR_BASE - 7)
+/**< Module is in a bad state */
+#define MPR_ERR_BAD_SYNTAX (MPR_ERR_BASE - 8)
+/**< Input has bad syntax */
+#define MPR_ERR_BAD_TYPE (MPR_ERR_BASE - 9)
+#define MPR_ERR_BAD_VALUE (MPR_ERR_BASE - 10)
+#define MPR_ERR_BUSY (MPR_ERR_BASE - 11)
+#define MPR_ERR_CANT_ACCESS (MPR_ERR_BASE - 12)
+/**< Can't access the file or resource */
+#define MPR_ERR_CANT_COMPLETE (MPR_ERR_BASE - 13)
+#define MPR_ERR_CANT_CREATE (MPR_ERR_BASE - 14)
+/**< Can't create the file or resource */
+#define MPR_ERR_CANT_INITIALIZE (MPR_ERR_BASE - 15)
+#define MPR_ERR_CANT_OPEN (MPR_ERR_BASE - 16)
+/**< Can't open the file or resource */
+#define MPR_ERR_CANT_READ (MPR_ERR_BASE - 17)
+/**< Can't read from the file or resource */
+#define MPR_ERR_CANT_WRITE (MPR_ERR_BASE - 18)
+/**< Can't write to the file or resource */
+#define MPR_ERR_DELETED (MPR_ERR_BASE - 19)
+#define MPR_ERR_NETWORK (MPR_ERR_BASE - 20)
+#define MPR_ERR_NOT_FOUND (MPR_ERR_BASE - 21)
+#define MPR_ERR_NOT_INITIALIZED (MPR_ERR_BASE - 22)
+/**< Module or resource is not initialized */
+#define MPR_ERR_NOT_READY (MPR_ERR_BASE - 23)
+#define MPR_ERR_READ_ONLY (MPR_ERR_BASE - 24)
+/**< The operation timed out */
+#define MPR_ERR_TIMEOUT (MPR_ERR_BASE - 25)
+#define MPR_ERR_TOO_MANY (MPR_ERR_BASE - 26)
+#define MPR_ERR_WONT_FIT (MPR_ERR_BASE - 27)
+#define MPR_ERR_WOULD_BLOCK (MPR_ERR_BASE - 28)
+#define MPR_ERR_CANT_ALLOCATE (MPR_ERR_BASE - 29)
+// MOB -- rename NO_MEMORY
+#define MPR_ERR_MEMORY (MPR_ERR_BASE - 30)
+#define MPR_ERR_CANT_DELETE (MPR_ERR_BASE - 31)
+#define MPR_ERR_MAX (MPR_ERR_BASE - 32)
+
+/*
+ * Standard logging trace levels are 0 to 9 with 0 being the most verbose.
+ * the These are ored with the error source and type flags. The MPR_LOG_MASK
+ * is used to extract the trace level from a flags word. We expect most apps
+ * to run with level 2 trace enabled.
+ */
+#define MPR_ERROR 1 /**< Hard error trace level */
+#define MPR_WARN 2 /**< Soft warning trace level */
+#define MPR_CONFIG 2 /**< Configuration settings trace level. */
+#define MPR_INFO 3 /**< Informational trace only */
+#define MPR_DEBUG 4 /**< Debug information trace level */
+#define MPR_VERBOSE 9 /**< Highest level of trace */
+#define MPR_LEVEL_MASK 0xf /**< Level mask */
+
+/*
+ * Error source flags
+ */
+#define MPR_ERROR_SRC 0x10 /**< Originated from mprError */
+#define MPR_LOG_SRC 0x20 /**< Originated from mprLog */
+#define MPR_ASSERT_SRC 0x40 /**< Originated from mprAssert */
+#define MPR_FATAL_SRC 0x80 /**< Fatal error. Log and exit */
+
+/*
+ * Log message type flags. Specify what kind of log / error message it is.
+ * Listener handlers examine this flag to determine if they should process
+ * the message.Assert messages are trapped when in DEV mode. Otherwise ignored.
+ */
+#define MPR_LOG_MSG 0x100 /**< Log trace message - not an error */
+#define MPR_ERROR_MSG 0x200 /**< General error */
+#define MPR_ASSERT_MSG 0x400 /**< Assert flags -- trap in debugger */
+#define MPR_USER_MSG 0x800 /**< User message */
+
+/*
+ * Log output modifiers
+ */
+#define MPR_RAW 0x1000 /**< Raw trace output */
+
+/*
+ * Error line number information.
+ */
+#define MPR_LINE(s) #s
+#define MPR_LINE2(s) MPR_LINE(s)
+#define MPR_LINE3 MPR_LINE2(__LINE__)
+#define MPR_LOC __FILE__ ":" MPR_LINE3
+
+/*
+ * Macros to pass file and line number information
+ * Use MPR_LOC_ARGS in normal user code.
+ * Use MPR_LOC_DEC in declarations.
+ * Use MPR_LOC_PASS in layered APIs to pass original line info down.
+ */
+#if BLD_FEATURE_ALLOC_LEAK_TRACK
+#define MPR_LOC_ARGS(ctx) ctx, MPR_LOC
+#define MPR_LOC_DEC(ctx, loc) MprCtx ctx, const char *loc
+#define MPR_LOC_PASS(ctx, loc) ctx, loc
+#else
+#define MPR_LOC_ARGS(ctx) ctx
+#define MPR_LOC_DEC(ctx, loc) MprCtx ctx
+#define MPR_LOC_PASS(ctx, loc) ctx
+#endif
+
+/******************************* Debug and Assert *****************************/
+
+extern void mprBreakpoint(const char *loc, const char *msg);
+
+#if BLD_FEATURE_ASSERT
+ #define mprAssert(C) if (C) ; else mprStaticAssert(MPR_LOC, #C)
+#else
+ #define mprAssert(C) if (1) ; else
+#endif
+
+/********************************* Safe Strings *******************************/
+/*
+ * Unsafe functions that should not be used. Define UNSAFE_STRINGS_OK before
+ * including mpr.h if you really want to use these functions. A better approach
+ * is to undefine them just prior to using them in your C/C++ source file.
+ */
+#if BLD_FEATURE_SAFE_STRINGS
+
+#if BLD_FEATURE_PHP4_MODULE || BLD_FEATURE_PHP5_MODULE
+ #ifndef UNSAFE_FUNCTIONS_OK
+ #define UNSAFE_FUNCTIONS_OK 1
+ #endif
+#endif
+
+#ifndef UNSAFE_FUNCTIONS_OK
+ #define sprintf UseMprSprintfInstead
+ #define fprintf UseMprFprintfInstead
+ #define vsprintf UseMprVsprintfInstead
+ #define strtok UseMprStrTokInstead
+ #define gethostbyname UseMprGetHostByNameInstead
+ #define ctime UseMprCtimeInstead
+ #define asctime UseMprAsctimeInstead
+ #define localtime UseMprLocaltimeInstead
+ #define gmtime UseMprGmtimeInstead
+ #define malloc UseMprMallocInstead
+ #define free UseMprFreeInstead
+ #define realloc UseMprReallocInstead
+ #define strncpy UseMprStrcpyInstead
+ #define inet_ntoa UseMprInetToStrInstead
+
+#if !BREW
+ #define printf UseMprPrintfInstead
+#endif
+
+ #if FUTURE
+ #define strlen UseMprStrlenInstead
+ #define strcpy UseMprStrcpyInstead
+ #endif
+
+#endif /* UNSAFE_FUNCTIONS_OK */
+#endif /* BLD_FEATURE_SAFE_STRINGS */
+
+/******************************************************************************/
+
+struct MprBuf;
+typedef int (*MprBufProc)(struct MprBuf* bp, void *arg);
+
+/**
+ * @overview Dynamic buffer structure
+ * @description MprBuf is a flexible, dynamic growable buffer structure. It
+ * utilizes a ring buffer mechanism and is suitable for high performance
+ * buffering in a variety of situations.
+ * @stability Prototype.
+ * @library libmpr.
+ * @see mprCreateBuf, mprFree, MprArray
+ */
+typedef struct MprBuf {
+ uchar *buf; /* Actual buffer for data */
+ uchar *endbuf; /* Pointer one past the end of buffer */
+ uchar *start; /* Pointer to next data char */
+ uchar *end; /* Pointer one past the last data chr */
+ int buflen; /* Current size of buffer */
+ int maxsize; /* Max size the buffer can ever grow */
+ int growBy; /* Next growth increment to use */
+ MprBufProc refillProc; /* Auto-refill procedure */
+ void *refillArg; /* Refill arg */
+} MprBuf;
+
+/**
+ * @overview File structure
+ * @description MprFile is the cross platform File I/O abstraction control
+ * structure.
+ * @stability Prototype.
+ * @library libmpr.
+ * @see mprOpen, mprClose, mprRead, mprWrite
+ */
+typedef struct MprFile
+{
+ MprBuf *buf; /* Buffer for I/O */
+#if BREW
+ IFile *fd; /* File handle */
+#else
+ int fd;
+#endif
+} MprFile;
+
+/**
+ * File information structure
+ * @overview File information structure
+ * @description MprFileInfo is the cross platform File information structure.
+ * @stability Prototype.
+ * @see mprGetFileInfo, mprOpen, mprClose, mprRead, mprWrite
+ */
+typedef struct MprFileInfo
+{
+ uint size; /* File length */
+ uint ctime; /* Create time */
+ uint mtime; /* Modified time */
+ uint inode; /* Inode number */
+ int isDir; /* Set if directory */
+ int isReg; /* Set if a regular file */
+} MprFileInfo;
+
+/**
+ * @overview Mpr time structure.
+ * @description MprTime is the cross platform time abstraction structure.
+ * @stability Prototype.
+ * @library libmpr.
+ * @see mprGetTime
+ */
+typedef struct MprTime
+{
+ uint sec; /* Seconds */
+ uint msec; /* Milliseconds */
+} MprTime;
+
+
+/**
+ * @overview Generic array type
+ * @description The MprArray is a dynamic growable array suitable for storing
+ * pointers to arbitrary objects.
+ * @stability Prototype.
+ * @library libmpr.
+ * @see mprCreateItemArray, mprFree, MprBuf
+ */
+typedef struct MprArray
+{
+ int capacity; /* Current capacity of the array */
+ int length; /* Count of used items */
+ int incr; /* Growth increment */
+ int maxSize; /* Maximum capacity */
+ void **items;
+} MprArray;
+
+
+#if BLD_FEATURE_MULTITHREAD
+/**
+ * @overview Multithreading lock control structure
+ * @description MprLock is used for multithread locking in multithreaded
+ * applications.
+ * @library libmpr.
+ * @see mprCreateLock, mprDestroyLock, mprLock, mprUnlock
+ */
+typedef struct
+{
+ #if WIN
+ CRITICAL_SECTION cs; /* O/S critical section */
+ #endif
+ #if LINUX || MACOSX || SOLARIS
+ pthread_mutex_t cs; /* O/S critical section */
+ #endif
+ #if VXWORKS
+ SEM_ID cs; /* Semaphore */
+ #endif
+} MprLock;
+#endif
+
+/*
+ * Error and Logging callback
+ */
+typedef void (*MprLogHandler)(MPR_LOC_DEC(ctx, loc), int flags,
+ int level, const char *msg);
+
+/*
+ * Symbol table
+ * MOB -- rename hash
+ */
+typedef struct MprSymbol
+{
+ struct MprSymbol *next; /* Next symbol in hash chain */
+ char *key; /* Symbol key */
+ void *data; /* Pointer to symbol data */
+ int bucket; /* Hash bucket index */
+} MprSymbol;
+
+typedef struct MprSymbolTable
+{
+ MprSymbol **buckets;
+ int hashSize; /* Size of the buckets array */
+ int count; /* Number of symbols in the table */
+} MprSymbolTable;
+
+
+/*
+ * Memory allocation error callback
+ */
+struct MprApp;
+typedef int (*MprAllocCback)(struct MprApp *app, uint size, uint total,
+ bool granted);
+
+
+/*
+ * Slab block pointer links
+ */
+typedef struct MprSlabBlock {
+ struct MprSlabBlock *next;
+} MprSlabBlock;
+
+
+#if BLD_FEATURE_ALLOC_STATS
+/*
+ * Memory Slab Statistics
+ */
+typedef struct MprSlabStats {
+ uint allocCount; /* Number of allocated blocks */
+ uint freeCount; /* Number of blocks on the slab freelist */
+ uint peakAllocCount; /* Peak allocated */
+ uint totalAllocCount; /* Total count of allocation calls */
+ uint peakFreeCount; /* Peak on the free list */
+ MprSlabBlock *next;
+} MprSlabStats;
+#endif
+
+
+/*
+ * Slab control structure
+ */
+typedef struct MprSlab {
+ MprSlabBlock *next;
+ uint preAllocateIncr; /* Pre-allocation increment */
+#if BLD_FEATURE_ALLOC_STATS
+ MprSlabStats stats;
+#endif
+} MprSlab;
+
+/*
+ * Allocation stats (kept even in production code so we can detect memory
+ * allocation failures)
+ */
+typedef struct MprAllocStats
+{
+ uint bytesAllocated; /* Bytes currently allocated */
+ uint peakAllocated; /* Peak bytes allocated */
+ uint allocCount; /* Number of allocated blocks */
+ uint redLine; /* Warn above this level */
+ uint maxMemory; /* Max memory to allocate */
+ uint errors; /* Allocation errors */
+} MprAllocStats;
+
+/*
+ * Memory allocation control
+ */
+
+typedef struct MprAlloc {
+ MprSlab *slabs; /* Array[MPR_MAX_SLAB] of MprSlab */
+ MprAllocCback cback; /* Memory allocation callback */
+ MprAllocStats stats; /* Keep stats even in release */
+ int inAllocException; /* Recursive protect */
+} MprAlloc;
+
+
+/*
+ * MprApp State Flags
+ */
+#define MPR_APP_EXITING 0x1 /* App is exiting */
+#define MPR_APP_ALLOC_ERROR 0x2 /* App has allocation error */
+
+/* MOB -- temporary */
+#define MPR_APP_NEED_GC 0x4 /* App needs GC */
+
+/**
+ * @overview Primary MPR application control structure
+ * @description The MprApp structure stores critical application state
+ * information and is the root memory allocation context block. It is
+ * used as the MprCtx context for other memory allocations and is thus
+ * the ultimate parent of all allocated memory.
+ * \n\n
+ * The MprApp structure is allocated by the mprInit API.
+ */
+typedef struct MprApp
+{
+ uint magic; /* Corruption protection */
+ MprFile *console; /* Stdout file */
+ bool debugMode; /* Run in debug mode (no timers) */
+ MprFile *error; /* Stderr file */
+ int logLevel; /* Log trace level */
+ MprFile *logFile; /* Log file */
+ MprLogHandler logHandler; /* Current log handler callback */
+ MprSymbolTable *table;
+ char *name; /* Product name */
+ char *title; /* Product title */
+ char *version; /* Product version */
+
+#if BREW
+ uint classId; /* Brew class ID */
+ IShell *shell; /* Brew shell object */
+ IDisplay *display; /* Brew display object */
+ IFileMgr *fileMgr; /* File manager */
+ ITAPI *tapi; /* TAPI object */
+ int displayHeight; /* Display height */
+ int displayWidth; /* Display width */
+ char *args; /* Command line args */
+#endif
+
+ void *stackStart; /* Start of app stack */
+ uint maxStack; /* Max stack size recorded */
+
+ MprAlloc alloc; /* Memory allocation data */
+ int flags; /* App state flags */
+
+#if BLD_FEATURE_MULTITHREAD
+ MprLock *globalLock;
+ MprLock *allocLock;
+#endif
+} MprApp;
+
+
+/*
+ * String type. Minimum size is 8 words (32 bytes).
+ */
+#define MPR_MAX_INLINE_STR 24
+
+
+/*
+ * The block header structure for all allocated memory blocks (32 bytes)
+ * WARNING: Don't increase the size of this structure. It just fits into
+ * 32 bytes currently. Alignment requirements will double this size if you
+ * add one byte!
+ */
+typedef struct MprBlk
+{
+ MprApp *app; /* app is the top level alloc context */
+ struct MprBlk *parent; /* Parent block */
+ struct MprBlk *children; /* First child block */
+ struct MprBlk *next; /* Next sibling */
+ struct MprBlk *prev; /* Previous sibling */
+ MprDestructor destructor; /* Destructor function (optional) */
+ uint size; /* Size of block sans HDR_SIZE */
+ uint flags; /* Allocation flags and magic number */
+#if BLD_FEATURE_ALLOC_LEAK_TRACK
+ const char *location; /* Allocating code (file + line) */
+#endif
+} MprBlk;
+
+/******************************************************************************/
+/****************************** Internal Prototypes ***************************/
+/******************************************************************************/
+
+extern void mprSignalAllocError(MprCtx ctx);
+
+/******************************************************************************/
+/********************************** Prototypes ********************************/
+/******************************************************************************/
+
+extern MprApp *mprInit(MprAllocCback cback);
+extern MprApp *mprInitEx(MprAllocCback cback, void *shell);
+extern void mprTerm(MprApp *app, bool doStats);
+extern void mprSignalExit(MprCtx ctx);
+extern bool mprIsExiting(MprCtx ctx);
+extern bool mprHasAllocError(MprCtx ctx);
+
+#if BLD_DEBUG && UNUSED
+extern MprApp *mprGetApp(MprCtx ctx);
+#else
+#define mprGetApp(ctx) \
+ (((MprBlk*) ((char*) ctx - MPR_BLK_HDR_SIZE))->app)
+#endif
+
+/******************************************************************************/
+
+extern int mprSetKeyValue(MprCtx ctx, const char *key, void *ptr);
+/* MOB -- should this be delete or remove or unset */
+extern int mprRemoveKeyValue(MprCtx ctx, const char *key);
+extern void *mprGetKeyValue(MprCtx ctx, const char *key);
+/* MOB -- should be setAppName, getAppName */
+extern int mprSetAppName(MprCtx ctx, const char *name, const char *title,
+ const char *version);
+extern const char *mprGetAppName(MprCtx ctx);
+extern const char *mprGetAppTitle(MprCtx ctx);
+extern const char *mprGetAppVersion(MprCtx ctx);
+
+/*
+ * File services
+ */
+extern void mprStopFileServices(MprCtx ctx);
+extern int mprStartFileServices(MprCtx ctx);
+
+/*
+ * Item Array
+ */
+#define mprCreateItemArray(ctx, initialSize, maxSize) \
+ mprCreateItemArrayInternal(MPR_LOC_ARGS(ctx), initialSize, \
+ maxSize)
+
+extern MprArray *mprCreateItemArrayInternal(MPR_LOC_DEC(ctx, loc),
+ int initialSize, int maxSize);
+/* MOB -- should be insert not add/delete or insert / remove */
+extern int mprAddItem(MprArray *array, void *item);
+extern void mprClearItems(MprArray *array);
+extern void mprClearAndFreeItems(MprArray *array);
+extern int mprFindItem(MprArray *array, void *item);
+extern void *mprGetFirstItem(MprArray *array, int *lastIndex);
+extern void *mprGetItem(MprArray *array, int index);
+extern int mprGetItemCapacity(MprArray *array);
+extern int mprGetItemCount(MprArray *array);
+extern void *mprGetNextItem(MprArray *array, int *lastIndex);
+extern void *mprGetPrevItem(MprArray *array, int *lastIndex);
+extern int mprRemoveItem(MprArray *array, void *item);
+extern int mprRemoveItemByIndex(MprArray *array, int index);
+extern int mprRemoveRangeOfItems(MprArray *array, int start, int end);
+
+
+/*
+ * Printf replacements
+ */
+extern int mprSprintf(char *buf, int maxSize, const char *fmt, ...)
+ PRINTF_ATTRIBUTE(3,4);
+extern int mprVsprintf(char *buf, int maxSize, const char *fmt,
+ va_list arg) PRINTF_ATTRIBUTE(3,0);
+extern char *mprItoa(char *buf, int size, int value);
+extern int mprAtoi(const char *str, int radix);
+
+extern int mprPrintf(MprCtx ctx, const char *fmt, ...)
+ PRINTF_ATTRIBUTE(2,3);
+/* MOB -- NEED DOC */
+extern int mprErrorPrintf(MprCtx ctx, const char *fmt, ...)
+ PRINTF_ATTRIBUTE(2,3);
+extern int mprStaticPrintf(MprCtx ctx, const char *fmt, ...)
+ PRINTF_ATTRIBUTE(2,3);
+extern int mprPrintfError(MprCtx ctx, const char *fmt, ...)
+ PRINTF_ATTRIBUTE(2,3);
+extern int mprFprintf(MprFile *file, const char *fmt, ...)
+ PRINTF_ATTRIBUTE(2,3);
+
+/*
+ * Safe string routines
+ */
+extern char *mprGetWordTok(char *buf, int bufsize, const char *str,
+ const char *delim, const char **tok);
+extern int mprMemcpy(char *dest, int destMax, const char *src,
+ int nbytes);
+extern int mprStrcat(char *dest, int max, const char *delim,
+ const char *src, ...);
+extern int mprStrcpy(char *dest, int destMax, const char *src);
+
+extern int mprStrcmpAnyCase(const char *str1, const char *str2);
+extern int mprStrcmpAnyCaseCount(const char *str1, const char *str2,
+ int len);
+extern int mprStrlen(const char *src, int max);
+
+extern char *mprStrLower(char *str);
+extern char *mprStrUpper(char *str);
+extern char *mprStrTrim(char *str, const char *set);
+extern char *mprStrTok(char *str, const char *delim, char **last);
+
+/*
+ * Symbol table
+ */
+extern MprSymbolTable *mprCreateSymbolTable(MprCtx ctx, int hashSize);
+extern MprSymbol *mprGetFirstSymbol(MprSymbolTable *table);
+extern MprSymbol *mprGetNextSymbol(MprSymbolTable *table, MprSymbol *last);
+extern int mprGetSymbolCount(MprSymbolTable *table);
+extern MprSymbol *mprInsertSymbol(MprSymbolTable *table, const char *key,
+ void *ptr);
+extern void *mprLookupSymbol(MprSymbolTable *table, const char *key);
+extern int mprRemoveSymbol(MprSymbolTable *table, const char *key);
+
+/*
+ * File I/O support
+ */
+extern void mprClose(MprFile *file);
+extern int mprDelete(MprCtx ctx, const char *path);
+extern int mprDeleteDir(MprCtx ctx, const char *path);
+extern int mprGetFileInfo(MprCtx ctx, const char *path, MprFileInfo *info);
+extern char *mprGets(MprFile *file, char *buf, uint size);
+extern int mprMakeDir(MprCtx ctx, const char *path, int perms);
+extern MprFile *mprOpen(MprCtx ctx, const char *path, int omode, int perms);
+extern int mprPuts(MprFile *file, const char *buf, uint size);
+extern int mprRead(MprFile *file, void *buf, uint size);
+extern int mprSeek(MprFile *file, int seekType, long distance);
+extern int mprWrite(MprFile *file, const void *buf, uint count);
+
+extern int mprMakeTempFileName(MprCtx ctx, char *buf, int bufsize,
+ const char *tmpDir);
+
+
+/*
+ * Error handling and logging
+ */
+extern void mprSetLogHandler(MprCtx ctx, MprLogHandler handler);
+extern MprLogHandler mprGetLogHandler(MprCtx ctx);
+
+extern void mprAssertError(MPR_LOC_DEC(ctx, loc), const char *msg);
+extern void mprError(MPR_LOC_DEC(ctx, loc),
+ const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
+extern void mprFatalError(MPR_LOC_DEC(ctx, loc),
+ const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
+extern void mprLog(MprCtx ctx, int level,
+ const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
+extern void mprRawLog(MprCtx ctx, const char *fmt, ...);
+extern void mprStaticAssert(const char *loc, const char *msg);
+extern void mprStaticError(MPR_LOC_DEC(ctx, loc),
+ const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
+extern void mprUserError(MPR_LOC_DEC(ctx, loc),
+ const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
+
+/*
+ * Dynamic Buffering routines
+ */
+extern MprBuf *mprCreateBuf(MprCtx ctx, int initialSize, int maxSize);
+extern char *mprStealBuf(MprCtx ctx, MprBuf *bp);
+extern void mprAddNullToBuf(MprBuf *bp);
+extern void mprAdjustBufStart(MprBuf *bp, int size);
+extern void mprAdjustBufEnd(MprBuf *bp, int size);
+extern void mprCopyBufDown(MprBuf *bp);
+extern void mprFlushBuf(MprBuf *bp);
+extern int mprGetCharFromBuf(MprBuf *bp);
+extern int mprGetBlockFromBuf(MprBuf *bp, uchar *buf, int len);
+extern int mprGetBufLength(MprBuf *bp);
+extern int mprGetBufLinearSpace(MprBuf *bp);
+extern int mprGetBufLinearData(MprBuf *bp);
+extern char *mprGetBufOrigin(MprBuf *bp);
+extern int mprGetBufSize(MprBuf *bp);
+extern int mprGetBufSpace(MprBuf *bp);
+extern char *mprGetBufStart(MprBuf *bp);
+extern char *mprGetBufEnd(MprBuf *bp);
+extern int mprInsertCharToBuf(MprBuf *bp, int c);
+extern int mprLookAtNextCharInBuf(MprBuf *bp);
+extern int mprLookAtLastCharInBuf(MprBuf *bp);
+extern int mprPutCharToBuf(MprBuf *bp, int c);
+extern int mprPutBlockToBuf(MprBuf *bp, const char *str, int size);
+extern int mprPutIntToBuf(MprBuf *bp, int i);
+extern int mprPutStringToBuf(MprBuf *bp, const char *str);
+extern int mprPutFmtStringToBuf(MprBuf *bp, const char *fmt, ...);
+extern int mprRefillBuf(MprBuf *bp);
+extern void mprResetBufIfEmpty(MprBuf *bp);
+extern void mprSetBufSize(MprBuf *bp, int initialSize, int maxSize);
+extern MprBufProc mprGetBufRefillProc(MprBuf *bp);
+extern void mprSetBufRefillProc(MprBuf *bp, MprBufProc fn, void *arg);
+
+/*
+ * General other xPlatform routines
+ */
+extern const char *mprGetBaseName(const char *name);
+extern bool mprGetDebugMode(MprCtx ctx);
+extern char *mprGetDirName(char *buf, int bufsize, const char *path);
+extern char *mprGetFullPathName(char *buf, int buflen, const char *path);
+extern int mprGetLogLevel(MprCtx ctx);
+extern int mprGetOsError();
+
+
+extern int mprMakeArgv(MprCtx ctx, const char *prog, const char *cmd,
+ char ***argv, int *argc);
+extern int mprMakeDirPath(MprCtx ctx, const char *path);
+extern void mprSetDebugMode(MprCtx ctx, bool on);
+extern void mprSetLogLevel(MprCtx ctx, int level);
+extern void mprSleep(MprCtx ctx, int msec);
+extern void mprSetShell(MprCtx ctx, void *shell);
+extern void *mprGetShell(MprCtx ctx);
+extern void mprSetClassId(MprCtx ctx, uint classId);
+extern uint mprGetClassId(MprCtx ctx);
+
+#if BREW
+extern void mprSetDisplay(MprCtx ctx, void *display);
+extern void *mprGetDisplay(MprCtx ctx);
+extern void mprSetFileMgr(MprCtx ctx, void *fileMgr);
+extern void *mprGetFileMgr(MprCtx ctx);
+#else
+extern char *mprInetToStr(char *buf, int size, const struct in_addr in);
+#endif
+
+/*
+ * Memory allocation
+ */
+extern MprApp *mprAllocInit(MprAllocCback cback);
+extern void mprAllocTerm(MprApp *app);
+extern void mprAllocAbort();
+
+extern void *mprAllocBlock(MPR_LOC_DEC(ctx, loc), uint size);
+extern void *mprAllocZeroedBlock(MPR_LOC_DEC(ctx, loc), uint size);
+extern void *mprReallocBlock(MPR_LOC_DEC(ctx, loc), void *ptr, uint size);
+extern int mprFree(void *ptr);
+extern int mprStealAllocBlock(MPR_LOC_DEC(ctx, loc), const void *ptr);
+extern void *mprMemdupInternal(MPR_LOC_DEC(ctx, loc), const void *ptr,
+ uint size);
+extern char *mprStrndupInternal(MPR_LOC_DEC(ctx, loc), const char *str,
+ uint size);
+extern char *mprStrdupInternal(MPR_LOC_DEC(ctx, loc), const char *str);
+
+extern void *mprSlabAllocBlock(MPR_LOC_DEC(ctx, loc), uint size, uint inc);
+extern void *mprSlabAllocZeroedBlock(MPR_LOC_DEC(ctx, loc), uint size,
+ uint inc);
+
+extern uint mprGetAllocBlockSize(MprCtx ctx);
+extern uint mprGetAllocBlockCount(MprCtx ctx);
+extern uint mprGetAllocBlockMemory(MprCtx ctx);
+extern void *mprGetAllocParent(MprCtx ctx);
+extern uint mprGetAllocatedMemory(MprCtx ctx);
+extern uint mprGetPeakAllocatedMemory(MprCtx ctx);
+extern uint mprGetAllocatedSlabMemory(MprCtx ctx);
+extern int mprIsAllocBlockValid(MprCtx ctx);
+extern int mprStackCheck(MprCtx ctx);
+extern int mprStackSize(MprCtx ctx);
+extern int mprGetAllocErrors(MprCtx ctx);
+extern void mprClearAllocErrors(MprCtx ctx);
+
+extern MprDestructor mprSetDestructor(MprCtx ctx, MprDestructor destructor);
+extern MprAllocCback mprSetAllocCallback(MprApp *app, MprAllocCback cback);
+extern void mprSetAllocLimits(MprApp *app, uint redLine, uint maxMemory);
+
+#if BLD_FEATURE_ALLOC_STATS
+extern MprSlabStats *mprGetSlabAllocStats(MprApp *app, int slabIndex);
+extern MprAllocStats *mprGetAllocStats(MprApp *app);
+extern void mprPrintAllocReport(MprApp *app, bool doBlocks,
+ const char *msg);
+#endif
+
+#if BLD_DEBUG
+extern int mprPrintAllocBlocks(MprCtx ctx, int indent);
+extern const char *mprGetAllocLocation(MprCtx ptr);
+#endif
+
+extern int mprValidateBlock(MprCtx ctx);
+extern int mprValidateAllocTree(MprCtx ptr);
+extern void mprSetRequiredAlloc(MprCtx ptr, bool recurse);
+
+/*
+ * Sprintf style allocators
+ */
+extern int mprAllocSprintf(MPR_LOC_DEC(ctx, loc), char **buf, int maxSize,
+ const char *fmt, ...) PRINTF_ATTRIBUTE(5,6);
+extern int mprAllocVsprintf(MPR_LOC_DEC(ctx, loc), char **buf, int maxSize,
+ const char *fmt, va_list arg) PRINTF_ATTRIBUTE(5,0);
+extern int mprAllocMemcpy(MPR_LOC_DEC(ctx, loc), char **dest, int destMax,
+ const void *src, int nbytes);
+extern int mprAllocStrcat(MPR_LOC_DEC(ctx, loc), char **dest, int max,
+ const char *delim, const char *src, ...);
+extern int mprAllocStrcpy(MPR_LOC_DEC(ctx, loc), char **dest, int max,
+ const char *src);
+extern int mprReallocStrcat(MPR_LOC_DEC(ctx, loc), char **dest, int max,
+ int existingLen, const char *delim, const char *src, ...);
+
+/*
+ * MACROS: These are the convenience macros to automatically supply file
+ * names and line numbers when debugging.
+ */
+#define mprNew(ctx) new(MPR_LOC_ARGS(ctx))
+
+#define mprAlloc(ctx, size) mprAllocBlock(MPR_LOC_ARGS(ctx), size)
+
+#define mprAllocZeroed(ctx, size) mprAllocZeroedBlock(MPR_LOC_ARGS(ctx), size)
+
+#define mprSlabAlloc(ctx, size, inc) \
+ ((type*) mprSlabAllocBlock(MPR_LOC_ARGS(ctx), size, inc))
+
+#define mprSlabAllocZeroed(ctx, size, inc) \
+ ((type*) mprSlabAllocBlock(MPR_LOC_ARGS(ctx), size, inc))
+
+#define mprRealloc(ctx, ptr, size) mprReallocBlock(MPR_LOC_ARGS(ctx), ptr, size)
+
+#define mprMemdup(ctx, ptr, size) \
+ mprMemdupInternal(MPR_LOC_ARGS(ctx), ptr, size)
+
+#define mprStrdup(ctx, str) mprStrdupInternal(MPR_LOC_ARGS(ctx), str)
+
+#define mprStrndup(ctx, str, size) mprStrndupDebug(MPR_LOC_ARGS(ctx), str, size)
+
+/*
+ * Allocate type macros
+ */
+#define mprAllocType(ctx, type) \
+ ((type*) mprAllocBlock(MPR_LOC_ARGS(ctx), sizeof(type)))
+
+#define mprAllocTypeZeroed(ctx, type) \
+ ((type*) mprAllocZeroedBlock(MPR_LOC_ARGS(ctx), sizeof(type)))
+
+#define mprSlabAllocType(ctx, type, inc) \
+ ((type*) mprSlabAllocBlock(MPR_LOC_ARGS(ctx), sizeof(type), inc))
+
+#define mprSlabAllocTypeZeroed(ctx, type, inc) \
+ ((type*) mprSlabAllocZeroedBlock(MPR_LOC_ARGS(ctx), sizeof(type), \
+ inc))
+
+/*
+ * Multithread locking
+ */
+#if BLD_FEATURE_MULTITHREAD
+extern void mprInitThreads(MprApp *app);
+extern void mprTermThreads(MprApp *app);
+extern MprLock *mprCreateLock(MprCtx ctx);
+extern void mprDestroyLock(MprLock *lock);
+extern void mprLock(MprLock *lock);
+extern int mprTryLock(MprLock *lock);
+extern void mprUnlock(MprLock *lock);
+extern void mprGlobalLock(MprCtx ctx);
+extern void mprGlobalUnlock(MprCtx ctx);
+extern int mprGetCurrentThreadID();
+#else
+/*
+ * Disable multithreading
+ */
+#define mprInitThreads(ctx, app)
+#define mprTermThreads(app)
+#define mprCreateLock(ctx)
+#define mprDestroyLock(lock)
+#define mprLock(lock)
+#define mprTryLock(lock)
+#define mprUnlock(lock)
+#define mprGlobalLock(app)
+#define mprGlobalUnlock(app)
+#define mprGetCurrentThreadID()
+#endif
+
+/*
+ * Time
+ */
+extern MprTime *mprGetTime(MprCtx ctx, MprTime *tp);
+extern int mprGetTimeRemaining(MprCtx ctx, MprTime mark, uint timeout);
+extern int mprGetElapsedTime(MprCtx ctx, MprTime mark);
+extern int mprCompareTime(MprTime *t1, MprTime *t2);
+extern uint mprSubtractTime(MprTime *t1, MprTime *t2);
+extern void mprAddElapsedToTime(MprTime *time, uint elapsed);
+
+#if !BREW
+extern int mprAsctime(MprCtx ctx, char *buf, int bufsize,
+ const struct tm *timeptr);
+extern int mprCtime(MprCtx ctx, char *buf, int bufsize,
+ const time_t *timer);
+extern struct tm *mprLocaltime(MprCtx ctx, struct tm *timep, time_t *now);
+extern struct tm *mprGmtime(MprCtx ctx, time_t* now, struct tm *timep);
+extern int mprRfcTime(MprCtx ctx, char *buf, int bufsize,
+ const struct tm *timep);
+#endif /* !BREW */
+
+/*
+ * Host name
+ */
+extern struct hostent* mprGetHostByName(MprCtx ctx, const char *name);
+
+#if WIN
+extern int mprReadRegistry(MprCtx ctx, char **buf, int max,
+ const char *key, const char *val);
+extern int mprWriteRegistry(MprCtx ctx, const char *key, const char *name,
+ const char *value);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_MPR */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim:tw=78
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */