root/usr/src/cmd/refer/inv5.c
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */

/*
 * Copyright (c) 1980 Regents of the University of California.
 * All rights reserved. The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

#include <stdio.h>
#include <locale.h>

extern void err();

int
recopy(FILE *ft, FILE *fb, FILE *fa, int nhash)
{
        /* copy fb (old hash items/pointers) to ft (new ones) */
        int n, i, iflong;
        long getl();
        int getw();
        int *hpt_s;
        int (*getfun)();
        long *hpt_l;
        long k, lp;
        if (fa == NULL) {
                err(gettext("No old pointers"), 0);
                return (0);
        }
        fread(&n, sizeof (n), 1, fa);
        fread(&iflong, sizeof (iflong), 1, fa);
        if (iflong) {
                hpt_l = (long *)calloc(sizeof (*hpt_l), n+1);
                n = fread(hpt_l, sizeof (*hpt_l), n, fa);
        } else {
                hpt_s = (int *)calloc(sizeof (*hpt_s), n+1);
                n = fread(hpt_s, sizeof (*hpt_s), n, fa);
        }
        if (n != nhash)
                fprintf(stderr, gettext("Changing hash value to old %d\n"), n);
        fclose(fa);
        if (iflong)
                getfun = (int(*)())getl;
        else
                getfun = getw;
        for (i = 0; i < n; i++) {
                if (iflong)
                        lp = hpt_l[i];
                else
                        lp = hpt_s[i];
                fseek(fb, lp, 0);
                while ((k = (*getfun)(fb)) != -1)
                        fprintf(ft, "%04d %06ld\n", i, k);
        }
        fclose(fb);
        return (n);
}