~ubuntu-branches/debian/jessie/ion/jessie

« back to all changes in this revision

Viewing changes to ici/sdr/sdrhash.c

  • Committer: Package Import Robot
  • Author(s): Leo Iannacone
  • Date: 2012-05-21 10:45:07 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20120521104507-2pb9ppvkd9m0b89d
Tags: 3.0.0~dfsg1-1
* New upstream release (closes: #668483)
* Bump standars version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
159
159
        int     result;
160
160
        Object  hashElt;
161
161
 
 
162
        if (entry)
 
163
        {
 
164
                *entry = 0;     /*      Default result.                 */
 
165
        }
 
166
 
162
167
        if (!(sdr_in_xn(sdrv)))
163
168
        {
164
169
                oK(_iEnd(file, line, _notInXnMsg()));
256
261
        return 1;
257
262
}
258
263
 
259
 
int     sdr_hash_retrieve(Sdr sdrv, Object hash, char *key, Address *value)
 
264
Address sdr_hash_entry_value(Sdr sdrv, Object hash, Object entry)
 
265
{
 
266
        int     keyLength;
 
267
        int     kvpairLength;
 
268
        Object  kvpairAddr;
 
269
        KvPair  kvpair;
 
270
 
 
271
        CHKERR(sdrv);
 
272
        CHKERR(entry);
 
273
        CHKERR(takeSdr(sdrv->sdr) == 0);
 
274
        keyLength = sdr_table_user_data(sdrv, hash);
 
275
        kvpairLength = sizeof(Address) + keyLength;
 
276
        kvpairAddr = sdr_list_data(sdrv, entry);
 
277
        sdr_read(sdrv, (char *) &kvpair, kvpairAddr, kvpairLength);
 
278
        releaseSdr(sdrv->sdr);
 
279
        return kvpair.value;
 
280
}
 
281
 
 
282
int     sdr_hash_retrieve(Sdr sdrv, Object hash, char *key, Address *value,
 
283
                Object *entry)
260
284
{
261
285
        SdrState        *sdr;
262
286
        int             keyLength;
271
295
        KvPair          kvpair;
272
296
        int             result;
273
297
 
 
298
        if (entry)
 
299
        {
 
300
                *entry = 0;     /*      Default result.                 */
 
301
        }
 
302
 
274
303
        CHKERR(sdrv);
275
304
        CHKERR(hash);
276
305
        CHKERR(key);
300
329
                }
301
330
 
302
331
                *value = kvpair.value;
 
332
                if (entry)
 
333
                {
 
334
                        *entry = elt;
 
335
                }
 
336
 
303
337
                releaseSdr(sdr);
304
338
                return 1;       /*      Got it.                         */
305
339
        }
330
364
        return count;
331
365
}
332
366
 
 
367
 
 
368
int sdr_hash_foreach(Sdr sdrv, Object hash,
 
369
                sdr_hash_callback callback, void *args)
 
370
{
 
371
        SdrState        *sdr;
 
372
        int             keyLength;
 
373
        int             kvpairLength;
 
374
        int             rowSize;
 
375
        int             rowCount;
 
376
        int             rowNbr;
 
377
        Address         rowAddr;
 
378
        Object          listAddr;
 
379
        Object  elt;
 
380
        Object  kvpairAddr;
 
381
        KvPair          kvpair;
 
382
 
 
383
        CHKERR(sdrv);
 
384
        CHKERR(hash);
 
385
        CHKERR(callback);
 
386
        //Passing NULL args is OK (passed through to callback)
 
387
        sdr = sdrv->sdr;
 
388
        takeSdr(sdr);
 
389
        keyLength = sdr_table_user_data(sdrv, hash);
 
390
        kvpairLength = sizeof(Address) + keyLength;
 
391
        sdr_table_dimensions(sdrv, hash, &rowSize, &rowCount);
 
392
 
 
393
        /* Iterate over each row/bucket, loading the sdrlist of members of each. */
 
394
        for (rowNbr = 0; rowNbr < rowCount; rowNbr++)
 
395
        {
 
396
                rowAddr = sdr_table_row(sdrv, hash, rowNbr);
 
397
                sdr_read(sdrv, (char *) &listAddr, rowAddr, sizeof(Object));
 
398
 
 
399
                /* Iterate over each member of this bucket. */
 
400
                for (elt = sdr_list_first(sdrv, listAddr); elt;
 
401
                                elt = sdr_list_next(sdrv, elt))
 
402
                {
 
403
                        kvpairAddr = sdr_list_data(sdrv, elt);
 
404
                        sdr_read(sdrv, (char *) &kvpair, kvpairAddr, kvpairLength);
 
405
 
 
406
                        /* Call the callback passed to us with the key, value pair. */
 
407
                        callback(sdrv, hash, kvpair.key, kvpair.value, args);
 
408
                }
 
409
        }
 
410
        releaseSdr(sdr);
 
411
        return 0;
 
412
}
 
413
 
 
414
 
333
415
int     Sdr_hash_revise(char *file, int line, Sdr sdrv, Object hash, char *key,
334
416
                Address value)
335
417
{