/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1995-1998 by Sun Microsystems, Inc. * All rights reserved. */ /* LINTLIBRARY */ /* * ptrmove.c * * Copyright 1990, 1995 by Mortice Kern Systems Inc. All rights reserved. * */ #ifdef M_RCSID #ifndef lint static char rcsID[] = "$Header: /rd/src/libc/xcurses/rcs/ptrmove.c 1.3 " "1995/05/18 20:55:05 ant Exp $"; #endif #endif #include static void reverse(void **, unsigned int, unsigned int); /* * Move range start..finish inclusive before the given location. * Return -1 if the region to move is out of bounds or the target * falls within the region; 0 for success. * * (See Software Tools chapter 6.) */ int __m_ptr_move(void **array, unsigned int length, unsigned int start, unsigned int finish, unsigned int to) { if (finish < start || length <= finish) return (-1); if (to < start) { reverse(array, to, start-1); reverse(array, start, finish); reverse(array, to, finish); } else if (finish < to && to <= length) { reverse(array, start, finish); reverse(array, finish+1, to-1); reverse(array, start, to-1); } else { return (-1); } return (0); } /* * Reverse range a..b inclusive. */ static void reverse(void **ptr, unsigned int a, unsigned int b) { void *temp; void **a_ptr = &ptr[a]; void **b_ptr = &ptr[b]; while (a_ptr < b_ptr) { temp = *a_ptr; *a_ptr++ = *b_ptr; *b_ptr-- = temp; } }