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
46 extern "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 
78 typedef 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 
103 typedef unsigned char   picopal_uint8;
104 typedef unsigned short  picopal_uint16;
105 typedef unsigned int    picopal_uint32;
106 
107 typedef signed char     picopal_int8;
108 typedef signed short    picopal_int16;
109 typedef signed int      picopal_int32;
110 
111 typedef float           picopal_single;
112 typedef double          picopal_double;
113 
114 typedef unsigned char     picopal_char;
115 
116 typedef unsigned char   picopal_uchar;
117 
118 typedef size_t    picopal_objsize_t;
119 typedef ptrdiff_t picopal_ptrdiff_t;
120 
121 /* *************************************************/
122 /* functions                                       */
123 /* *************************************************/
124 
125 picopal_int32 picopal_atoi(const picopal_char *);
126 
127 picopal_int32 picopal_strcmp(const picopal_char *, const picopal_char *);
128 picopal_int32 picopal_strncmp(const picopal_char *a, const picopal_char *b, picopal_objsize_t siz);
129 picopal_objsize_t picopal_strlen(const picopal_char *);
130 picopal_char * picopal_strchr(const picopal_char *, picopal_char);
131 picopal_char * picopal_strcpy(picopal_char *d, const picopal_char *s);
132 picopal_char *picopal_strstr(const picopal_char *s, const picopal_char *substr);
133 picopal_char *picopal_strcat(picopal_char *dest, const picopal_char *src);
134 picopal_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! */
137 void * picopal_mem_copy(const void * src, void * dst,  picopal_objsize_t length);
138 
139 /* sets 'length' bytes starting at dest[0] to 'byte_val' */
140 void * picopal_mem_set(void * dest, picopal_uint8 byte_val, picopal_objsize_t length);
141 
142 /* safe versions */
143 picopal_objsize_t picopal_vslprintf(picopal_char * dst, picopal_objsize_t siz, const picopal_char *fmt, va_list args);
144 picopal_objsize_t picopal_slprintf(picopal_char * dst, picopal_objsize_t siz, const picopal_char *fmt, /*args*/ ...);
145 picopal_objsize_t picopal_strlcpy(picopal_char *dst, const picopal_char *src, picopal_objsize_t siz);
146 
147 /*Fixed point computation*/
148 /*
149 picopal_int32 picopal_fixptdiv(picopal_int32 a, picopal_int32 b, picopal_uint8 bigpow);
150 picopal_int32 picopal_fixptmult(picopal_int32 x, picopal_int32 y, picopal_uint8 bigpow);
151 picopal_int32 picopal_fixptdivORinv(picopal_int32 a, picopal_int32 b, picopal_int32 invb, picopal_uint8 bigpow);
152 picopal_int32 picopal_fixptmultdouble(picopal_int32 x, picopal_int32 y, picopal_uint8 bigpow);
153 picopal_uint8 picopal_highestBit(picopal_int32 x);
154 */
155 
156 /* *************************************************/
157 /* math                                            */
158 /* *************************************************/
159 
160 picopal_double picopal_cos (const picopal_double cos_arg);
161 picopal_double picopal_sin (const picopal_double sin_arg);
162 picopal_double picopal_fabs (const picopal_double fabs_arg);
163 
164 
165 
166 
167 /* *************************************************/
168 /* file access                                     */
169 /* *************************************************/
170 
171 extern 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 
182 typedef enum {PICOPAL_BINARY_READ, PICOPAL_BINARY_WRITE, PICOPAL_TEXT_READ, PICOPAL_TEXT_WRITE}  picopal_access_mode;
183 
184 typedef picopal_FILE * picopal_File;
185 
186 extern 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 
204 extern picopal_File picopal_get_fnil (void);
205 
206 
207 extern  picopal_int8 picopal_is_fnil (picopal_File f);
208 
209 
210 extern pico_status_t picopal_fclose (picopal_File f);
211 
212 
213 extern picopal_uint32 picopal_flength (picopal_File f);
214 
215 
216 extern  picopal_uint8 picopal_feof (picopal_File f);
217 
218 
219 extern pico_status_t picopal_fseek (picopal_File f, picopal_uint32 offset, picopal_int8 seekmode);
220 
221 
222 extern pico_status_t picopal_fget_char (picopal_File f, picopal_char * ch);
223 
224 
225 extern picopal_objsize_t picopal_fread_bytes (picopal_File f, void * ptr, picopal_objsize_t objsize, picopal_uint32 nobj);
226 
227 extern picopal_objsize_t picopal_fwrite_bytes (picopal_File f, void * ptr, picopal_objsize_t objsize, picopal_uint32 nobj);
228 
229 
230 extern pico_status_t picopal_fflush (picopal_File f);
231 
232 /*
233 extern pico_status_t picopal_fput_char (picopal_File f, picopal_char ch);
234 */
235 
236 
237 /*
238 extern pico_status_t picopal_remove (picopal_char filename[]);
239 
240 
241 extern 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  */
255 void *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  */
261 void 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  */
272 pico_status_t picopal_mpr_protect(void *addr, picopal_objsize_t len, picopal_int16 prot);
273 
274 /* Fast, Compact Approximation of the Exponential Function */
275 picopal_double picopal_quick_exp(const picopal_double y);
276 
277 /* *************************************************/
278 /* types functions for time measurement            */
279 /* *************************************************/
280 
281 extern void picopal_get_timer(picopal_uint32 * sec, picopal_uint32 * usec);
282 
283 #ifdef __cplusplus
284 }
285 #endif
286 
287 
288 #endif /*PICOPAL_H_*/
289