I've moved all code into one file now.

/Josef
diff -urN parrot.orig/MANIFEST parrot/MANIFEST
--- parrot.orig/MANIFEST        Mon Aug 12 17:59:49 2002
+++ parrot/MANIFEST     Mon Aug 12 18:01:36 2002
@@ -22,6 +22,7 @@
 classes/default.pmc
 classes/genclass.pl
 classes/intqueue.pmc
+classes/multiarray.pmc
 classes/perlarray.pmc
 classes/perlhash.pmc
 classes/perlint.pmc
diff -urN parrot.orig/assemble.pl parrot/assemble.pl
--- parrot.orig/assemble.pl     Mon Aug 12 17:59:49 2002
+++ parrot/assemble.pl  Mon Aug 12 18:06:21 2002
@@ -140,6 +140,7 @@
   $self->{constants}{Coroutine} = 10;
   $self->{constants}{Continuation} = 11;
   $self->{constants}{CSub} = 12;
+  $self->{constants}{MultiArray} = 13;
   $self;
 }
 
diff -urN parrot.orig/classes/multiarray.pmc parrot/classes/multiarray.pmc
--- parrot.orig/classes/multiarray.pmc  Thu Jan  1 01:00:00 1970
+++ parrot/classes/multiarray.pmc       Wed Aug 14 13:30:10 2002
@@ -0,0 +1,1238 @@
+/* Multiarray.pmc
+ *  Copyright: (When this is determined...it will go here)
+ *  CVS Info
+ *     $Id: multiarray.pmc,v 1.1 2002/08/05 09:20:05 joh Exp joh $
+ *  Overview:
+ *     These are the vtable functions for the Multiarray base class
+ *  Data Structure and Algorithms:
+ *   This is one way for calculating offsets in 2 dimensional space.
+ *
+ *   (y-1)X0+x   
+ *
+ *   Where X0 is the length of X-base (fig 1.1). We use this equation in 
+ *   calc_offset to get offset from the buffer we store our data in. 
+ *   Lets say we want to store (2,2) in a buffer. We then take values and do:
+ *   (2-1)3 + 2 = 5. 
+ * 
+ *      ------------------------------------
+ *      base | 1 | 2 | 3 | 4 |*5*|  | ....
+ *      ------------------------------------- fig 1.0
+ *
+ *
+ *      Y                                                         
+ *      |  
+ *      | ---------------                                         
+ *      | [ 7 ][ 8 ][ 9 ] 
+ *      | [ 4 ][ 5 ][ 6 ]                                                     
+ *      | [ 1 ][ 2 ][ 3 ] <-------- a CELL                                
+ *      |------------------ X
+ *        |-------------|                                               
+ *            X0          fig 1.1   
+ *      virtual_addr is the return value from a calculation of CELL's position.
+ *      Changes:  2002/08/01    
+ *                Our cell_buffer starts from 0 equation is now y*x0+x.
+ *                Calc offset now handles multidimensions
+ *
+ *      Current code has complexity: 
+ *
+ *        O(1) writing.                                                  
+ *        O(1) reading.
+ *  History:
+ *        Initial revision by Josef Höök
+ *  Notes:
+ *        Future plan is to make calc_offset_multi polymorphic 
+ *        and to make it handle multidimensions: done
+ *  References:
+ */
+
+#include "parrot/parrot.h"
+
+#define CELL_POOL_SIZE 16
+
+typedef struct _cell CELL;
+typedef struct _cell_buffer CELL_B;
+
+/* 
+ * cell buffer representation
+ */
+struct _cell_buffer { 
+    Buffer *cell_buffer;
+    INTVAL size;
+    INTVAL free_cell;
+    KEY *dimension;
+};
+
+struct _cell {
+    UnionVal data;
+    INTVAL virtual_addr; /* used to handle offsets */
+};
+
+
+
+/* 
+ * MULTIDIM CALC OFFSET
+ * Algoritm:
+ *  ( i + (j-1)*Ni ) + (k-1)*Ni*Nj + (l-1)*Ni*Nj*Nk ...
+ * where i,j,k,l are koordinates in a multdim space
+ * eg: (1,2,3) = (i,j,k)
+ * and Ni,Nj,Nk .. are the length of an dimension.
+ * Think of a cube with a fix size:
+ *
+ *          |   /
+ *          |  /  8 9 depth 2
+ * height 2 | 1 2 3 4
+ *          |---------
+ *            length 4
+ * Ni = 4, Nj = 2, Nk = 2
+ * juuh....ascii art isnt one of my talents thats for sure. 
+ * luckily i didnt try to draw a hypercube :-)
+ * $1 is addr of our CELL_BUFFER structure.
+ * $2 is a key pointer containing positions in multidimensional space 
+ */
+static INTVAL calc_offset_multi(void *base, KEY k) 
+{
+    
+    CELL_B *cell_data = (CELL_B *)base;
+    KEY *dim_key;
+    KEY *my_key;
+    INTVAL offset = 0;
+    INTVAL prod_of_dims = 1;
+    INTVAL loop_i;
+    INTVAL inner_loop_i;
+    dim_key = cell_data->dimension;
+    
+    my_key = &k;
+
+    if(cell_data->cell_buffer != NULL && dim_key != NULL && k.next != NULL ) {
+
+/* first part of alg.
+ * (i + (j-1)*Ni
+ */ 
+       offset =  (INTVAL) ( k.atom.val.int_val + 
+(k.next->atom.val.int_val)*(dim_key->atom.val.int_val) );
+
+/* add the rest of algoritm 
+ * ...  + (k-1)*Ni*Nj + (l-1)*Ni*Nj*Nk ...
+ *
+ * Ni = dim_key->atom.val.int_val
+ * Nj = dim_key->next.atom.val.int_val
+ * Nk = dim_key->next->next.atom.val.int_val
+ * and so an.
+ *
+ */
+       loop_i = 2;
+       while ( my_key->next->next != NULL ) {
+           inner_loop_i = loop_i;
+           
+           
+           while ( inner_loop_i > 0 && dim_key->next != NULL ) {
+               
+               prod_of_dims *= (dim_key->atom.val.int_val);
+               dim_key = dim_key->next;
+               inner_loop_i--;
+           }
+           
+           offset +=  (INTVAL)(my_key->next->next->atom.val.int_val)*prod_of_dims;    
+     
+
+           my_key = my_key->next;
+           loop_i++;
+       }                
+    } else {
+       /* only 1 dim */
+       offset =  (INTVAL) ( k.atom.val.int_val );
+    }
+    return offset;
+}
+
+/*
+ *  Expands the cell_buffer Buffer in a matrix or multi array
+ *  This doesnt grow the matrix itself 
+ *  see expand_matrix() for that.
+ */
+static void expand_cell_buffer( struct Parrot_Interp *interpreter, 
+                                void *data, INTVAL new_size )
+{
+    CELL_B *b = data;
+    if(new_size > b->size) {
+       Parrot_reallocate(interpreter, b->cell_buffer, new_size * sizeof(CELL));
+       b->free_cell += (new_size - b->size);
+       b->size = new_size;
+    }
+    
+}
+
+
+/*
+ * expand data buffer with one cell 
+ */
+static CELL *new_cell( struct Parrot_Interp *interpreter, void *data ) 
+{  
+    CELL *ret_cell;
+    INTVAL new_size = 0;
+    CELL_B *cell_b = data;
+    ret_cell = (CELL *)cell_b->cell_buffer->bufstart;
+    
+    if((cell_b->free_cell-1) > 0) {
+       cell_b->free_cell -= 1;
+    } else {
+       new_size = cell_b->size*2; 
+       expand_cell_buffer( interpreter, cell_b, new_size);
+       cell_b->free_cell -= 1;
+       ret_cell = (CELL *)cell_b->cell_buffer->bufstart;
+    }
+    return &ret_cell[cell_b->size - cell_b->free_cell-1]; // notice -1 we start at 0
+}
+
+
+
+
+static CELL_B *new_marray( Interp *interpreter ) 
+{
+    CELL_B *b = (CELL_B *)new_bufferlike_header(interpreter, sizeof(*b));    
+    // CELL_B *b = (CELL_B *)new_tracked_header(interpreter, sizeof(*b));    
+    b->size = CELL_POOL_SIZE;
+    b->free_cell = CELL_POOL_SIZE;
+    b->cell_buffer = new_buffer_header(interpreter);
+    b->dimension = NULL;
+    Parrot_allocate(interpreter, b->cell_buffer ,  CELL_POOL_SIZE*sizeof(CELL)); 
+    memset( b->cell_buffer->bufstart, 0,  CELL_POOL_SIZE*sizeof(CELL));
+    return b;
+    
+}
+
+
+static void init_marray( Interp *interpreter, PMC *self, KEY *key ) 
+{
+    
+    CELL_B *marray;
+    INTVAL size;
+    KEY *oldkey;
+
+    marray = new_marray(interpreter);
+    marray->cell_buffer->flags |= PMC_is_buffer_ptr_FLAG;
+    marray->cell_buffer->flags |= PMC_is_PMC_ptr_FLAG;
+    
+    self->data = (CELL_B *)marray;
+    self->cache.int_val = 0;
+    oldkey = key;
+    size = 1;
+
+    
+    while(key->next != NULL) {
+      
+      size *= key->atom.val.int_val;
+      key = key->next;
+      
+      
+    }
+
+    marray->size = size;
+    marray->free_cell = size;
+    Parrot_reallocate(interpreter, marray->cell_buffer, marray->size * sizeof(CELL));
+    memset(marray->cell_buffer->bufstart, 0, marray->size * sizeof(CELL));
+    marray->dimension = oldkey;
+    
+}
+
+
+/* Todo: heavy optimisation. should also return a KEY_ATOM */
+static INTVAL get_marray_keyed( Interp *interpreter, CELL_B *mg_marray, KEY *key ) 
+{
+    
+    CELL *buffer_ptr;
+    CELL *buffer_ptr_virt;
+    CELL *base;
+    CELL *virtual_addr;  
+    
+    INTVAL offs = 0;
+    INTVAL ret_val = 0;
+    
+    offs = calc_offset_multi(mg_marray, *key);
+    base = (CELL *)mg_marray->cell_buffer->bufstart;
+    buffer_ptr = &base[offs];
+    buffer_ptr_virt = buffer_ptr;
+    
+    if(!(buffer_ptr == NULL)) {
+/* 
+ *  fetch the virtual address from cell. 
+ *  Have to do it this way since base 
+ *  address of our buffer may have and most likely has changed.    
+ */
+        virtual_addr = &base[buffer_ptr->virtual_addr]; 
+        if(virtual_addr == buffer_ptr_virt) {
+       ret_val = buffer_ptr->data.int_val;
+       } else {
+           //PANIC
+        }      
+    }
+
+    return ret_val;
+}
+
+
+static void set_marray_keyed( Interp *interpreter, CELL_B *sik_marray, KEY *key, 
+INTVAL src_value ) 
+{
+    
+  CELL *my_cell;
+  CELL *base;
+  INTVAL offs = 0;
+  
+  offs = calc_offset_multi(sik_marray, *key);
+  base = (CELL *)sik_marray->cell_buffer->bufstart;
+  my_cell = &base[offs];
+  my_cell->virtual_addr = offs;
+  my_cell->data.int_val = src_value;
+
+}
+
+
+pmclass MultiArray {
+
+    void init () {
+       SELF->flags |= (PMC_is_buffer_ptr_FLAG | PMC_is_PMC_ptr_FLAG);
+       SELF->data = NULL;
+       SELF->cache.int_val = 0;
+       init_marray(INTERP, SELF, NULL);
+    }
+
+    void init_pmc (PMC* initializer) {
+
+       SELF->flags |= (PMC_is_buffer_ptr_FLAG | PMC_is_PMC_ptr_FLAG);
+       SELF->data = NULL;
+       SELF->cache.int_val = 0;
+       // I use a PMC key class  as wrapper to pass initialvalues to our multi array
+       //  OBS OBS OBS this dont work since we dont have a multidim key standard yet
+       //if((initializer->vtable->type(INTERP, SELF)) == enum_class_Key) {
+       //    init_marray(INTERP, SELF, initializer->data);
+       //} else{
+           init_marray(INTERP, SELF, NULL);
+       //}
+       
+       
+    }
+
+    void morph (INTVAL type) {
+    }
+
+    PMC* mark (PMC* tail) {
+      return NULL;
+    }
+
+    void destroy () {
+    }
+
+    INTVAL type () {
+      return enum_class_MultiArray;
+    }
+
+    INTVAL type_keyed (KEY* key) {
+       return 0;
+    }
+
+    INTVAL type_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    UINTVAL subtype (INTVAL type) {
+       return 0;
+    }
+
+    UINTVAL subtype_keyed (KEY* key, INTVAL type) {
+       return 0;
+    }
+
+    UINTVAL subtype_keyed_int (INTVAL* key, INTVAL type) {
+       return 0;
+    }
+
+    STRING* name () {
+        return whoami;
+    }
+
+    STRING* name_keyed (KEY* key) {
+       return NULL;
+    }
+
+    STRING* name_keyed_int (INTVAL* key) {
+       return NULL;  
+    }
+
+    PMC* clone () {
+       return NULL;
+    }
+
+    PMC* clone_keyed (KEY* key) {
+       return NULL;
+    }
+
+    PMC* clone_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    PMC* find_method (STRING* method_name) {
+       return NULL;
+    }
+
+    PMC* find_method_keyed (KEY* key, STRING* method_name) {
+       return NULL;
+    }
+
+    PMC* find_method_keyed_int (INTVAL* key, STRING* method_name) {
+       return NULL;
+    }
+
+    INTVAL get_integer () {
+       return 0;
+    }
+
+    INTVAL get_integer_keyed (KEY* key) {
+       INTVAL ret = get_marray_keyed( INTERP, SELF->data, key );
+       return ret;
+    }
+
+    INTVAL get_integer_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    FLOATVAL get_number () {
+       return 0;
+    }
+
+    FLOATVAL get_number_keyed (KEY* key) {
+       return (FLOATVAL)get_marray_keyed( INTERP, SELF->data, key );
+    }
+
+    FLOATVAL get_number_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    BIGNUM* get_bignum () {
+       return NULL;
+    }
+
+    BIGNUM* get_bignum_keyed (KEY* key) {
+       return NULL;
+    }
+
+    BIGNUM* get_bignum_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    STRING* get_string () {
+       return NULL;
+    }
+
+    STRING* get_string_keyed (KEY* key) {
+       return NULL;
+    }
+
+    STRING* get_string_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    INTVAL get_bool () {
+       return 0;
+    }
+
+    INTVAL get_bool_keyed (KEY* key) {
+       return 0;
+    }
+
+    INTVAL get_bool_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    INTVAL elements () {
+       return 0;
+    }
+
+    INTVAL elements_keyed (KEY* key) {
+       return 0;
+    }
+
+    INTVAL elements_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    PMC* get_pmc () {
+       return NULL;
+    }
+
+    PMC* get_pmc_keyed (KEY* key) {
+       return NULL;
+    }
+
+    PMC* get_pmc_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    INTVAL is_same (PMC* value) {
+       return 0;
+    }
+
+    INTVAL is_same_keyed (KEY* key, PMC* value, KEY* value_key) {
+       return 0;
+    }
+
+    INTVAL is_same_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+       return 0;
+    }
+
+    void set_integer (PMC* value) {
+    }
+
+    void set_integer_native (INTVAL value) {
+    }
+
+    void set_integer_same (PMC* value) {
+    }
+
+    void set_integer_keyed (KEY* key, INTVAL value) {
+       set_marray_keyed( INTERP, SELF->data, key, value );  
+    }
+
+    void set_integer_keyed_int (INTVAL* key, INTVAL value) {
+    }
+
+    void set_number (PMC* value) {
+    }
+
+    void set_number_native (FLOATVAL value) {
+    }
+
+    void set_number_same (PMC* value) {
+    }
+
+    void set_number_keyed (KEY* key, FLOATVAL value) {
+    }
+
+    void set_number_keyed_int (INTVAL* key, FLOATVAL value) {
+    }
+
+    void set_bignum (PMC* value) {
+    }
+
+    void set_bignum_native (BIGNUM* value) {
+    }
+
+    void set_bignum_same (PMC* value) {
+    }
+
+    void set_bignum_keyed (KEY* key, BIGNUM* value) {
+    }
+
+    void set_bignum_keyed_int (INTVAL* key, BIGNUM* value) {
+    }
+
+    void set_string (PMC* value) {
+    }
+
+    void set_string_native (STRING* value) {
+    }
+
+    void set_string_same (PMC* value) {
+    }
+
+    void set_string_keyed (KEY* key, STRING* value) {
+    }
+
+    void set_string_keyed_int (INTVAL* key, STRING* value) {
+    }
+
+    void set_pmc (PMC* value) {
+    }
+
+    void set_pmc_keyed (KEY* key, PMC* value, KEY* value_key) {
+    }
+
+    void set_pmc_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+    }
+
+    void set_same (PMC* value) {
+    }
+
+    void set_same_keyed (KEY* key, PMC* value, KEY* value_key) {
+    }
+
+    void set_same_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+    }
+
+    INTVAL pop_integer () {
+       return 0;
+    }
+
+    INTVAL pop_integer_keyed (KEY* key) {
+       return 0;
+    }
+
+    INTVAL pop_integer_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    FLOATVAL pop_float () {
+       return 0;
+    }
+
+    FLOATVAL pop_float_keyed (KEY* key) {
+       return 0;
+    }
+
+    FLOATVAL pop_float_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    BIGNUM* pop_bignum () {
+       return NULL;
+    }
+
+    BIGNUM* pop_bignum_keyed (KEY* key) {
+       return NULL;
+    }
+
+    BIGNUM* pop_bignum_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    STRING* pop_string () {
+       return NULL;
+    }
+
+    STRING* pop_string_keyed (KEY* key) {
+       return NULL;
+    }
+
+    STRING* pop_string_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    PMC* pop_pmc () {
+       return NULL;
+    }
+
+    PMC* pop_pmc_keyed (KEY* key) {
+       return NULL;
+    }
+
+    PMC* pop_pmc_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    void push_integer (INTVAL value) {
+    }
+
+    void push_integer_keyed (KEY* key, INTVAL value) {
+    }
+
+    void push_integer_keyed_int (INTVAL* key, INTVAL value) {
+    }
+
+    void push_float (FLOATVAL value) {
+    }
+
+    void push_float_keyed (KEY* key, FLOATVAL value) {
+    }
+
+    void push_float_keyed_int (INTVAL* key, FLOATVAL value) {
+    }
+
+    void push_bignum (BIGNUM* value) {
+    }
+
+    void push_bignum_keyed (KEY* key, BIGNUM* value) {
+    }
+
+    void push_bignum_keyed_int (INTVAL* key, BIGNUM* value) {
+    }
+
+    void push_string (STRING* value) {
+    }
+
+    void push_string_keyed (KEY* key, STRING* value) {
+    }
+
+    void push_string_keyed_int (INTVAL* key, STRING* value) {
+    }
+
+    void push_pmc (PMC* value) {
+    }
+
+    void push_pmc_keyed (KEY* key, PMC* value, KEY* value_key) {
+    }
+
+    void push_pmc_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+    }
+
+    INTVAL shift_integer () {
+       return 0;
+    }
+
+    INTVAL shift_integer_keyed (KEY* key) {
+       return 0;
+    }
+
+    INTVAL shift_integer_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    FLOATVAL shift_float () {
+       return 0;
+    }
+
+    FLOATVAL shift_float_keyed (KEY* key) {
+       return 0;
+    }
+
+    FLOATVAL shift_float_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    BIGNUM* shift_bignum () {
+       return NULL;
+    }
+
+    BIGNUM* shift_bignum_keyed (KEY* key) {
+       return NULL;
+    }
+
+    BIGNUM* shift_bignum_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    STRING* shift_string () {
+       return NULL;
+    }
+
+    STRING* shift_string_keyed (KEY* key) {
+       return NULL;
+    }
+
+    STRING* shift_string_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    PMC* shift_pmc () {
+       return NULL;
+    }
+
+    PMC* shift_pmc_keyed (KEY* key) {
+       return NULL;
+    }
+
+    PMC* shift_pmc_keyed_int (INTVAL* key) {
+       return NULL;
+    }
+
+    void unshift_integer (INTVAL value) {
+    }
+
+    void unshift_integer_keyed (KEY* key, INTVAL value) {
+    }
+
+    void unshift_integer_keyed_int (INTVAL* key, INTVAL value) {
+    }
+
+    void unshift_float (FLOATVAL value) {
+    }
+
+    void unshift_float_keyed (KEY* key, FLOATVAL value) {
+    }
+
+    void unshift_float_keyed_int (INTVAL* key, FLOATVAL value) {
+    }
+
+    void unshift_bignum (BIGNUM* value) {
+    }
+
+    void unshift_bignum_keyed (KEY* key, BIGNUM* value) {
+    }
+
+    void unshift_bignum_keyed_int (INTVAL* key, BIGNUM* value) {
+    }
+
+    void unshift_string (STRING* value) {
+    }
+
+    void unshift_string_keyed (KEY* key, STRING* value) {
+    }
+
+    void unshift_string_keyed_int (INTVAL* key, STRING* value) {
+    }
+
+    void unshift_pmc (PMC* value) {
+    }
+
+    void unshift_pmc_keyed (KEY* key, PMC* value, KEY* value_key) {
+    }
+
+    void unshift_pmc_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+    }
+
+    void add (PMC* value, PMC* dest) {
+    }
+
+    void add_int (INTVAL value, PMC* dest) {
+
+       CELL_B *marray;
+       CELL *base;
+       CELL *ptr;
+       INTVAL size;
+       INTVAL stalker;
+       
+       marray = SELF->data;
+       base = (CELL *)marray->cell_buffer->bufstart;
+       size = stalker = marray->size;
+       while(stalker >= 0) {
+           ptr = &base[size-stalker];
+           ptr->data.int_val += value;
+           stalker--;
+       }
+       
+       
+    }
+
+    void add_bignum (BIGNUM* value, PMC* dest) {
+    }
+
+    void add_float (FLOATVAL value, PMC* dest) {
+    }
+
+    void add_same (PMC* value, PMC* dest) {
+    }
+
+    void add_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
+    }
+
+    void add_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    void subtract (PMC* value, PMC* dest) {
+    }
+
+    void subtract_int (INTVAL value, PMC* dest) {
+
+       CELL_B *marray;
+       CELL *base;
+       CELL *ptr;
+       INTVAL size;
+       INTVAL stalker;
+       
+       marray = SELF->data;
+       base = (CELL *)marray->cell_buffer->bufstart;
+       size = stalker = marray->size;
+       while(stalker >= 0) {
+           ptr = &base[size-stalker];
+           ptr->data.int_val -= value;
+           stalker--;
+       }
+
+    }
+
+    void subtract_bignum (BIGNUM* value, PMC* dest) {
+    }
+
+    void subtract_float (FLOATVAL value, PMC* dest) {
+    }
+
+    void subtract_same (PMC* value, PMC* dest) {
+    }
+
+    void subtract_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void subtract_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    void multiply (PMC* value, PMC* dest) {
+    }
+
+    void multiply_int (INTVAL value, PMC* dest) {
+
+        CELL_B *marray;
+       CELL *base;
+       CELL *ptr;
+       INTVAL size;
+       INTVAL stalker;
+       
+       marray = SELF->data;
+       base = (CELL *)marray->cell_buffer->bufstart;
+       size = stalker = marray->size;
+       while(stalker >= 0) {
+           ptr = &base[size-stalker];
+           ptr->data.int_val *= value;
+           stalker--;
+       }
+
+    }
+
+    void multiply_bignum (BIGNUM* value, PMC* dest) {
+    }
+
+    void multiply_float (FLOATVAL value, PMC* dest) {
+    }
+
+    void multiply_same (PMC* value, PMC* dest) {
+    }
+
+    void multiply_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void multiply_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    void divide (PMC* value, PMC* dest) {
+    }
+
+    void divide_int (INTVAL value, PMC* dest) {
+
+       CELL_B *marray;
+       CELL *base;
+       CELL *ptr;
+       INTVAL size;
+       INTVAL stalker;
+       
+       marray = SELF->data;
+       base = (CELL *)marray->cell_buffer->bufstart;
+       size = stalker = marray->size;
+       while(stalker >= 0) {
+           ptr = &base[size-stalker];
+           ptr->data.int_val = ptr->data.int_val / value;
+           stalker--;
+       }
+
+    }
+
+    void divide_bignum (BIGNUM* value, PMC* dest) {
+    }
+
+    void divide_float (FLOATVAL value, PMC* dest) {
+    }
+
+    void divide_same (PMC* value, PMC* dest) {
+    }
+
+    void divide_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void divide_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    void modulus (PMC* value, PMC* dest) {
+    }
+
+    void modulus_int (INTVAL value, PMC* dest) {
+
+       CELL_B *marray;
+       CELL *base;
+       CELL *ptr;
+       INTVAL size;
+       INTVAL stalker;
+       
+       marray = SELF->data;
+       base = (CELL *)marray->cell_buffer->bufstart;
+       size = stalker = marray->size;
+       while(stalker >= 0) {
+           ptr = &base[size-stalker];
+           ptr->data.int_val = ptr->data.int_val % value;
+           stalker--;
+       }
+
+    }
+
+    void modulus_bignum (BIGNUM* value, PMC* dest) {
+    }
+
+    void modulus_float (FLOATVAL value, PMC* dest) {
+    }
+
+    void modulus_same (PMC* value, PMC* dest) {
+    }
+
+    void modulus_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void modulus_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    void neg (PMC* dest) {
+    }
+
+    void neg_keyed (KEY* key, PMC* dest, KEY* dest_key) {
+    }
+
+    void neg_keyed_int (INTVAL* key, PMC* dest, INTVAL* dest_key) {
+    }
+
+    void bitwise_or (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_or_int (INTVAL value, PMC* dest) {
+    }
+
+    void bitwise_or_same (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_or_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void bitwise_or_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    void bitwise_and (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_and_int (INTVAL value, PMC* dest) {
+    }
+
+    void bitwise_and_same (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_and_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void bitwise_and_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* 
+dest, INTVAL* dest_key) {
+    }
+
+    void bitwise_xor (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_xor_int (INTVAL value, PMC* dest) {
+    }
+
+    void bitwise_xor_same (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_xor_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void bitwise_xor_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* 
+dest, INTVAL* dest_key) {
+    }
+
+    void bitwise_not (PMC* dest) {
+    }
+
+    void bitwise_not_keyed (KEY* key, PMC* dest, KEY* dest_key) {
+    }
+
+    void bitwise_not_keyed_int (INTVAL* key, PMC* dest, INTVAL* dest_key) {
+    }
+
+    void bitwise_shl (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_shl_int (INTVAL value, PMC* dest) {
+    }
+
+    void bitwise_shl_same (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_shl_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void bitwise_shl_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* 
+dest, INTVAL* dest_key) {
+    }
+
+    void bitwise_shr (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_shr_int (INTVAL value, PMC* dest) {
+    }
+
+    void bitwise_shr_same (PMC* value, PMC* dest) {
+    }
+
+    void bitwise_shr_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void bitwise_shr_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* 
+dest, INTVAL* dest_key) {
+    }
+
+    void concatenate (PMC* value, PMC* dest) {
+    }
+
+    void concatenate_native (STRING* value, PMC* dest) {
+    }
+
+    void concatenate_same (PMC* value, PMC* dest) {
+    }
+
+    void concatenate_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void concatenate_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* 
+dest, INTVAL* dest_key) {
+    }
+
+    INTVAL is_equal (PMC* value) {
+       return 0;
+    }
+
+    INTVAL is_equal_keyed (KEY* key, PMC* value, KEY* value_key) {
+       return 0;
+    }
+
+    INTVAL is_equal_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+       return 0;
+    }
+
+    INTVAL cmp (PMC* value) {
+       return 0;
+    }
+
+    INTVAL cmp_keyed (KEY* key, PMC* value, KEY* value_key) {
+       return 0;
+    }
+
+    INTVAL cmp_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+       return 0;
+    }
+
+    INTVAL cmp_num (PMC* value) {
+       return 0;
+    }
+
+    INTVAL cmp_num_keyed (KEY* key, PMC* value, KEY* value_key) {
+       return 0;
+    }
+
+    INTVAL cmp_num_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+       return 0;
+    }
+
+    INTVAL cmp_string (PMC* value) {
+       return 0;
+    }
+
+    INTVAL cmp_string_keyed (KEY* key, PMC* value, KEY* value_key) {
+       return 0;
+    }
+
+    INTVAL cmp_string_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
+       return 0;
+    }
+
+    void logical_or (PMC* value, PMC* dest) {
+    }
+
+    void logical_or_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void logical_or_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    void logical_and (PMC* value, PMC* dest) {
+    }
+
+    void logical_and_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void logical_and_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* 
+dest, INTVAL* dest_key) {
+    }
+
+    void logical_xor (PMC* value, PMC* dest) {
+    }
+
+    void logical_xor_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void logical_xor_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* 
+dest, INTVAL* dest_key) {
+    }
+
+    void logical_not (PMC* dest) {
+    }
+
+    void logical_not_keyed (KEY* key, PMC* dest, KEY* dest_key) {
+    }
+
+    void logical_not_keyed_int (INTVAL* key, PMC* dest, INTVAL* dest_key) {
+    }
+
+    void repeat (PMC* value, PMC* dest) {
+    }
+
+    void repeat_int (INTVAL value, PMC* dest) {
+    }
+
+    void repeat_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void repeat_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    void repeat_int_keyed (KEY* key, INTVAL value, PMC* dest, KEY* dest_key) {
+    }
+
+    void repeat_int_keyed_int (INTVAL* key, INTVAL value, PMC* dest, INTVAL* 
+dest_key) {
+    }
+
+    void increment () {
+    }
+
+    void increment_keyed (KEY* key) {
+    }
+
+    void increment_keyed_int (INTVAL* key) {
+    }
+
+    void decrement () {
+    }
+
+    void decrement_keyed (KEY* key) {
+    }
+
+    void decrement_keyed_int (INTVAL* key) {
+    }
+
+    INTVAL exists_keyed (KEY* key) {
+       return 0;
+    }
+
+    INTVAL exists_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    INTVAL defined () {
+       return 0;
+    }
+
+    INTVAL defined_keyed (KEY* key) {
+       return 0;
+    }
+
+    INTVAL defined_keyed_int (INTVAL* key) {
+       return 0;
+    }
+
+    void delete_keyed (KEY* key) {
+    }
+
+    void delete_keyed_int (INTVAL* key) {
+    }
+
+    KEY* nextkey_keyed (KEY* key) {
+       return  NULL;
+    }
+
+    KEY* nextkey_keyed_int (INTVAL* key) {
+       return  NULL;
+    }
+
+    void substr (INTVAL offset, INTVAL length, PMC* dest) {
+    }
+
+    void substr_keyed (KEY* key, INTVAL offset, INTVAL length, PMC* dest, KEY* 
+dest_key) {
+    }
+
+    void substr_keyed_int (INTVAL* key, INTVAL offset, INTVAL length, PMC* dest, 
+INTVAL* dest_key) {
+    }
+
+    STRING* substr_str (INTVAL offset, INTVAL length) {
+       return  NULL;
+    }
+
+    STRING* substr_str_keyed (KEY* key, INTVAL offset, INTVAL length) {
+       return  NULL;
+    }
+
+    STRING* substr_str_keyed_int (INTVAL* key, INTVAL offset, INTVAL length) {
+       return  NULL;
+    }
+
+}
diff -urN parrot.orig/global_setup.c parrot/global_setup.c
--- parrot.orig/global_setup.c  Mon Aug 12 17:59:49 2002
+++ parrot/global_setup.c       Mon Aug 12 18:04:41 2002
@@ -34,6 +34,7 @@
     Parrot_Coroutine_class_init(enum_class_Coroutine);
     Parrot_CSub_class_init(enum_class_CSub);
     Parrot_Continuation_class_init(enum_class_Continuation);
+    Parrot_MultiArray_class_init(enum_class_MultiArray);
 
     /* Now register the names of the PMCs */
 
@@ -94,6 +95,10 @@
     MAKE_KEY_STRING(key, Parrot_base_vtables[enum_class_CSub].name(NULL, NULL));
     Parrot_base_classname_hash->vtable->set_integer_keyed(NULL,
                                                           Parrot_base_classname_hash, 
&key, enum_class_CSub);
+   
+    MAKE_KEY_STRING(key, Parrot_base_vtables[enum_class_MultiArray].name(NULL, 
+NULL));
+    Parrot_base_classname_hash->vtable->set_integer_keyed(NULL,
+                                                          Parrot_base_classname_hash, 
+&key, enum_class_MultiArray);
 
 }
 
diff -urN parrot.orig/include/parrot/global_setup.h 
parrot/include/parrot/global_setup.h
--- parrot.orig/include/parrot/global_setup.h   Mon Aug 12 17:59:51 2002
+++ parrot/include/parrot/global_setup.h        Mon Aug 12 18:05:25 2002
@@ -30,6 +30,7 @@
 void Parrot_Coroutine_class_init(INTVAL);
 void Parrot_Continuation_class_init(INTVAL);
 void Parrot_CSub_class_init(INTVAL);
+void Parrot_MultiArray_class_init(INTVAL);
 
 void init_world(void);
 
diff -urN parrot.orig/include/parrot/pmc.h parrot/include/parrot/pmc.h
--- parrot.orig/include/parrot/pmc.h    Mon Aug 12 17:59:51 2002
+++ parrot/include/parrot/pmc.h Mon Aug 12 18:05:08 2002
@@ -27,6 +27,7 @@
     enum_class_Coroutine,
     enum_class_Continuation,
     enum_class_CSub,
+    enum_class_MultiArray,
     enum_class_max = 100
 };
 VAR_SCOPE VTABLE Parrot_base_vtables[enum_class_max];

Reply via email to