1/*
2 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16/**
17 * @file picopal.h
18 *
19 * pico plattform abstraction layer
20 *
21 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
22 * All rights reserved.
23 *
24 * History:
25 * - 2009-04-20 -- initial version
26 *
27 */
28/**
29 * @addtogroup picoos
30
31 * <b> Operating system Platform Specific implementation module </b>\n
32 *
33*/
34#ifndef PICOPAL_H_
35#define PICOPAL_H_
36
37#include <stdio.h>
38#include <stdlib.h>
39#include <stdarg.h>
40#include <math.h>
41#include <stddef.h>
42#include "picopltf.h"
43#include "picodefs.h"
44
45#ifdef __cplusplus
46extern "C" {
47#endif
48#if 0
49}
50#endif
51
52
53/* *********************************************************/
54/* general defines and typedefs (used to be in picodefs.h) */
55/* *********************************************************/
56
57#define TRUE 1
58#define FALSE 0
59
60#ifndef NULL
61#define NULL 0
62#endif
63
64#define NULLC '\000'
65
66
67/* "strange" defines to switch variants... */
68#define PICOPAL_DIV_USE_INV 0
69
70
71/*---------------Externals-----------------------*/
72/* used by picocep*/
73#if defined(PICO_DEBUG)
74    extern int numlongmult, numshortmult;
75#endif
76
77
78typedef signed int pico_status_t;
79
80
81/* unfortunately, ANSI-C uses eof for results and exceptional results .. */
82/* in the context of reading from a CharBuffer, eof means "no more
83   input available FOR NOW" */
84
85#define PICO_EOF                        (pico_status_t)    -1
86
87
88/* *************************************************/
89/* constants                                       */
90/* *************************************************/
91
92
93  /* operating system identifications */
94#define PICOPAL_OS_NIL        0  /* just an unchangeable first value */
95#define PICOPAL_OS_WINDOWS    1
96/* ... */
97#define PICOPAL_OS_GENERIC   99 /* must always be the last value */
98
99/* *************************************************/
100/* types                                           */
101/* *************************************************/
102
103typedef unsigned char   picopal_uint8;
104typedef unsigned short  picopal_uint16;
105typedef unsigned int    picopal_uint32;
106
107typedef signed char     picopal_int8;
108typedef signed short    picopal_int16;
109typedef signed int      picopal_int32;
110
111typedef float           picopal_single;
112typedef double          picopal_double;
113
114typedef unsigned char     picopal_char;
115
116typedef unsigned char   picopal_uchar;
117
118typedef size_t    picopal_objsize_t;
119typedef ptrdiff_t picopal_ptrdiff_t;
120
121/* *************************************************/
122/* functions                                       */
123/* *************************************************/
124
125picopal_int32 picopal_atoi(const picopal_char *);
126
127picopal_int32 picopal_strcmp(const picopal_char *, const picopal_char *);
128picopal_int32 picopal_strncmp(const picopal_char *a, const picopal_char *b, picopal_objsize_t siz);
129picopal_objsize_t picopal_strlen(const picopal_char *);
130picopal_char * picopal_strchr(const picopal_char *, picopal_char);
131picopal_char * picopal_strcpy(picopal_char *d, const picopal_char *s);
132picopal_char *picopal_strstr(const picopal_char *s, const picopal_char *substr);
133picopal_char *picopal_strcat(picopal_char *dest, const picopal_char *src);
134picopal_int16 picopal_sprintf(picopal_char * dst, const picopal_char *fmt, ...);
135
136/* copies 'length' bytes from 'src' to 'dest'. (regions may be overlapping) no error checks! */
137void * picopal_mem_copy(const void * src, void * dst,  picopal_objsize_t length);
138
139/* sets 'length' bytes starting at dest[0] to 'byte_val' */
140void * picopal_mem_set(void * dest, picopal_uint8 byte_val, picopal_objsize_t length);
141
142/* safe versions */
143picopal_objsize_t picopal_vslprintf(picopal_char * dst, picopal_objsize_t siz, const picopal_char *fmt, va_list args);
144picopal_objsize_t picopal_slprintf(picopal_char * dst, picopal_objsize_t siz, const picopal_char *fmt, /*args*/ ...);
145picopal_objsize_t picopal_strlcpy(picopal_char *dst, const picopal_char *src, picopal_objsize_t siz);
146
147/*Fixed point computation*/
148/*
149picopal_int32 picopal_fixptdiv(picopal_int32 a, picopal_int32 b, picopal_uint8 bigpow);
150picopal_int32 picopal_fixptmult(picopal_int32 x, picopal_int32 y, picopal_uint8 bigpow);
151picopal_int32 picopal_fixptdivORinv(picopal_int32 a, picopal_int32 b, picopal_int32 invb, picopal_uint8 bigpow);
152picopal_int32 picopal_fixptmultdouble(picopal_int32 x, picopal_int32 y, picopal_uint8 bigpow);
153picopal_uint8 picopal_highestBit(picopal_int32 x);
154*/
155
156/* *************************************************/
157/* math                                            */
158/* *************************************************/
159
160picopal_double picopal_cos (const picopal_double cos_arg);
161picopal_double picopal_sin (const picopal_double sin_arg);
162picopal_double picopal_fabs (const picopal_double fabs_arg);
163
164
165
166
167/* *************************************************/
168/* file access                                     */
169/* *************************************************/
170
171extern picopal_char picopal_eol(void);
172
173#define picopal_FILE      FILE
174
175
176/* seek modes to be used with the 'FSeek' procedure */
177#define PICOPAL_SEEK_SET     0   /* absolut seek position */
178#define PICOPAL_SEEK_CUR     1   /* relative to current */
179#define PICOPAL_SEEK_END     2   /* relative to the end of the file */
180
181
182typedef enum {PICOPAL_BINARY_READ, PICOPAL_BINARY_WRITE, PICOPAL_TEXT_READ, PICOPAL_TEXT_WRITE}  picopal_access_mode;
183
184typedef picopal_FILE * picopal_File;
185
186extern picopal_File picopal_fopen (picopal_char fileName[], picopal_access_mode mode);
187/* 'FOpen' opens the file with name 'filename'. Depending on
188   'mode' :
189      'TextRead'    : Opens an existing text file for reading.
190                      The file is positioned at the beginning of the file.
191      'TextWrite'   : Opens and truncates an existing file or creates a new
192                      text file for writing. The file is positioned at the
193                      beginning.
194      'BinaryRead'  : Opens an existing binary file for reading.
195                      The file is positioned at the beginning of the file.
196      'BinaryWrite' : Opens and truncates an existing file or creates a new
197                      binary file for writing. The file is positioned at the
198                      beginning.
199    If the opening of the file is successful a file pointer is given
200    back. Otherwise a NIL-File is given back.
201*/
202
203
204extern picopal_File picopal_get_fnil (void);
205
206
207extern  picopal_int8 picopal_is_fnil (picopal_File f);
208
209
210extern pico_status_t picopal_fclose (picopal_File f);
211
212
213extern picopal_uint32 picopal_flength (picopal_File f);
214
215
216extern  picopal_uint8 picopal_feof (picopal_File f);
217
218
219extern pico_status_t picopal_fseek (picopal_File f, picopal_uint32 offset, picopal_int8 seekmode);
220
221
222extern pico_status_t picopal_fget_char (picopal_File f, picopal_char * ch);
223
224
225extern picopal_objsize_t picopal_fread_bytes (picopal_File f, void * ptr, picopal_objsize_t objsize, picopal_uint32 nobj);
226
227extern picopal_objsize_t picopal_fwrite_bytes (picopal_File f, void * ptr, picopal_objsize_t objsize, picopal_uint32 nobj);
228
229
230extern pico_status_t picopal_fflush (picopal_File f);
231
232/*
233extern pico_status_t picopal_fput_char (picopal_File f, picopal_char ch);
234*/
235
236
237/*
238extern pico_status_t picopal_remove (picopal_char filename[]);
239
240
241extern pico_status_t picopal_rename (picopal_char oldname[], picopal_char newname[]);
242
243*/
244
245/* *************************************************/
246/* functions for debugging/testing purposes only   */
247/* *************************************************/
248
249/**
250 * Returns a pointer to a newly allocated chunk of 'size' bytes, aligned
251 * to the system page size.
252 * Memory allocated by this routine may be protected by calling function
253 * picopal_mrp_protect().
254 */
255void *picopal_mpr_alloc(picopal_objsize_t size);
256
257/**
258 * Releases the chunk of memory pointed to by '*p'. 'p' must be previously
259 * allocated by a call to picopal_mpr_alloc().
260 */
261void picopal_mpr_free(void **p);
262
263#define PICOPAL_PROT_NONE   0   /* the memory cannot be accessed at all */
264#define PICOPAL_PROT_READ   1   /* the memory can be read */
265#define PICOPAL_PROT_WRITE  2   /* the memory can be written to */
266
267/**
268 * Specifies the desired protection 'prot' for the memory page(s) containing
269 * part or all of the interval [addr, addr+len-1]. If an access is disallowed
270 * by the protection given it, the program receives a SIGSEGV.
271 */
272pico_status_t picopal_mpr_protect(void *addr, picopal_objsize_t len, picopal_int16 prot);
273
274/* Fast, Compact Approximation of the Exponential Function */
275picopal_double picopal_quick_exp(const picopal_double y);
276
277/* *************************************************/
278/* types functions for time measurement            */
279/* *************************************************/
280
281extern void picopal_get_timer(picopal_uint32 * sec, picopal_uint32 * usec);
282
283#ifdef __cplusplus
284}
285#endif
286
287
288#endif /*PICOPAL_H_*/
289