/* * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland * Modifications (C) 2019 Paolo Jovon * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file picopal.h * * pico plattform abstraction layer * * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland * All rights reserved. * * History: * - 2009-04-20 -- initial version * - 2019-08-28 -- added picopal_uintptr_t * */ /** * @addtogroup picoos * Operating system Platform Specific implementation module \n * */ #ifndef PICOPAL_H_ #define PICOPAL_H_ #include #include #include #include #include #include #include "picopltf.h" #include "picodefs.h" #ifdef __cplusplus extern "C" { #endif #if 0 } #endif /* *********************************************************/ /* general defines and typedefs (used to be in picodefs.h) */ /* *********************************************************/ #define TRUE 1 #define FALSE 0 #ifndef NULL #define NULL 0 #endif #define NULLC '\000' /* "strange" defines to switch variants... */ #define PICOPAL_DIV_USE_INV 0 /*---------------Externals-----------------------*/ /* used by picocep*/ #if defined(PICO_DEBUG) extern int numlongmult, numshortmult; #endif typedef signed int pico_status_t; /* unfortunately, ANSI-C uses eof for results and exceptional results .. */ /* in the context of reading from a CharBuffer, eof means "no more input available FOR NOW" */ #define PICO_EOF (pico_status_t) -1 /* *************************************************/ /* constants */ /* *************************************************/ /* operating system identifications */ #define PICOPAL_OS_NIL 0 /* just an unchangeable first value */ #define PICOPAL_OS_WINDOWS 1 /* ... */ #define PICOPAL_OS_GENERIC 99 /* must always be the last value */ /* *************************************************/ /* types */ /* *************************************************/ typedef unsigned char picopal_uint8; typedef unsigned short picopal_uint16; typedef unsigned int picopal_uint32; typedef signed char picopal_int8; typedef signed short picopal_int16; typedef signed int picopal_int32; typedef float picopal_single; typedef double picopal_double; typedef unsigned char picopal_char; typedef unsigned char picopal_uchar; typedef size_t picopal_objsize_t; typedef ptrdiff_t picopal_ptrdiff_t; typedef uintptr_t picopal_uintptr_t; /* *************************************************/ /* functions */ /* *************************************************/ picopal_int32 picopal_atoi(const picopal_char *); picopal_int32 picopal_strcmp(const picopal_char *, const picopal_char *); picopal_int32 picopal_strncmp(const picopal_char *a, const picopal_char *b, picopal_objsize_t siz); picopal_objsize_t picopal_strlen(const picopal_char *); picopal_char * picopal_strchr(const picopal_char *, picopal_char); picopal_char * picopal_strcpy(picopal_char *d, const picopal_char *s); picopal_char *picopal_strstr(const picopal_char *s, const picopal_char *substr); picopal_char *picopal_strcat(picopal_char *dest, const picopal_char *src); picopal_int16 picopal_sprintf(picopal_char * dst, const picopal_char *fmt, ...); /* copies 'length' bytes from 'src' to 'dest'. (regions may be overlapping) no error checks! */ void * picopal_mem_copy(const void * src, void * dst, picopal_objsize_t length); /* sets 'length' bytes starting at dest[0] to 'byte_val' */ void * picopal_mem_set(void * dest, picopal_uint8 byte_val, picopal_objsize_t length); /* safe versions */ picopal_objsize_t picopal_vslprintf(picopal_char * dst, picopal_objsize_t siz, const picopal_char *fmt, va_list args); picopal_objsize_t picopal_slprintf(picopal_char * dst, picopal_objsize_t siz, const picopal_char *fmt, /*args*/ ...); picopal_objsize_t picopal_strlcpy(picopal_char *dst, const picopal_char *src, picopal_objsize_t siz); /*Fixed point computation*/ /* picopal_int32 picopal_fixptdiv(picopal_int32 a, picopal_int32 b, picopal_uint8 bigpow); picopal_int32 picopal_fixptmult(picopal_int32 x, picopal_int32 y, picopal_uint8 bigpow); picopal_int32 picopal_fixptdivORinv(picopal_int32 a, picopal_int32 b, picopal_int32 invb, picopal_uint8 bigpow); picopal_int32 picopal_fixptmultdouble(picopal_int32 x, picopal_int32 y, picopal_uint8 bigpow); picopal_uint8 picopal_highestBit(picopal_int32 x); */ /* *************************************************/ /* math */ /* *************************************************/ picopal_double picopal_cos (const picopal_double cos_arg); picopal_double picopal_sin (const picopal_double sin_arg); picopal_double picopal_fabs (const picopal_double fabs_arg); /* *************************************************/ /* file access */ /* *************************************************/ extern picopal_char picopal_eol(void); #define picopal_FILE FILE /* seek modes to be used with the 'FSeek' procedure */ #define PICOPAL_SEEK_SET 0 /* absolut seek position */ #define PICOPAL_SEEK_CUR 1 /* relative to current */ #define PICOPAL_SEEK_END 2 /* relative to the end of the file */ typedef enum {PICOPAL_BINARY_READ, PICOPAL_BINARY_WRITE, PICOPAL_TEXT_READ, PICOPAL_TEXT_WRITE} picopal_access_mode; typedef picopal_FILE * picopal_File; extern picopal_File picopal_fopen (picopal_char fileName[], picopal_access_mode mode); /* 'FOpen' opens the file with name 'filename'. Depending on 'mode' : 'TextRead' : Opens an existing text file for reading. The file is positioned at the beginning of the file. 'TextWrite' : Opens and truncates an existing file or creates a new text file for writing. The file is positioned at the beginning. 'BinaryRead' : Opens an existing binary file for reading. The file is positioned at the beginning of the file. 'BinaryWrite' : Opens and truncates an existing file or creates a new binary file for writing. The file is positioned at the beginning. If the opening of the file is successful a file pointer is given back. Otherwise a NIL-File is given back. */ extern picopal_File picopal_get_fnil (void); extern picopal_int8 picopal_is_fnil (picopal_File f); extern pico_status_t picopal_fclose (picopal_File f); extern picopal_uint32 picopal_flength (picopal_File f); extern picopal_uint8 picopal_feof (picopal_File f); extern pico_status_t picopal_fseek (picopal_File f, picopal_uint32 offset, picopal_int8 seekmode); extern pico_status_t picopal_fget_char (picopal_File f, picopal_char * ch); extern picopal_objsize_t picopal_fread_bytes (picopal_File f, void * ptr, picopal_objsize_t objsize, picopal_uint32 nobj); extern picopal_objsize_t picopal_fwrite_bytes (picopal_File f, void * ptr, picopal_objsize_t objsize, picopal_uint32 nobj); extern pico_status_t picopal_fflush (picopal_File f); /* extern pico_status_t picopal_fput_char (picopal_File f, picopal_char ch); */ /* extern pico_status_t picopal_remove (picopal_char filename[]); extern pico_status_t picopal_rename (picopal_char oldname[], picopal_char newname[]); */ /* *************************************************/ /* functions for debugging/testing purposes only */ /* *************************************************/ /** * Returns a pointer to a newly allocated chunk of 'size' bytes, aligned * to the system page size. * Memory allocated by this routine may be protected by calling function * picopal_mrp_protect(). */ void *picopal_mpr_alloc(picopal_objsize_t size); /** * Releases the chunk of memory pointed to by '*p'. 'p' must be previously * allocated by a call to picopal_mpr_alloc(). */ void picopal_mpr_free(void **p); #define PICOPAL_PROT_NONE 0 /* the memory cannot be accessed at all */ #define PICOPAL_PROT_READ 1 /* the memory can be read */ #define PICOPAL_PROT_WRITE 2 /* the memory can be written to */ /** * Specifies the desired protection 'prot' for the memory page(s) containing * part or all of the interval [addr, addr+len-1]. If an access is disallowed * by the protection given it, the program receives a SIGSEGV. */ pico_status_t picopal_mpr_protect(void *addr, picopal_objsize_t len, picopal_int16 prot); /* Fast, Compact Approximation of the Exponential Function */ picopal_double picopal_quick_exp(const picopal_double y); /* *************************************************/ /* types functions for time measurement */ /* *************************************************/ extern void picopal_get_timer(picopal_uint32 * sec, picopal_uint32 * usec); #ifdef __cplusplus } #endif #endif /*PICOPAL_H_*/