diff options
Diffstat (limited to 'source4/lib/appweb/ejs-2.0/mpr/mpr.h')
-rw-r--r-- | source4/lib/appweb/ejs-2.0/mpr/mpr.h | 1027 |
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 + */ |