root/ext/bcmath/libbcmath/src/init.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. _bc_new_num_ex
  2. _bc_free_num_ex
  3. bc_init_numbers
  4. bc_copy_num
  5. bc_init_num

   1 /* init.c: bcmath library file. */
   2 /*
   3     Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
   4     Copyright (C) 2000 Philip A. Nelson
   5 
   6     This library is free software; you can redistribute it and/or
   7     modify it under the terms of the GNU Lesser General Public
   8     License as published by the Free Software Foundation; either
   9     version 2 of the License, or (at your option) any later version.
  10 
  11     This library is distributed in the hope that it will be useful,
  12     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14     Lesser General Public License for more details.  (COPYING.LIB)
  15 
  16     You should have received a copy of the GNU Lesser General Public
  17     License along with this library; if not, write to:
  18 
  19       The Free Software Foundation, Inc.
  20       59 Temple Place, Suite 330
  21       Boston, MA 02111-1307 USA.
  22 
  23     You may contact the author by:
  24        e-mail:  philnelson@acm.org
  25       us-mail:  Philip A. Nelson
  26                 Computer Science Department, 9062
  27                 Western Washington University
  28                 Bellingham, WA 98226-9062
  29 
  30 *************************************************************************/
  31 
  32 #include <config.h>
  33 #include <stdio.h>
  34 #include <assert.h>
  35 #include <stdlib.h>
  36 #include <ctype.h>
  37 #include <stdarg.h>
  38 #include "bcmath.h"
  39 #include "private.h"
  40 
  41 #if SANDER_0
  42  bc_num _bc_Free_list = NULL;
  43 #endif
  44 
  45 /* new_num allocates a number and sets fields to known values. */
  46 
  47 bc_num
  48 _bc_new_num_ex (length, scale, persistent)
  49      int length, scale, persistent;
  50 {
  51   bc_num temp;
  52 
  53   /* PHP Change:  malloc() -> pemalloc(), removed free_list code */
  54   temp = (bc_num) safe_pemalloc (1, sizeof(bc_struct)+length, scale, persistent);
  55 #if 0
  56   if (_bc_Free_list != NULL) {
  57     temp = _bc_Free_list;
  58     _bc_Free_list = temp->n_next;
  59   } else {
  60     temp = (bc_num) pemalloc (sizeof(bc_struct), persistent);
  61     if (temp == NULL) bc_out_of_memory ();
  62   }
  63 #endif
  64   temp->n_sign = PLUS;
  65   temp->n_len = length;
  66   temp->n_scale = scale;
  67   temp->n_refs = 1;
  68   /* PHP Change:  malloc() -> pemalloc() */
  69   temp->n_ptr = (char *) safe_pemalloc (1, length, scale, persistent);
  70   if (temp->n_ptr == NULL) bc_out_of_memory();
  71   temp->n_value = temp->n_ptr;
  72   memset (temp->n_ptr, 0, length+scale);
  73   return temp;
  74 }
  75 
  76 
  77 /* "Frees" a bc_num NUM.  Actually decreases reference count and only
  78    frees the storage if reference count is zero. */
  79 
  80 void
  81 _bc_free_num_ex (num, persistent)
  82     bc_num *num;
  83     int persistent;
  84 {
  85   if (*num == NULL) return;
  86   (*num)->n_refs--;
  87   if ((*num)->n_refs == 0) {
  88     if ((*num)->n_ptr)
  89                 /* PHP Change:  free() -> pefree(), removed free_list code */
  90       pefree ((*num)->n_ptr, persistent);
  91         pefree(*num, persistent);
  92 #if 0
  93     (*num)->n_next = _bc_Free_list;
  94     _bc_Free_list = *num;
  95 #endif
  96   }
  97   *num = NULL;
  98 }
  99 
 100 
 101 /* Intitialize the number package! */
 102 
 103 void
 104 bc_init_numbers (void)
 105 {
 106   BCG(_zero_) = _bc_new_num_ex (1,0,1);
 107   BCG(_one_)  = _bc_new_num_ex (1,0,1);
 108   BCG(_one_)->n_value[0] = 1;
 109   BCG(_two_)  = _bc_new_num_ex (1,0,1);
 110   BCG(_two_)->n_value[0] = 2;
 111 }
 112 
 113 
 114 /* Make a copy of a number!  Just increments the reference count! */
 115 
 116 bc_num
 117 bc_copy_num (bc_num num)
 118 {
 119   num->n_refs++;
 120   return num;
 121 }
 122 
 123 
 124 /* Initialize a number NUM by making it a copy of zero. */
 125 
 126 void
 127 bc_init_num (bc_num *num)
 128 {
 129   *num = bc_copy_num (BCG(_zero_));
 130 }
 131 

/* [<][>][^][v][top][bottom][index][help] */