Annotation of 43BSD/contrib/icon/functions/copy.c, revision 1.1.1.1

1.1       root        1: #include "../h/rt.h"
                      2: #include "../h/record.h"
                      3: 
                      4: /*
                      5:  * copy(x) - make a copy of object x.
                      6:  */
                      7: 
                      8: Xcopy(nargs, arg1, arg0)
                      9: int nargs;
                     10: struct descrip arg1, arg0;
                     11:    {
                     12:    register int i;
                     13:    struct descrip  *d1, *d2;
                     14:    union block *bp, *ep, **tp;
                     15:    extern struct b_table *alctable();
                     16:    extern struct b_telem *alctelem();
                     17:    extern struct b_set *alcset();
                     18:    extern struct b_selem *alcselem();
                     19:    extern union block *allocate();
                     20: 
                     21:    DeRef(arg1)
                     22: 
                     23:    if (NULLDESC(arg1) || QUAL(arg1))
                     24:       /*
                     25:        * x is a string or &null, just copy its descriptor
                     26:        *  into arg0.
                     27:        */
                     28:       arg0 = arg1;
                     29:    else {
                     30:       switch (TYPE(arg1)) {
                     31:          case T_INTEGER:
                     32: #ifdef LONGS
                     33:          case T_LONGINT:
                     34: #endif LONGS
                     35:          case T_REAL:
                     36:          case T_FILE:
                     37:          case T_CSET:
                     38:          case T_PROC:
                     39:          case T_ESTACK:
                     40:             /*
                     41:              * Copy integers, long integers, reals, files, csets, procedures,
                     42:              *  and co-expressions by copying the descriptor.  Note that for
                     43:              *  integers, this results in the assignment of a value, for the
                     44:              *  other types, a pointer is directed to a data block.
                     45:              */
                     46:             arg0 = arg1;
                     47:             break;
                     48: 
                     49:          case T_LIST:
                     50:             /*
                     51:              * Pass the buck to cplist to copy a list.
                     52:              */
                     53:             cplist(&arg1, &arg0, 1, BLKLOC(arg1)->list.cursize + 1);
                     54:             break;
                     55: 
                     56:          case T_TABLE:
                     57:             /*
                     58:              * Allocate space for table and elements and copy old table
                     59:              *  block into new.
                     60:              */
                     61:             hneed((sizeof(struct b_table)) +
                     62:                   (sizeof(struct b_telem)) * BLKLOC(arg1)->table.cursize);
                     63:             bp = (union block *) alctable(&nulldesc);
                     64:             bp->table = BLKLOC(arg1)->table;
                     65:             /*
                     66:              * Work down the chain of table element blocks in each bucket
                     67:              *  and create identical chains in new table.
                     68:              */
                     69:             for (i = 0; i < NBUCKETS; i++) {
                     70:                tp = &(BLKLOC(bp->table.buckets[i]));
                     71:                for (ep = *tp; ep != NULL; ep = *tp) {
                     72:                   *tp = (union block *) alctelem();
                     73:                   (*tp)->telem = ep->telem;
                     74:                   tp = &(BLKLOC((*tp)->telem.blink));
                     75:                   }
                     76:                }
                     77:             /*
                     78:              * Return the copied table.
                     79:              */
                     80:             arg0.type = D_TABLE;
                     81:             BLKLOC(arg0) = bp;
                     82:             break;
                     83: 
                     84: #ifdef SETS
                     85:          case T_SET:
                     86:             /*
                     87:              * Allocate space for set and elements and copy old set
                     88:              *  block into new.
                     89:              */
                     90:             hneed((sizeof(struct b_set)) +
                     91:                   (sizeof(struct b_selem)) * BLKLOC(arg1)->set.setsize);
                     92:             bp = (union block *) alcset(&nulldesc);
                     93:             bp->set = BLKLOC(arg1)->set;
                     94:             /*
                     95:              * Work down the chain of set elements in each bucket
                     96:              *  and create identical chains in new set.
                     97:              */
                     98:             for (i = 0; i < NBUCKETS; i++) {
                     99:                tp = &(BLKLOC(bp->set.sbucks[i]));
                    100:                for (ep = *tp; ep != NULL; ep = *tp) {
                    101:                   *tp = (union block *) alcselem(&nulldesc,0);
                    102:                   (*tp)->selem = ep->selem;
                    103:                   tp = &(BLKLOC((*tp)->selem.sblink));
                    104:                   }
                    105:                }
                    106:             /*
                    107:              * Return the copied set.
                    108:              */
                    109:             arg0.type = D_SET;
                    110:             BLKLOC(arg0) = bp;
                    111:             break;
                    112: #endif SETS
                    113: 
                    114:          case T_RECORD:
                    115:             /*
                    116:              * Allocate space for the new record and copy the old
                    117:              *  one into it.
                    118:              */
                    119:             i = BLKLOC(arg1)->record.size;
                    120:             hneed(i);
                    121:             bp = allocate(i);
                    122:             bp->record = BLKLOC(arg1)->record;
                    123:             /*
                    124:              * The above assignment doesn't copy the fields, they are
                    125:              *  copied individually via a loop.
                    126:              */
                    127:             i = bp->record.recptr->nfields;
                    128:             d1 = bp->record.fields;
                    129:             d2 = BLKLOC(arg1)->record.fields;
                    130:             while (i--)
                    131:                *d1++ = *d2++;
                    132:             /*
                    133:              * Return the copied record
                    134:              */
                    135:             arg0.type = D_RECORD;
                    136:             BLKLOC(arg0) = bp;
                    137:             break;
                    138: 
                    139:          default:
                    140:             syserr("copy: illegal datatype.");
                    141:          }
                    142:       }
                    143:    }
                    144: 
                    145: Procblock(copy,1)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.