/******************************************************************************* * Copyright (c) 2000, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ #include #include #include "NgCommon.h" /* Non-zero = big-endian architecture */ static BYTE4 hostIsMSB = 0; /* Store last error msg */ #define MAX_MSG_SIZE 100 char errorMsg[MAX_MSG_SIZE]; /* Library initialization */ void NgInit() { BYTE4 result = (BYTE4) 'A'; /* determine the byte ordering of the host machine */ hostIsMSB = (BYTE4) (*((char *) &result) != 'A'); errorMsg[0] = 0; } /** * Memory allocation routine */ void *NgMalloc (UBYTE4 size) { return malloc (size); } /** * Memory allocation routine */ void NgFree (void *memblock) { if (memblock != NULL) free (memblock); } void NgMemSet (void *dest, UBYTE1 c, BYTE4 count) { memset (dest, c, count); } void NgMemCpy (void *dest, void *src, BYTE4 count) { memcpy (dest, src, count); } /** * Error Reporting */ ng_err_t NgError (ng_err_t error_type, char* msg) { if (msg != NULL) { /* Store a copy of the last error msg - truncate if necessary */ size_t size = strlen (msg); if (size >= MAX_MSG_SIZE) size = MAX_MSG_SIZE - 1; NgMemCpy (errorMsg, msg, size); errorMsg[size] = 0; } return error_type; } const char *NgGetLastErrorMsg() { return errorMsg; } /** * Stream manipulation routines */ ng_err_t NgStreamInit (ng_stream_t *stream, char *fullname) { stream->file = fopen (fullname, "rb"); stream->size = 0; stream->pos = 0; if (stream->file == NULL) return NgError (ERR_NG, "Can't open file"); return ERR_OK; } void NgStreamClose (ng_stream_t *stream) { if (stream->file != NULL) { fclose (stream->file); stream->file = NULL; } stream->size = -1; } char NgStreamEof (ng_stream_t *stream) { return stream->size == -1; } BYTE4 NgStreamGetPosition (ng_stream_t *stream) { return stream->pos; } BYTE4 NgStreamSkip (ng_stream_t *stream, BYTE4 nbr) { if (stream->size == -1) return 0; if (fseek (stream->file, nbr, SEEK_CUR)) { NgStreamClose (stream); return 0; } stream->pos += nbr; return nbr; } BYTE4 NgStreamRead (ng_stream_t *stream, char *buffer, BYTE4 nbr) { size_t cnt; if (stream->size == -1) return 0; cnt = fread (buffer, sizeof (char), nbr, stream->file); if (cnt != nbr) { NgStreamClose (stream); return 0; } stream->pos += nbr; return nbr; } BYTE1 NgIsMSB() { return hostIsMSB != 0; } UBYTE2 SystemToLittleEndianUBYTE2 (UBYTE2 value) { return hostIsMSB ? ((value&0xFF) << 8)|((value&0xFF00)>>8) : value; } UBYTE4 SystemToLittleEndianUBYTE4 (UBYTE4 value) { return hostIsMSB ? ((value&0xFF000000L)>>24)|((value&0xFF0000L)>>8) | ((value&0xFF00L)<<8) | ((value&0xFFL)<<24) : value; } UBYTE2 SystemToBigEndianUBYTE2 (UBYTE2 value) { return hostIsMSB ? value : ((value&0xFF) << 8)|((value&0xFF00)>>8); } UBYTE2 LittleEndianToSystemUBYTE2 (UBYTE2 value) { return hostIsMSB ? ((value&0xFF) << 8)|((value&0xFF00)>>8) : value; } UBYTE4 LittleEndianToSystemUBYTE4 (UBYTE4 value) { return hostIsMSB ? ((value&0xFF000000L)>>24)|((value&0xFF0000L)>>8) | ((value&0xFF00L)<<8) | ((value&0xFFL)<<24) : value; } UBYTE2 BigEndianToSystemUBYTE2 (UBYTE2 value) { return hostIsMSB ? value : ((value&0xFF) << 8)|((value&0xFF00)>>8); } UBYTE4 BigEndianToSystemUBYTE4 (UBYTE4 value) { return hostIsMSB ? value : ((value&0xFF000000L)>>24)|((value&0xFF0000L)>>8)|((value&0xFF00L)<<8) | ((value&0xFFL)<<24); }