project_files/hwc/rtl/system.h
author koda
Thu, 04 Apr 2013 01:38:30 +0200
branchwebgl
changeset 8850 ae8a957c69fd
parent 8047 25a4daa6473c
child 10124 aabd1b75d5a3
permissions -rw-r--r--
engine to c now compiles with some manual intervention (as of bug #596)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7983
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
     1
#ifndef SYSTEM_H_
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
     2
#define SYSTEM_H_
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
     3
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
     4
#include <time.h>
8047
25a4daa6473c cleanup headers, remove -I . from rtl lib to save a few warnings
koda
parents: 7983
diff changeset
     5
#include "Types.h"
7983
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
     6
#include "misc.h"
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
     7
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
     8
extern double pi;
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
     9
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    10
typedef TDate* PDate;
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    11
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    12
// dimension info for dynamic arrays
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    13
typedef struct {
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    14
    int dim;
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    15
    int a[4]; // at most 4
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    16
} fpcrtl_dimension_t;
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    17
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    18
/*
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    19
 * Copy returns a string which is a copy if the Count characters in S, starting at position Index.
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    20
 * If Count is larger than the length of the string S, the result is truncated.
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    21
 * If Index is larger than the length of the string S, then an empty string is returned.
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    22
 * Index is 1-based.
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    23
 */
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    24
string255   fpcrtl_copy(string255 s, Integer Index, Integer Count);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    25
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    26
/*
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    27
 * Delete removes Count characters from string S, starting at position Index.
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    28
 * All characters after the deleted characters are shifted Count positions to the left,
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    29
 * and the length of the string is adjusted.
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    30
 */
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    31
#define     fpcrtl_delete(s, index, count)                  fpcrtl_delete__vars(&(s), index, count)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    32
void        fpcrtl_delete__vars(string255 *s, SizeInt index, SizeInt count);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    33
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    34
string255   fpcrtl_floatToStr(double n);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    35
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    36
/*
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    37
 * Move data from one location in memory to another
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    38
 */
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    39
void        fpcrtl_move__vars(void *src, void *dst, SizeInt count);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    40
#define     fpcrtl_move(src, dst, count)                    fpcrtl_move__vars(&(src), &(dst), count);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    41
#define     fpcrtl_Move                                     fpcrtl_move
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    42
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    43
Integer     __attribute__((overloadable))                   fpcrtl_pos(Char c, string255 str);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    44
Integer     __attribute__((overloadable))                   fpcrtl_pos(string255 substr, string255 str);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    45
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    46
Integer     fpcrtl_length(string255 s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    47
#define     fpcrtl_Length                                   fpcrtl_length
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    48
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    49
#define     fpcrtl_sqr(x)                                   ((x) * (x))
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    50
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    51
#define     fpcrtl_odd(x)                                   ((x) % 2 != 0 ? true : false)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    52
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    53
#define     fpcrtl_StrLen                                   strlen
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    54
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    55
#define     SizeOf                                          sizeof
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    56
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    57
string255   fpcrtl_lowerCase(string255 s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    58
#define     fpcrtl_LowerCase                                fpcrtl_lowerCase
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    59
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    60
void        fpcrtl_fillChar__vars(void *x, SizeInt count, Byte value);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    61
#define     fpcrtl_fillChar(x, count, value)                fpcrtl_fillChar__vars(&(x), count, value)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    62
#define     fpcrtl_FillChar                                 fpcrtl_fillChar
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    63
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    64
void        fpcrtl_new__vars(void **p, int size);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    65
#define     fpcrtl_new(a)                                   fpcrtl_new__vars((void **)&(a), sizeof(*(a)))
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    66
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    67
#define     fpcrtl_dispose                                  free
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    68
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    69
#define     fpcrtl_freeMem(p, size)                         free(p)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    70
#define     fpcrtl_FreeMem(p, size)                         free(p)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    71
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    72
#define     fpcrtl_getMem(size)                             malloc(size)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    73
#define     fpcrtl_GetMem                                   fpcrtl_getMem
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    74
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    75
#define     fpcrtl_assigned(p)                              ((p) != NULL)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    76
#define     fpcrtl_Assigned                                 fpcrtl_assigned
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    77
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    78
Integer     fpcrtl_trunc(extended n);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    79
8850
ae8a957c69fd engine to c now compiles with some manual intervention (as of bug 596)
koda
parents: 8047
diff changeset
    80
#define     fpcrtl_val(s, a)                                fpcrtl_val__vars(s, &(a))
ae8a957c69fd engine to c now compiles with some manual intervention (as of bug 596)
koda
parents: 8047
diff changeset
    81
void        __attribute__((overloadable))                   fpcrtl_val__vars(string255 s, LongInt *a);
ae8a957c69fd engine to c now compiles with some manual intervention (as of bug 596)
koda
parents: 8047
diff changeset
    82
void        __attribute__((overloadable))                   fpcrtl_val__vars(string255 s, Byte *a);
ae8a957c69fd engine to c now compiles with some manual intervention (as of bug 596)
koda
parents: 8047
diff changeset
    83
void        __attribute__((overloadable))                   fpcrtl_val__vars(string255 s, LongWord *a);
7983
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    84
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    85
#define     fpcrtl_randomize()                              srand(time(NULL))
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    86
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    87
/*
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    88
 * Random returns a random number larger or equal to 0 and strictly less than L
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    89
 */
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    90
LongInt     fpcrtl_random(LongInt l);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    91
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    92
string255   fpcrtl_paramStr(LongInt);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    93
#define     fpcrtl_ParamStr                                 fpcrtl_paramStr
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    94
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    95
/*
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    96
 * Str returns a string which represents the value of X. X can be any numerical type.
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    97
 */
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    98
#define     fpcrtl_str(x, s)                                fpcrtl_str__vars(x, &(s))
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
    99
void        __attribute__((overloadable))                   fpcrtl_str__vars(float x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   100
void        __attribute__((overloadable))                   fpcrtl_str__vars(double x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   101
void        __attribute__((overloadable))                   fpcrtl_str__vars(uint8_t x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   102
void        __attribute__((overloadable))                   fpcrtl_str__vars(int8_t x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   103
void        __attribute__((overloadable))                   fpcrtl_str__vars(uint16_t x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   104
void        __attribute__((overloadable))                   fpcrtl_str__vars(int16_t x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   105
void        __attribute__((overloadable))                   fpcrtl_str__vars(uint32_t x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   106
void        __attribute__((overloadable))                   fpcrtl_str__vars(int32_t x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   107
void        __attribute__((overloadable))                   fpcrtl_str__vars(uint64_t x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   108
void        __attribute__((overloadable))                   fpcrtl_str__vars(int64_t x, string255 *s);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   109
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   110
void        fpcrtl_interlockedIncrement__vars(int *i);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   111
void        fpcrtl_interlockedDecrement__vars(int *i);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   112
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   113
#define     fpcrtl_interlockedIncrement(i)                  fpcrtl_interlockedIncrement__vars(&(i))
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   114
#define     fpcrtl_interlockedDecrement(i)                  fpcrtl_interlockedDecrement__vars(&(i))
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   115
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   116
#define     fpcrtl_InterlockedIncrement                     fpcrtl_interlockedIncrement
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   117
#define     fpcrtl_InterlockedDecrement                     fpcrtl_interlockedDecrement
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   118
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   119
void        fpcrtl_init(int argc, char** argv);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   120
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   121
int         fpcrtl_paramCount();
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   122
#define     fpcrtl_ParamCount                               fpcrtl_paramCount
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   123
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   124
string255   fpcrtl_paramStr(int i);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   125
#define     fpcrtl_ParamStr                                 fpcrtl_paramStr
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   126
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   127
int         fpcrtl_UTF8ToUnicode(PWideChar dest, PChar src, SizeInt maxLen);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   128
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   129
#define     fpcrtl_halt(t)                                  assert(0)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   130
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   131
#define     fpcrtl_Load_GL_VERSION_2_0()                    1
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   132
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   133
uint32_t    __attribute__((overloadable))                   fpcrtl_lo(uint64_t);
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   134
#define     fpcrtl_Lo                                       fpcrtl_lo
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   135
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   136
#define     __SET_LENGTH2(arr, d, b) do{\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   137
                d.dim = 1;\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   138
                arr = realloc(arr, b * sizeof(typeof(*arr)));\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   139
                d.a[0] = b;\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   140
            }while(0)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   141
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   142
#define     SET_LENGTH2(arr, b)                             __SET_LENGTH2(arr, arr##_dimension_info, (b))
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   143
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   144
#define     __SET_LENGTH3(arr, d, b, c) do{\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   145
                d.dim = 2;\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   146
                for (int i = 0; i < d.a[0]; i++) {\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   147
                    arr[i] = realloc(arr[i], c * sizeof(typeof(**arr)));\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   148
                }\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   149
                if (d.a[0] > b) {\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   150
                    for (int i = b; i < d.a[0]; i++) {\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   151
                        free(arr[i]);\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   152
                    }\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   153
                    arr = realloc(arr, b * sizeof(typeof(*arr)));\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   154
                } else if (d.a[0] < b) {\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   155
                    arr = realloc(arr, b * sizeof(typeof(*arr)));\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   156
                    for (int i = d.a[0]; i < b; i++) {\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   157
                        arr[i] = malloc(c * sizeof(typeof(**arr)));\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   158
                        memset(arr[i], 0, c * sizeof(typeof(**arr)));\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   159
                    }\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   160
                }\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   161
                d.a[0] = b;\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   162
                d.a[1] = c;\
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   163
            }while(0)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   164
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   165
#define     SET_LENGTH3(arr, b, c)                          __SET_LENGTH3(arr, arr##_dimension_info, (b), (c))
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   166
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   167
#define     fpcrtl_SetLength(...)                           macro_dispatcher(SET_LENGTH, __VA_ARGS__)(__VA_ARGS__)
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   168
02f36c3e7f6c add xymeng's rtl port
koda
parents:
diff changeset
   169
#endif /* SYSTEM_H_ */