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