pass2a.c revision 355d6bb5e62a215a9bcf820ac85c1fc62bed2f3f
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Use is subject to license terms.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling/* All Rights Reserved */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Copyright (c) 1980, 1986, 1990 The Regents of the University of California.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * All rights reserved.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Redistribution and use in source and binary forms are permitted
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * provided that: (1) source distributions retain this entire copyright
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * notice and comment, and (2) distributions including binaries display
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * the following acknowledgement: ``This product includes software
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * developed by the University of California, Berkeley and its contributors''
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * in the documentation or other materials provided with the distribution
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * and in all advertising materials mentioning features or use of this
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * software. Neither the name of the University nor the names of its
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * contributors may be used to endorse or promote products derived
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * from this software without specific prior written permission.
139510fb6efa97dbe5f5479594b308d940cab8d1George Wilson * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
8c04a1fa3f7d569d48fe9b5342d0bd4c533179b9Gary Mills * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling#pragma ident "%Z%%M% %I% %E% SMI"
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling/* XXX should convert pass2a to using avl tree */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Directory contents table is keyed first by name length, and
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * then the actual name.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingtypedef struct dirtree {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Tree of contents of directory currently being traversed.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Elements are pointers to dirtree_t instances.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingstatic void discard_contents(void);
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrensstatic int dirtree_cmp(const void *, const void *);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Make sure directories don't contain duplicate names.
7fd05ac4dec0c343d2f68f310d3718b715ecfbafMatthew Ahrens for (inpp = inpsort; inpp < inpend; inpp++) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /* != DSTATE also covers case of == USTATE */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (((statemap[inp->i_number] & STMASK) != DSTATE) ||
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Used to scan a particular directory, noting what entries it contains.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * If a duplicate entry is found, it is reported and the user given
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * the option of clearing said entry.
4a92375985c37d61406d66cd2b10ee642eb1f5e7George Wilson * We've reached the end of the valid part of the directory.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling foundp = tfind((void *)&key, &contents, dirtree_cmp);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "Duplicate entries in dir I=%d for ``%s'': I=%d and I=%d",
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "Out of memory while looking for duplicate names in directory I=%d",
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) tdelete((void *)victim, &contents, dirtree_cmp);
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens const dirtree_t *lp = (const dirtree_t *)left;
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens const dirtree_t *rp = (const dirtree_t *)right;