Changeset 43


Ignore:
Timestamp:
Mar 2, 2008, 1:58:48 AM (10 years ago)
Author:
Sam Hocevar
Message:
  • Fix argument types in lisp_cos(), lisp_sin() and lisp_atan() to avoid overflows. Closes #1 #2 #3.
Location:
abuse/trunk/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/calctrig.cpp

    r2 r43  
    44{
    55  int i,x;
    6   printf("long sin_table[360]={\n  ");
     6  printf("int32_t sin_table[360]={\n  ");
    77  for (i=0;i<360;i++)
    88  {
     
    1313  printf("};\n");
    1414
    15   printf("unsigned short atan_table[1662]={\n  ");
     15  printf("uint16_t atan_table[1662]={\n  ");
    1616 
    1717  for (i=1;i<1662;i++)
  • abuse/trunk/src/include/lisp.hpp

    r39 r43  
    2121
    2222#define FIXED_TRIG_SIZE 360               // 360 degrees stored in table
    23 extern long sin_table[FIXED_TRIG_SIZE];   // this should be filled in by external module
     23extern int32_t sin_table[FIXED_TRIG_SIZE];   // this should be filled in by external module
    2424#define TBS 1662                          // atan table granularity
    25 extern unsigned short atan_table[TBS];
     25extern uint16_t atan_table[TBS];
    2626#define NILP(x) (x==NULL)
    2727#define DEFINEDP(x) (x!=l_undefined)
     
    197197extern int space_size[4];
    198198void *nth(int num, void *list);
    199 long lisp_atan2(long dy, long dx);
    200 long lisp_sin(long x);
    201 long lisp_cos(long x);
     199int32_t lisp_atan2(int32_t dy, int32_t dx);
     200int32_t lisp_sin(int32_t x);
     201int32_t lisp_cos(int32_t x);
    202202void restore_heap(void *val, int heap);
    203203void *mark_heap(int heap);
  • abuse/trunk/src/include/lisp2.hpp

    r39 r43  
    6262
    6363#define FIXED_TRIG_SIZE 360               // 360 degrees stored in table
    64 extern long sin_table[FIXED_TRIG_SIZE];   // this should be filled in by external module
     64extern int32_t sin_table[FIXED_TRIG_SIZE];   // this should be filled in by external module
    6565#define TBS 1662                          // atan table granularity
    66 extern unsigned short atan_table[TBS];
     66extern uint16_t atan_table[TBS];
    6767
    6868/* ------------------------- COMPATIBILITY -------------------- */
     
    111111char* symbol_name (void* symbol);
    112112int item_type (void* cell);
    113 long lisp_cos(long x);
    114 long lisp_sin(long x);
    115 long lisp_atan2(long dy, long dx);
     113int32_t lisp_cos(int32_t x);
     114int32_t lisp_sin(int32_t x);
     115int32_t lisp_atan2(int32_t dy, int32_t dx);
    116116void push_onto_list(Cell *object, Cell *&list);
    117117
  • abuse/trunk/src/lisp.cpp

    r39 r43  
    677677}
    678678
    679 long lisp_cos(long x)
     679int32_t lisp_cos(int32_t x)
    680680{
    681681  x=(x+FIXED_TRIG_SIZE/4)%FIXED_TRIG_SIZE;
     
    684684}
    685685
    686 long lisp_sin(long x)
     686int32_t lisp_sin(int32_t x)
    687687{
    688688  x=x%FIXED_TRIG_SIZE;
     
    691691}
    692692
    693 long lisp_atan2(long dy, long dx)
     693int32_t lisp_atan2(int32_t dy, int32_t dx)
    694694{
    695695  if (dy==0)
     
    709709        if (abs(dx)>abs(dy))
    710710        {
    711           long a=dx*29/dy;
     711          int32_t a=dx*29/dy;
    712712          if (a>=TBS) return 0;
    713713          else return 45-atan_table[a];
     
    715715        else
    716716        {
    717           long a=dy*29/dx;
     717          int32_t a=dy*29/dx;
    718718          if (a>=TBS) return 90;
    719719          else return 45+atan_table[a];
     
    723723        if (abs(dx)>abs(dy))
    724724        {
    725           long a=dx*29/abs(dy);
     725          int32_t a=dx*29/abs(dy);
    726726          if (a>=TBS)
    727727            return 0;
     
    731731        else
    732732        {
    733           long a=abs(dy)*29/dx;
     733          int32_t a=abs(dy)*29/dx;
    734734          if (a>=TBS)
    735735            return 260;
     
    744744        if (abs(dx)>abs(dy))
    745745        {
    746           long a=-dx*29/dy;
     746          int32_t a=-dx*29/dy;
    747747          if (a>=TBS)
    748748            return 135+45;
     
    752752        else
    753753        {
    754           long a=dy*29/-dx;
     754          int32_t a=dy*29/-dx;
    755755          if (a>=TBS)
    756756            return 135-45;
     
    762762        if (abs(dx)>abs(dy))
    763763        {
    764           long a=-dx*29/abs(dy);
     764          int32_t a=-dx*29/abs(dy);
    765765          if (a>=TBS)
    766766            return 225-45;
     
    769769        else
    770770        {
    771           long a=abs(dy)*29/abs(dx);
     771          int32_t a=abs(dy)*29/abs(dx);
    772772          if (a>=TBS)
    773773            return 225+45;       
  • abuse/trunk/src/trig.cpp

    r2 r43  
    1 long sin_table[360]={
     1#include "system.h"
     2
     3int32_t sin_table[360]={
    24  0x00000000, 0x00000477, 0x000008ef, 0x00000d65, 0x000011db, 0x0000164f,
    35  0x00001ac2, 0x00001f32, 0x000023a0, 0x0000280c, 0x00002c74, 0x000030d8,
     
    6163  0xffffe53e, 0xffffe9b1, 0xffffee25, 0xfffff29b, 0xfffff711, 0xfffffb89
    6264  };
    63 unsigned short atan_table[1662]={
     65uint16_t atan_table[1662]={
    6466    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    6567    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
Note: See TracChangeset for help on using the changeset viewer.