1827bd09bSSatish Balay 2827bd09bSSatish Balay /**********************************ivec.c************************************** 3827bd09bSSatish Balay SPARSE GATHER-SCATTER PACKAGE: bss_malloc bss_malloc ivec error comm gs queue 4827bd09bSSatish Balay 5827bd09bSSatish Balay Author: Henry M. Tufo III 6827bd09bSSatish Balay 7827bd09bSSatish Balay e-mail: hmt@cs.brown.edu 8827bd09bSSatish Balay 9827bd09bSSatish Balay snail-mail: 10827bd09bSSatish Balay Division of Applied Mathematics 11827bd09bSSatish Balay Brown University 12827bd09bSSatish Balay Providence, RI 02912 13827bd09bSSatish Balay 14827bd09bSSatish Balay Last Modification: 15827bd09bSSatish Balay 6.21.97 16827bd09bSSatish Balay ***********************************ivec.c*************************************/ 17827bd09bSSatish Balay 18827bd09bSSatish Balay /**********************************ivec.c************************************** 19827bd09bSSatish Balay File Description: 20827bd09bSSatish Balay ----------------- 21827bd09bSSatish Balay 22827bd09bSSatish Balay ***********************************ivec.c*************************************/ 23827bd09bSSatish Balay #include <stdio.h> 24827bd09bSSatish Balay #include <math.h> 25827bd09bSSatish Balay #include <float.h> 26827bd09bSSatish Balay #include <limits.h> 27827bd09bSSatish Balay 28827bd09bSSatish Balay #ifdef MPISRC 29827bd09bSSatish Balay #include <mpi.h> 30827bd09bSSatish Balay #endif 31827bd09bSSatish Balay 32827bd09bSSatish Balay 33827bd09bSSatish Balay #include "const.h" 34827bd09bSSatish Balay #include "types.h" 35827bd09bSSatish Balay #include "ivec.h" 36827bd09bSSatish Balay #include "error.h" 37827bd09bSSatish Balay #include "comm.h" 38827bd09bSSatish Balay 39827bd09bSSatish Balay 40827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */ 41827bd09bSSatish Balay #define SORT_OPT 6 42827bd09bSSatish Balay #define SORT_STACK 50000 43827bd09bSSatish Balay 44827bd09bSSatish Balay 45827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */ 46827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK]; 47827bd09bSSatish Balay static int size_stack[SORT_STACK]; 48827bd09bSSatish Balay static PTRINT psize_stack[SORT_STACK]; 49827bd09bSSatish Balay 50827bd09bSSatish Balay 51827bd09bSSatish Balay 52827bd09bSSatish Balay /**********************************ivec.c************************************** 53827bd09bSSatish Balay Function ivec_dump() 54827bd09bSSatish Balay 55827bd09bSSatish Balay Input : 56827bd09bSSatish Balay Output: 57827bd09bSSatish Balay Return: 58827bd09bSSatish Balay Description: 59827bd09bSSatish Balay ***********************************ivec.c*************************************/ 60827bd09bSSatish Balay void 61827bd09bSSatish Balay ivec_dump(int *v, int n, int tag, int tag2, char * s) 62827bd09bSSatish Balay { 63827bd09bSSatish Balay int i; 64827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 65827bd09bSSatish Balay for (i=0;i<n;i++) 66827bd09bSSatish Balay {printf("%2d ",v[i]);} 67827bd09bSSatish Balay printf("\n"); 68827bd09bSSatish Balay fflush(stdout); 69827bd09bSSatish Balay } 70827bd09bSSatish Balay 71827bd09bSSatish Balay 72827bd09bSSatish Balay 73827bd09bSSatish Balay /**********************************ivec.c************************************** 74827bd09bSSatish Balay Function ivec_lb_ub() 75827bd09bSSatish Balay 76827bd09bSSatish Balay Input : 77827bd09bSSatish Balay Output: 78827bd09bSSatish Balay Return: 79827bd09bSSatish Balay Description: 80827bd09bSSatish Balay ***********************************ivec.c*************************************/ 81827bd09bSSatish Balay void 82827bd09bSSatish Balay ivec_lb_ub(register int *arg1, register int n, int *lb, int *ub) 83827bd09bSSatish Balay { 84827bd09bSSatish Balay register int min = INT_MAX; 85827bd09bSSatish Balay register int max = INT_MIN; 86827bd09bSSatish Balay 87827bd09bSSatish Balay while (n--) 88827bd09bSSatish Balay { 89827bd09bSSatish Balay min = MIN(min,*arg1); 90827bd09bSSatish Balay max = MAX(max,*arg1); 91827bd09bSSatish Balay arg1++; 92827bd09bSSatish Balay } 93827bd09bSSatish Balay 94827bd09bSSatish Balay *lb=min; 95827bd09bSSatish Balay *ub=max; 96827bd09bSSatish Balay } 97827bd09bSSatish Balay 98827bd09bSSatish Balay 99827bd09bSSatish Balay 100827bd09bSSatish Balay /**********************************ivec.c************************************** 101827bd09bSSatish Balay Function ivec_copy() 102827bd09bSSatish Balay 103827bd09bSSatish Balay Input : 104827bd09bSSatish Balay Output: 105827bd09bSSatish Balay Return: 106827bd09bSSatish Balay Description: 107827bd09bSSatish Balay ***********************************ivec.c*************************************/ 108*d890fc11SSatish Balay int *ivec_copy(register int *arg1, register int *arg2, register int n) 109827bd09bSSatish Balay { 110827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 111827bd09bSSatish Balay return(arg1); 112827bd09bSSatish Balay } 113827bd09bSSatish Balay 114827bd09bSSatish Balay 115827bd09bSSatish Balay 116827bd09bSSatish Balay /**********************************ivec.c************************************** 117827bd09bSSatish Balay Function ivec_zero() 118827bd09bSSatish Balay 119827bd09bSSatish Balay Input : 120827bd09bSSatish Balay Output: 121827bd09bSSatish Balay Return: 122827bd09bSSatish Balay Description: 123827bd09bSSatish Balay ***********************************ivec.c*************************************/ 124827bd09bSSatish Balay void 125827bd09bSSatish Balay ivec_zero(register int *arg1, register int n) 126827bd09bSSatish Balay { 127827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 128827bd09bSSatish Balay } 129827bd09bSSatish Balay 130827bd09bSSatish Balay 131827bd09bSSatish Balay 132827bd09bSSatish Balay /**********************************ivec.c************************************** 133827bd09bSSatish Balay Function ivec_comp() 134827bd09bSSatish Balay 135827bd09bSSatish Balay Input : 136827bd09bSSatish Balay Output: 137827bd09bSSatish Balay Return: 138827bd09bSSatish Balay Description: 139827bd09bSSatish Balay ***********************************ivec.c*************************************/ 140827bd09bSSatish Balay void 141827bd09bSSatish Balay ivec_comp(register int *arg1, register int n) 142827bd09bSSatish Balay { 143827bd09bSSatish Balay while (n--) {*arg1 = ~*arg1; arg1++;} 144827bd09bSSatish Balay } 145827bd09bSSatish Balay 146827bd09bSSatish Balay 147827bd09bSSatish Balay 148827bd09bSSatish Balay /**********************************ivec.c************************************** 149827bd09bSSatish Balay Function ivec_neg_one() 150827bd09bSSatish Balay 151827bd09bSSatish Balay Input : 152827bd09bSSatish Balay Output: 153827bd09bSSatish Balay Return: 154827bd09bSSatish Balay Description: 155827bd09bSSatish Balay ***********************************ivec.c*************************************/ 156827bd09bSSatish Balay void 157827bd09bSSatish Balay ivec_neg_one(register int *arg1, register int n) 158827bd09bSSatish Balay { 159827bd09bSSatish Balay while (n--) {*arg1++ = -1;} 160827bd09bSSatish Balay } 161827bd09bSSatish Balay 162827bd09bSSatish Balay 163827bd09bSSatish Balay 164827bd09bSSatish Balay /**********************************ivec.c************************************** 165827bd09bSSatish Balay Function ivec_pos_one() 166827bd09bSSatish Balay 167827bd09bSSatish Balay Input : 168827bd09bSSatish Balay Output: 169827bd09bSSatish Balay Return: 170827bd09bSSatish Balay Description: 171827bd09bSSatish Balay ***********************************ivec.c*************************************/ 172827bd09bSSatish Balay void 173827bd09bSSatish Balay ivec_pos_one(register int *arg1, register int n) 174827bd09bSSatish Balay { 175827bd09bSSatish Balay while (n--) {*arg1++ = 1;} 176827bd09bSSatish Balay } 177827bd09bSSatish Balay 178827bd09bSSatish Balay 179827bd09bSSatish Balay 180827bd09bSSatish Balay /**********************************ivec.c************************************** 181827bd09bSSatish Balay Function ivec_c_index() 182827bd09bSSatish Balay 183827bd09bSSatish Balay Input : 184827bd09bSSatish Balay Output: 185827bd09bSSatish Balay Return: 186827bd09bSSatish Balay Description: 187827bd09bSSatish Balay ***********************************ivec.c*************************************/ 188827bd09bSSatish Balay void 189827bd09bSSatish Balay ivec_c_index(register int *arg1, register int n) 190827bd09bSSatish Balay { 191827bd09bSSatish Balay register int i=0; 192827bd09bSSatish Balay 193827bd09bSSatish Balay 194827bd09bSSatish Balay while (n--) {*arg1++ = i++;} 195827bd09bSSatish Balay } 196827bd09bSSatish Balay 197827bd09bSSatish Balay 198827bd09bSSatish Balay 199827bd09bSSatish Balay /**********************************ivec.c************************************** 200827bd09bSSatish Balay Function ivec_fortran_index() 201827bd09bSSatish Balay 202827bd09bSSatish Balay Input : 203827bd09bSSatish Balay Output: 204827bd09bSSatish Balay Return: 205827bd09bSSatish Balay Description: 206827bd09bSSatish Balay ***********************************ivec.c*************************************/ 207827bd09bSSatish Balay void 208827bd09bSSatish Balay ivec_fortran_index(register int *arg1, register int n) 209827bd09bSSatish Balay { 210827bd09bSSatish Balay register int i=0; 211827bd09bSSatish Balay 212827bd09bSSatish Balay 213827bd09bSSatish Balay while (n--) {*arg1++ = ++i;} 214827bd09bSSatish Balay } 215827bd09bSSatish Balay 216827bd09bSSatish Balay 217827bd09bSSatish Balay 218827bd09bSSatish Balay /**********************************ivec.c************************************** 219827bd09bSSatish Balay Function ivec_set() 220827bd09bSSatish Balay 221827bd09bSSatish Balay Input : 222827bd09bSSatish Balay Output: 223827bd09bSSatish Balay Return: 224827bd09bSSatish Balay Description: 225827bd09bSSatish Balay ***********************************ivec.c*************************************/ 226827bd09bSSatish Balay void 227827bd09bSSatish Balay ivec_set(register int *arg1, register int arg2, register int n) 228827bd09bSSatish Balay { 229827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 230827bd09bSSatish Balay } 231827bd09bSSatish Balay 232827bd09bSSatish Balay 233827bd09bSSatish Balay 234827bd09bSSatish Balay /**********************************ivec.c************************************** 235827bd09bSSatish Balay Function ivec_cmp() 236827bd09bSSatish Balay 237827bd09bSSatish Balay Input : 238827bd09bSSatish Balay Output: 239827bd09bSSatish Balay Return: 240827bd09bSSatish Balay Description: 241827bd09bSSatish Balay ***********************************ivec.c*************************************/ 242827bd09bSSatish Balay int 243827bd09bSSatish Balay ivec_cmp(register int *arg1, register int *arg2, register int n) 244827bd09bSSatish Balay { 245827bd09bSSatish Balay while (n--) {if (*arg1++ != *arg2++) {return(FALSE);}} 246827bd09bSSatish Balay return(TRUE); 247827bd09bSSatish Balay } 248827bd09bSSatish Balay 249827bd09bSSatish Balay 250827bd09bSSatish Balay 251827bd09bSSatish Balay /**********************************ivec.c************************************** 252827bd09bSSatish Balay Function ivec_max() 253827bd09bSSatish Balay 254827bd09bSSatish Balay Input : 255827bd09bSSatish Balay Output: 256827bd09bSSatish Balay Return: 257827bd09bSSatish Balay Description: 258827bd09bSSatish Balay ***********************************ivec.c*************************************/ 259827bd09bSSatish Balay void 260827bd09bSSatish Balay ivec_max(register int *arg1, register int *arg2, register int n) 261827bd09bSSatish Balay { 262827bd09bSSatish Balay while (n--) {*arg1 = MAX(*arg1,*arg2); arg1++; arg2++;} 263827bd09bSSatish Balay } 264827bd09bSSatish Balay 265827bd09bSSatish Balay 266827bd09bSSatish Balay 267827bd09bSSatish Balay /**********************************ivec.c************************************** 268827bd09bSSatish Balay Function ivec_min() 269827bd09bSSatish Balay 270827bd09bSSatish Balay Input : 271827bd09bSSatish Balay Output: 272827bd09bSSatish Balay Return: 273827bd09bSSatish Balay Description: 274827bd09bSSatish Balay ***********************************ivec.c*************************************/ 275827bd09bSSatish Balay void 276827bd09bSSatish Balay ivec_min(register int *arg1, register int *arg2, register int n) 277827bd09bSSatish Balay { 278827bd09bSSatish Balay while (n--) {*(arg1) = MIN(*arg1,*arg2); arg1++; arg2++;} 279827bd09bSSatish Balay } 280827bd09bSSatish Balay 281827bd09bSSatish Balay 282827bd09bSSatish Balay 283827bd09bSSatish Balay /**********************************ivec.c************************************** 284827bd09bSSatish Balay Function ivec_mult() 285827bd09bSSatish Balay 286827bd09bSSatish Balay Input : 287827bd09bSSatish Balay Output: 288827bd09bSSatish Balay Return: 289827bd09bSSatish Balay Description: 290827bd09bSSatish Balay ***********************************ivec.c*************************************/ 291827bd09bSSatish Balay void 292827bd09bSSatish Balay ivec_mult(register int *arg1, register int *arg2, register int n) 293827bd09bSSatish Balay { 294827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 295827bd09bSSatish Balay } 296827bd09bSSatish Balay 297827bd09bSSatish Balay 298827bd09bSSatish Balay 299827bd09bSSatish Balay /**********************************ivec.c************************************** 300827bd09bSSatish Balay Function ivec_add() 301827bd09bSSatish Balay 302827bd09bSSatish Balay Input : 303827bd09bSSatish Balay Output: 304827bd09bSSatish Balay Return: 305827bd09bSSatish Balay Description: 306827bd09bSSatish Balay ***********************************ivec.c*************************************/ 307827bd09bSSatish Balay void 308827bd09bSSatish Balay ivec_add(register int *arg1, register int *arg2, register int n) 309827bd09bSSatish Balay { 310827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 311827bd09bSSatish Balay } 312827bd09bSSatish Balay 313827bd09bSSatish Balay 314827bd09bSSatish Balay 315827bd09bSSatish Balay /**********************************ivec.c************************************** 316827bd09bSSatish Balay Function ivec_lxor() 317827bd09bSSatish Balay 318827bd09bSSatish Balay Input : 319827bd09bSSatish Balay Output: 320827bd09bSSatish Balay Return: 321827bd09bSSatish Balay Description: 322827bd09bSSatish Balay ***********************************ivec.c*************************************/ 323827bd09bSSatish Balay void 324827bd09bSSatish Balay ivec_lxor(register int *arg1, register int *arg2, register int n) 325827bd09bSSatish Balay { 326827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;} 327827bd09bSSatish Balay } 328827bd09bSSatish Balay 329827bd09bSSatish Balay 330827bd09bSSatish Balay 331827bd09bSSatish Balay /**********************************ivec.c************************************** 332827bd09bSSatish Balay Function ivec_xor() 333827bd09bSSatish Balay 334827bd09bSSatish Balay Input : 335827bd09bSSatish Balay Output: 336827bd09bSSatish Balay Return: 337827bd09bSSatish Balay Description: 338827bd09bSSatish Balay ***********************************ivec.c*************************************/ 339827bd09bSSatish Balay void 340827bd09bSSatish Balay ivec_xor(register int *arg1, register int *arg2, register int n) 341827bd09bSSatish Balay { 342827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 343827bd09bSSatish Balay } 344827bd09bSSatish Balay 345827bd09bSSatish Balay 346827bd09bSSatish Balay 347827bd09bSSatish Balay /**********************************ivec.c************************************** 348827bd09bSSatish Balay Function ivec_or() 349827bd09bSSatish Balay 350827bd09bSSatish Balay Input : 351827bd09bSSatish Balay Output: 352827bd09bSSatish Balay Return: 353827bd09bSSatish Balay Description: 354827bd09bSSatish Balay ***********************************ivec.c*************************************/ 355827bd09bSSatish Balay void 356827bd09bSSatish Balay ivec_or(register int *arg1, register int *arg2, register int n) 357827bd09bSSatish Balay { 358827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 359827bd09bSSatish Balay } 360827bd09bSSatish Balay 361827bd09bSSatish Balay 362827bd09bSSatish Balay 363827bd09bSSatish Balay /**********************************ivec.c************************************** 364827bd09bSSatish Balay Function ivec_lor() 365827bd09bSSatish Balay 366827bd09bSSatish Balay Input : 367827bd09bSSatish Balay Output: 368827bd09bSSatish Balay Return: 369827bd09bSSatish Balay Description: 370827bd09bSSatish Balay ***********************************ivec.c*************************************/ 371827bd09bSSatish Balay void 372827bd09bSSatish Balay ivec_lor(register int *arg1, register int *arg2, register int n) 373827bd09bSSatish Balay { 374827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 375827bd09bSSatish Balay } 376827bd09bSSatish Balay 377827bd09bSSatish Balay 378827bd09bSSatish Balay 379827bd09bSSatish Balay /**********************************ivec.c************************************** 380827bd09bSSatish Balay Function ivec_or3() 381827bd09bSSatish Balay 382827bd09bSSatish Balay Input : 383827bd09bSSatish Balay Output: 384827bd09bSSatish Balay Return: 385827bd09bSSatish Balay Description: 386827bd09bSSatish Balay ***********************************ivec.c*************************************/ 387827bd09bSSatish Balay void 388827bd09bSSatish Balay ivec_or3(register int *arg1, register int *arg2, register int *arg3, 389827bd09bSSatish Balay register int n) 390827bd09bSSatish Balay { 391827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ | *arg3++);} 392827bd09bSSatish Balay } 393827bd09bSSatish Balay 394827bd09bSSatish Balay 395827bd09bSSatish Balay 396827bd09bSSatish Balay /**********************************ivec.c************************************** 397827bd09bSSatish Balay Function ivec_and() 398827bd09bSSatish Balay 399827bd09bSSatish Balay Input : 400827bd09bSSatish Balay Output: 401827bd09bSSatish Balay Return: 402827bd09bSSatish Balay Description: 403827bd09bSSatish Balay ***********************************ivec.c*************************************/ 404827bd09bSSatish Balay void 405827bd09bSSatish Balay ivec_and(register int *arg1, register int *arg2, register int n) 406827bd09bSSatish Balay { 407827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 408827bd09bSSatish Balay } 409827bd09bSSatish Balay 410827bd09bSSatish Balay 411827bd09bSSatish Balay 412827bd09bSSatish Balay /**********************************ivec.c************************************** 413827bd09bSSatish Balay Function ivec_land() 414827bd09bSSatish Balay 415827bd09bSSatish Balay Input : 416827bd09bSSatish Balay Output: 417827bd09bSSatish Balay Return: 418827bd09bSSatish Balay Description: 419827bd09bSSatish Balay ***********************************ivec.c*************************************/ 420827bd09bSSatish Balay void 421827bd09bSSatish Balay ivec_land(register int *arg1, register int *arg2, register int n) 422827bd09bSSatish Balay { 423827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 424827bd09bSSatish Balay } 425827bd09bSSatish Balay 426827bd09bSSatish Balay 427827bd09bSSatish Balay 428827bd09bSSatish Balay /**********************************ivec.c************************************** 429827bd09bSSatish Balay Function ivec_and3() 430827bd09bSSatish Balay 431827bd09bSSatish Balay Input : 432827bd09bSSatish Balay Output: 433827bd09bSSatish Balay Return: 434827bd09bSSatish Balay Description: 435827bd09bSSatish Balay ***********************************ivec.c*************************************/ 436827bd09bSSatish Balay void 437827bd09bSSatish Balay ivec_and3(register int *arg1, register int *arg2, register int *arg3, 438827bd09bSSatish Balay register int n) 439827bd09bSSatish Balay { 440827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 441827bd09bSSatish Balay } 442827bd09bSSatish Balay 443827bd09bSSatish Balay 444827bd09bSSatish Balay 445827bd09bSSatish Balay /**********************************ivec.c************************************** 446827bd09bSSatish Balay Function ivec_sum 447827bd09bSSatish Balay 448827bd09bSSatish Balay Input : 449827bd09bSSatish Balay Output: 450827bd09bSSatish Balay Return: 451827bd09bSSatish Balay Description: 452827bd09bSSatish Balay ***********************************ivec.c*************************************/ 453*d890fc11SSatish Balay int ivec_sum(register int *arg1, register int n) 454827bd09bSSatish Balay { 455827bd09bSSatish Balay register int tmp = 0; 456827bd09bSSatish Balay 457827bd09bSSatish Balay 458827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 459827bd09bSSatish Balay return(tmp); 460827bd09bSSatish Balay } 461827bd09bSSatish Balay 462827bd09bSSatish Balay 463827bd09bSSatish Balay 464827bd09bSSatish Balay /**********************************ivec.c************************************** 465827bd09bSSatish Balay Function ivec_reduce_and 466827bd09bSSatish Balay 467827bd09bSSatish Balay Input : 468827bd09bSSatish Balay Output: 469827bd09bSSatish Balay Return: 470827bd09bSSatish Balay Description: 471827bd09bSSatish Balay ***********************************ivec.c*************************************/ 472*d890fc11SSatish Balay int ivec_reduce_and(register int *arg1, register int n) 473827bd09bSSatish Balay { 474827bd09bSSatish Balay register int tmp = ALL_ONES; 475827bd09bSSatish Balay 476827bd09bSSatish Balay 477827bd09bSSatish Balay while (n--) {tmp &= *arg1++;} 478827bd09bSSatish Balay return(tmp); 479827bd09bSSatish Balay } 480827bd09bSSatish Balay 481827bd09bSSatish Balay 482827bd09bSSatish Balay 483827bd09bSSatish Balay /**********************************ivec.c************************************** 484827bd09bSSatish Balay Function ivec_reduce_or 485827bd09bSSatish Balay 486827bd09bSSatish Balay Input : 487827bd09bSSatish Balay Output: 488827bd09bSSatish Balay Return: 489827bd09bSSatish Balay Description: 490827bd09bSSatish Balay ***********************************ivec.c*************************************/ 491*d890fc11SSatish Balay int ivec_reduce_or(register int *arg1, register int n) 492827bd09bSSatish Balay { 493827bd09bSSatish Balay register int tmp = 0; 494827bd09bSSatish Balay 495827bd09bSSatish Balay 496827bd09bSSatish Balay while (n--) {tmp |= *arg1++;} 497827bd09bSSatish Balay return(tmp); 498827bd09bSSatish Balay } 499827bd09bSSatish Balay 500827bd09bSSatish Balay 501827bd09bSSatish Balay 502827bd09bSSatish Balay /**********************************ivec.c************************************** 503827bd09bSSatish Balay Function ivec_prod 504827bd09bSSatish Balay 505827bd09bSSatish Balay Input : 506827bd09bSSatish Balay Output: 507827bd09bSSatish Balay Return: 508827bd09bSSatish Balay Description: 509827bd09bSSatish Balay ***********************************ivec.c*************************************/ 510*d890fc11SSatish Balay int ivec_prod(register int *arg1, register int n) 511827bd09bSSatish Balay { 512827bd09bSSatish Balay register int tmp = 1; 513827bd09bSSatish Balay 514827bd09bSSatish Balay 515827bd09bSSatish Balay while (n--) {tmp *= *arg1++;} 516827bd09bSSatish Balay return(tmp); 517827bd09bSSatish Balay } 518827bd09bSSatish Balay 519827bd09bSSatish Balay 520827bd09bSSatish Balay 521827bd09bSSatish Balay /**********************************ivec.c************************************** 522827bd09bSSatish Balay Function ivec_u_sum 523827bd09bSSatish Balay 524827bd09bSSatish Balay Input : 525827bd09bSSatish Balay Output: 526827bd09bSSatish Balay Return: 527827bd09bSSatish Balay Description: 528827bd09bSSatish Balay ***********************************ivec.c*************************************/ 529*d890fc11SSatish Balay int ivec_u_sum(register unsigned *arg1, register int n) 530827bd09bSSatish Balay { 531827bd09bSSatish Balay register unsigned tmp = 0; 532827bd09bSSatish Balay 533827bd09bSSatish Balay 534827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 535827bd09bSSatish Balay return(tmp); 536827bd09bSSatish Balay } 537827bd09bSSatish Balay 538827bd09bSSatish Balay 539827bd09bSSatish Balay 540827bd09bSSatish Balay /**********************************ivec.c************************************** 541827bd09bSSatish Balay Function ivec_lb() 542827bd09bSSatish Balay 543827bd09bSSatish Balay Input : 544827bd09bSSatish Balay Output: 545827bd09bSSatish Balay Return: 546827bd09bSSatish Balay Description: 547827bd09bSSatish Balay ***********************************ivec.c*************************************/ 548827bd09bSSatish Balay int 549827bd09bSSatish Balay ivec_lb(register int *arg1, register int n) 550827bd09bSSatish Balay { 551827bd09bSSatish Balay register int min = INT_MAX; 552827bd09bSSatish Balay 553827bd09bSSatish Balay 554827bd09bSSatish Balay while (n--) {min = MIN(min,*arg1); arg1++;} 555827bd09bSSatish Balay return(min); 556827bd09bSSatish Balay } 557827bd09bSSatish Balay 558827bd09bSSatish Balay 559827bd09bSSatish Balay 560827bd09bSSatish Balay /**********************************ivec.c************************************** 561827bd09bSSatish Balay Function ivec_ub() 562827bd09bSSatish Balay 563827bd09bSSatish Balay Input : 564827bd09bSSatish Balay Output: 565827bd09bSSatish Balay Return: 566827bd09bSSatish Balay Description: 567827bd09bSSatish Balay ***********************************ivec.c*************************************/ 568827bd09bSSatish Balay int 569827bd09bSSatish Balay ivec_ub(register int *arg1, register int n) 570827bd09bSSatish Balay { 571827bd09bSSatish Balay register int max = INT_MIN; 572827bd09bSSatish Balay 573827bd09bSSatish Balay 574827bd09bSSatish Balay while (n--) {max = MAX(max,*arg1); arg1++;} 575827bd09bSSatish Balay return(max); 576827bd09bSSatish Balay } 577827bd09bSSatish Balay 578827bd09bSSatish Balay 579827bd09bSSatish Balay 580827bd09bSSatish Balay /**********************************ivec.c************************************** 581827bd09bSSatish Balay Function split_buf() 582827bd09bSSatish Balay 583827bd09bSSatish Balay Input : 584827bd09bSSatish Balay Output: 585827bd09bSSatish Balay Return: 586827bd09bSSatish Balay Description: 587827bd09bSSatish Balay 588827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!! 589827bd09bSSatish Balay ***********************************ivec.c*************************************/ 590827bd09bSSatish Balay int 591827bd09bSSatish Balay ivec_split_buf(int *buf1, int **buf2, register int size) 592827bd09bSSatish Balay { 593827bd09bSSatish Balay *buf2 = (buf1 + (size>>3)); 594827bd09bSSatish Balay return(size); 595827bd09bSSatish Balay } 596827bd09bSSatish Balay 597827bd09bSSatish Balay 598827bd09bSSatish Balay 599827bd09bSSatish Balay /**********************************ivec.c************************************** 600827bd09bSSatish Balay Function ivec_non_uniform() 601827bd09bSSatish Balay 602827bd09bSSatish Balay Input : 603827bd09bSSatish Balay Output: 604827bd09bSSatish Balay Return: 605827bd09bSSatish Balay Description: 606827bd09bSSatish Balay ***********************************ivec.c*************************************/ 607827bd09bSSatish Balay void 608827bd09bSSatish Balay ivec_non_uniform(int *arg1, int *arg2, register int n, register int *arg3) 609827bd09bSSatish Balay { 610827bd09bSSatish Balay register int i, j, type; 611827bd09bSSatish Balay 612827bd09bSSatish Balay 613827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 614827bd09bSSatish Balay for (i=0;i<n;) 615827bd09bSSatish Balay { 616827bd09bSSatish Balay /* clump 'em for now */ 617827bd09bSSatish Balay j=i+1; 618827bd09bSSatish Balay type = arg3[i]; 619827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 620827bd09bSSatish Balay {j++;} 621827bd09bSSatish Balay 622827bd09bSSatish Balay /* how many together */ 623827bd09bSSatish Balay j -= i; 624827bd09bSSatish Balay 625827bd09bSSatish Balay /* call appropriate ivec function */ 626827bd09bSSatish Balay if (type == GL_MAX) 627827bd09bSSatish Balay {ivec_max(arg1,arg2,j);} 628827bd09bSSatish Balay else if (type == GL_MIN) 629827bd09bSSatish Balay {ivec_min(arg1,arg2,j);} 630827bd09bSSatish Balay else if (type == GL_MULT) 631827bd09bSSatish Balay {ivec_mult(arg1,arg2,j);} 632827bd09bSSatish Balay else if (type == GL_ADD) 633827bd09bSSatish Balay {ivec_add(arg1,arg2,j);} 634827bd09bSSatish Balay else if (type == GL_B_XOR) 635827bd09bSSatish Balay {ivec_xor(arg1,arg2,j);} 636827bd09bSSatish Balay else if (type == GL_B_OR) 637827bd09bSSatish Balay {ivec_or(arg1,arg2,j);} 638827bd09bSSatish Balay else if (type == GL_B_AND) 639827bd09bSSatish Balay {ivec_and(arg1,arg2,j);} 640827bd09bSSatish Balay else if (type == GL_L_XOR) 641827bd09bSSatish Balay {ivec_lxor(arg1,arg2,j);} 642827bd09bSSatish Balay else if (type == GL_L_OR) 643827bd09bSSatish Balay {ivec_lor(arg1,arg2,j);} 644827bd09bSSatish Balay else if (type == GL_L_AND) 645827bd09bSSatish Balay {ivec_land(arg1,arg2,j);} 646827bd09bSSatish Balay else 647827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");} 648827bd09bSSatish Balay 649827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 650827bd09bSSatish Balay } 651827bd09bSSatish Balay } 652827bd09bSSatish Balay 653827bd09bSSatish Balay 654827bd09bSSatish Balay 655827bd09bSSatish Balay /**********************************ivec.c************************************** 656827bd09bSSatish Balay Function ivec_addr() 657827bd09bSSatish Balay 658827bd09bSSatish Balay Input : 659827bd09bSSatish Balay Output: 660827bd09bSSatish Balay Return: 661827bd09bSSatish Balay Description: 662827bd09bSSatish Balay ***********************************ivec.c*************************************/ 663827bd09bSSatish Balay vfp ivec_fct_addr(register int type) 664827bd09bSSatish Balay { 665827bd09bSSatish Balay if (type == NON_UNIFORM) 666827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_non_uniform);} 667827bd09bSSatish Balay else if (type == GL_MAX) 668827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_max);} 669827bd09bSSatish Balay else if (type == GL_MIN) 670827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_min);} 671827bd09bSSatish Balay else if (type == GL_MULT) 672827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_mult);} 673827bd09bSSatish Balay else if (type == GL_ADD) 674827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_add);} 675827bd09bSSatish Balay else if (type == GL_B_XOR) 676827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_xor);} 677827bd09bSSatish Balay else if (type == GL_B_OR) 678827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_or);} 679827bd09bSSatish Balay else if (type == GL_B_AND) 680827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_and);} 681827bd09bSSatish Balay else if (type == GL_L_XOR) 682827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_lxor);} 683827bd09bSSatish Balay else if (type == GL_L_OR) 684827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_lor);} 685827bd09bSSatish Balay else if (type == GL_L_AND) 686827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_land);} 687827bd09bSSatish Balay 688827bd09bSSatish Balay /* catch all ... not good if we get here */ 689827bd09bSSatish Balay return(NULL); 690827bd09bSSatish Balay } 691827bd09bSSatish Balay 692827bd09bSSatish Balay 693827bd09bSSatish Balay /**********************************ivec.c************************************** 694827bd09bSSatish Balay Function ct_bits() 695827bd09bSSatish Balay 696827bd09bSSatish Balay Input : 697827bd09bSSatish Balay Output: 698827bd09bSSatish Balay Return: 699827bd09bSSatish Balay Description: MUST FIX THIS!!! 700827bd09bSSatish Balay ***********************************ivec.c*************************************/ 701827bd09bSSatish Balay #if defined(notusing) 702827bd09bSSatish Balay static 703827bd09bSSatish Balay int 704827bd09bSSatish Balay ivec_ct_bits(register int *ptr, register int n) 705827bd09bSSatish Balay { 706827bd09bSSatish Balay register int tmp=0; 707827bd09bSSatish Balay 708827bd09bSSatish Balay 709827bd09bSSatish Balay /* should expand to full 32 bit */ 710827bd09bSSatish Balay while (n--) 711827bd09bSSatish Balay { 712827bd09bSSatish Balay if (*ptr&128) {tmp++;} 713827bd09bSSatish Balay if (*ptr&64) {tmp++;} 714827bd09bSSatish Balay if (*ptr&32) {tmp++;} 715827bd09bSSatish Balay if (*ptr&16) {tmp++;} 716827bd09bSSatish Balay if (*ptr&8) {tmp++;} 717827bd09bSSatish Balay if (*ptr&4) {tmp++;} 718827bd09bSSatish Balay if (*ptr&2) {tmp++;} 719827bd09bSSatish Balay if (*ptr&1) {tmp++;} 720827bd09bSSatish Balay ptr++; 721827bd09bSSatish Balay } 722827bd09bSSatish Balay 723827bd09bSSatish Balay return(tmp); 724827bd09bSSatish Balay } 725827bd09bSSatish Balay #endif 726827bd09bSSatish Balay 727827bd09bSSatish Balay 728827bd09bSSatish Balay /****************************************************************************** 729827bd09bSSatish Balay Function: ivec_sort(). 730827bd09bSSatish Balay 731827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 732827bd09bSSatish Balay Output: sorted list (in ascending order). 733827bd09bSSatish Balay Return: none. 734827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 735827bd09bSSatish Balay ******************************************************************************/ 736827bd09bSSatish Balay void 737827bd09bSSatish Balay ivec_sort(register int *ar, register int size) 738827bd09bSSatish Balay { 739827bd09bSSatish Balay register int *pi, *pj, temp; 740827bd09bSSatish Balay register int **top_a = (int **) offset_stack; 741827bd09bSSatish Balay register int *top_s = size_stack, *bottom_s = size_stack; 742827bd09bSSatish Balay 743827bd09bSSatish Balay 744827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 745827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 746827bd09bSSatish Balay size--; 747827bd09bSSatish Balay 748827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 749827bd09bSSatish Balay for (;;) 750827bd09bSSatish Balay { 751827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 752827bd09bSSatish Balay if (size > SORT_OPT) 753827bd09bSSatish Balay { 754827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 755827bd09bSSatish Balay pi = ar+1; 756827bd09bSSatish Balay pj = ar+size; 757827bd09bSSatish Balay 758827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 759827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 760827bd09bSSatish Balay 761827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 762827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 763827bd09bSSatish Balay if (*pi > *pj) 764827bd09bSSatish Balay {SWAP(*pi,*pj)} 765827bd09bSSatish Balay if (*ar > *pj) 766827bd09bSSatish Balay {SWAP(*ar,*pj)} 767827bd09bSSatish Balay else if (*pi > *ar) 768827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 769827bd09bSSatish Balay 770827bd09bSSatish Balay /* partition about pivot_value ... */ 771827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 772827bd09bSSatish Balay for(;;) 773827bd09bSSatish Balay { 774827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 775827bd09bSSatish Balay do pi++; while (*pi<*ar); 776827bd09bSSatish Balay do pj--; while (*pj>*ar); 777827bd09bSSatish Balay 778827bd09bSSatish Balay /* if we've crossed we're done */ 779827bd09bSSatish Balay if (pj<pi) break; 780827bd09bSSatish Balay 781827bd09bSSatish Balay /* else swap */ 782827bd09bSSatish Balay SWAP(*pi,*pj) 783827bd09bSSatish Balay } 784827bd09bSSatish Balay 785827bd09bSSatish Balay /* place pivot_value in it's correct location */ 786827bd09bSSatish Balay SWAP(*ar,*pj) 787827bd09bSSatish Balay 788827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 789827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 790827bd09bSSatish Balay {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");} 791827bd09bSSatish Balay 792827bd09bSSatish Balay /* push right hand child iff length > 1 */ 793827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 794827bd09bSSatish Balay { 795827bd09bSSatish Balay *(top_a++) = pi; 796827bd09bSSatish Balay size -= *top_s+2; 797827bd09bSSatish Balay top_s++; 798827bd09bSSatish Balay } 799827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 800827bd09bSSatish Balay else if (size -= *top_s+2) 801827bd09bSSatish Balay {;} 802827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 803827bd09bSSatish Balay else 804827bd09bSSatish Balay { 805827bd09bSSatish Balay ar = *(--top_a); 806827bd09bSSatish Balay size = *(--top_s); 807827bd09bSSatish Balay } 808827bd09bSSatish Balay } 809827bd09bSSatish Balay 810827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 811827bd09bSSatish Balay else 812827bd09bSSatish Balay { 813827bd09bSSatish Balay /* insertion sort for bottom */ 814827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 815827bd09bSSatish Balay { 816827bd09bSSatish Balay temp = *pj; 817827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 818827bd09bSSatish Balay { 819827bd09bSSatish Balay if (*pi <= temp) break; 820827bd09bSSatish Balay *(pi+1)=*pi; 821827bd09bSSatish Balay } 822827bd09bSSatish Balay *(pi+1)=temp; 823827bd09bSSatish Balay } 824827bd09bSSatish Balay 825827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 826827bd09bSSatish Balay if (top_s==bottom_s) return; 827827bd09bSSatish Balay 828827bd09bSSatish Balay /* else pop another list from the stack */ 829827bd09bSSatish Balay ar = *(--top_a); 830827bd09bSSatish Balay size = *(--top_s); 831827bd09bSSatish Balay } 832827bd09bSSatish Balay } 833827bd09bSSatish Balay } 834827bd09bSSatish Balay 835827bd09bSSatish Balay 836827bd09bSSatish Balay 837827bd09bSSatish Balay /****************************************************************************** 838827bd09bSSatish Balay Function: ivec_sort_companion(). 839827bd09bSSatish Balay 840827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 841827bd09bSSatish Balay Output: sorted list (in ascending order). 842827bd09bSSatish Balay Return: none. 843827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 844827bd09bSSatish Balay ******************************************************************************/ 845827bd09bSSatish Balay void 846827bd09bSSatish Balay ivec_sort_companion(register int *ar, register int *ar2, register int size) 847827bd09bSSatish Balay { 848827bd09bSSatish Balay register int *pi, *pj, temp, temp2; 849827bd09bSSatish Balay register int **top_a = (int **)offset_stack; 850827bd09bSSatish Balay register int *top_s = size_stack, *bottom_s = size_stack; 851827bd09bSSatish Balay register int *pi2, *pj2; 852827bd09bSSatish Balay register int mid; 853827bd09bSSatish Balay 854827bd09bSSatish Balay 855827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 856827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 857827bd09bSSatish Balay size--; 858827bd09bSSatish Balay 859827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 860827bd09bSSatish Balay for (;;) 861827bd09bSSatish Balay { 862827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 863827bd09bSSatish Balay if (size > SORT_OPT) 864827bd09bSSatish Balay { 865827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 866827bd09bSSatish Balay mid = size>>1; 867827bd09bSSatish Balay pi = ar+1; 868827bd09bSSatish Balay pj = ar+mid; 869827bd09bSSatish Balay pi2 = ar2+1; 870827bd09bSSatish Balay pj2 = ar2+mid; 871827bd09bSSatish Balay 872827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 873827bd09bSSatish Balay SWAP(*pi,*pj) 874827bd09bSSatish Balay SWAP(*pi2,*pj2) 875827bd09bSSatish Balay 876827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 877827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 878827bd09bSSatish Balay pj = ar+size; 879827bd09bSSatish Balay pj2 = ar2+size; 880827bd09bSSatish Balay if (*pi > *pj) 881827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 882827bd09bSSatish Balay if (*ar > *pj) 883827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 884827bd09bSSatish Balay else if (*pi > *ar) 885827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 886827bd09bSSatish Balay 887827bd09bSSatish Balay /* partition about pivot_value ... */ 888827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 889827bd09bSSatish Balay for(;;) 890827bd09bSSatish Balay { 891827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 892827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 893827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 894827bd09bSSatish Balay 895827bd09bSSatish Balay /* if we've crossed we're done */ 896827bd09bSSatish Balay if (pj<pi) break; 897827bd09bSSatish Balay 898827bd09bSSatish Balay /* else swap */ 899827bd09bSSatish Balay SWAP(*pi,*pj) 900827bd09bSSatish Balay SWAP(*pi2,*pj2) 901827bd09bSSatish Balay } 902827bd09bSSatish Balay 903827bd09bSSatish Balay /* place pivot_value in it's correct location */ 904827bd09bSSatish Balay SWAP(*ar,*pj) 905827bd09bSSatish Balay SWAP(*ar2,*pj2) 906827bd09bSSatish Balay 907827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 908827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 909827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");} 910827bd09bSSatish Balay 911827bd09bSSatish Balay /* push right hand child iff length > 1 */ 912827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 913827bd09bSSatish Balay { 914827bd09bSSatish Balay *(top_a++) = pi; 915827bd09bSSatish Balay *(top_a++) = pi2; 916827bd09bSSatish Balay size -= *top_s+2; 917827bd09bSSatish Balay top_s++; 918827bd09bSSatish Balay } 919827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 920827bd09bSSatish Balay else if (size -= *top_s+2) 921827bd09bSSatish Balay {;} 922827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 923827bd09bSSatish Balay else 924827bd09bSSatish Balay { 925827bd09bSSatish Balay ar2 = *(--top_a); 926827bd09bSSatish Balay ar = *(--top_a); 927827bd09bSSatish Balay size = *(--top_s); 928827bd09bSSatish Balay } 929827bd09bSSatish Balay } 930827bd09bSSatish Balay 931827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 932827bd09bSSatish Balay else 933827bd09bSSatish Balay { 934827bd09bSSatish Balay /* insertion sort for bottom */ 935827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 936827bd09bSSatish Balay { 937827bd09bSSatish Balay temp = *pj; 938827bd09bSSatish Balay temp2 = *pj2; 939827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 940827bd09bSSatish Balay { 941827bd09bSSatish Balay if (*pi <= temp) break; 942827bd09bSSatish Balay *(pi+1)=*pi; 943827bd09bSSatish Balay *(pi2+1)=*pi2; 944827bd09bSSatish Balay } 945827bd09bSSatish Balay *(pi+1)=temp; 946827bd09bSSatish Balay *(pi2+1)=temp2; 947827bd09bSSatish Balay } 948827bd09bSSatish Balay 949827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 950827bd09bSSatish Balay if (top_s==bottom_s) return; 951827bd09bSSatish Balay 952827bd09bSSatish Balay /* else pop another list from the stack */ 953827bd09bSSatish Balay ar2 = *(--top_a); 954827bd09bSSatish Balay ar = *(--top_a); 955827bd09bSSatish Balay size = *(--top_s); 956827bd09bSSatish Balay } 957827bd09bSSatish Balay } 958827bd09bSSatish Balay } 959827bd09bSSatish Balay 960827bd09bSSatish Balay 961827bd09bSSatish Balay 962827bd09bSSatish Balay /****************************************************************************** 963827bd09bSSatish Balay Function: ivec_sort_companion_hack(). 964827bd09bSSatish Balay 965827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 966827bd09bSSatish Balay Output: sorted list (in ascending order). 967827bd09bSSatish Balay Return: none. 968827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 969827bd09bSSatish Balay ******************************************************************************/ 970827bd09bSSatish Balay void 971827bd09bSSatish Balay ivec_sort_companion_hack(register int *ar, register int **ar2, 972827bd09bSSatish Balay register int size) 973827bd09bSSatish Balay { 974827bd09bSSatish Balay register int *pi, *pj, temp, *ptr; 975827bd09bSSatish Balay register int **top_a = (int **)offset_stack; 976827bd09bSSatish Balay register int *top_s = size_stack, *bottom_s = size_stack; 977827bd09bSSatish Balay register int **pi2, **pj2; 978827bd09bSSatish Balay register int mid; 979827bd09bSSatish Balay 980827bd09bSSatish Balay 981827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 982827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 983827bd09bSSatish Balay size--; 984827bd09bSSatish Balay 985827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 986827bd09bSSatish Balay for (;;) 987827bd09bSSatish Balay { 988827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 989827bd09bSSatish Balay if (size > SORT_OPT) 990827bd09bSSatish Balay { 991827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 992827bd09bSSatish Balay mid = size>>1; 993827bd09bSSatish Balay pi = ar+1; 994827bd09bSSatish Balay pj = ar+mid; 995827bd09bSSatish Balay pi2 = ar2+1; 996827bd09bSSatish Balay pj2 = ar2+mid; 997827bd09bSSatish Balay 998827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 999827bd09bSSatish Balay SWAP(*pi,*pj) 1000827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1001827bd09bSSatish Balay 1002827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1003827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1004827bd09bSSatish Balay pj = ar+size; 1005827bd09bSSatish Balay pj2 = ar2+size; 1006827bd09bSSatish Balay if (*pi > *pj) 1007827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1008827bd09bSSatish Balay if (*ar > *pj) 1009827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1010827bd09bSSatish Balay else if (*pi > *ar) 1011827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1012827bd09bSSatish Balay 1013827bd09bSSatish Balay /* partition about pivot_value ... */ 1014827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1015827bd09bSSatish Balay for(;;) 1016827bd09bSSatish Balay { 1017827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1018827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1019827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1020827bd09bSSatish Balay 1021827bd09bSSatish Balay /* if we've crossed we're done */ 1022827bd09bSSatish Balay if (pj<pi) break; 1023827bd09bSSatish Balay 1024827bd09bSSatish Balay /* else swap */ 1025827bd09bSSatish Balay SWAP(*pi,*pj) 1026827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1027827bd09bSSatish Balay } 1028827bd09bSSatish Balay 1029827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1030827bd09bSSatish Balay SWAP(*ar,*pj) 1031827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1032827bd09bSSatish Balay 1033827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1034827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1035827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");} 1036827bd09bSSatish Balay 1037827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1038827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 1039827bd09bSSatish Balay { 1040827bd09bSSatish Balay *(top_a++) = pi; 1041827bd09bSSatish Balay *(top_a++) = (int*) pi2; 1042827bd09bSSatish Balay size -= *top_s+2; 1043827bd09bSSatish Balay top_s++; 1044827bd09bSSatish Balay } 1045827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1046827bd09bSSatish Balay else if (size -= *top_s+2) 1047827bd09bSSatish Balay {;} 1048827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1049827bd09bSSatish Balay else 1050827bd09bSSatish Balay { 1051827bd09bSSatish Balay ar2 = (int **) *(--top_a); 1052827bd09bSSatish Balay ar = *(--top_a); 1053827bd09bSSatish Balay size = *(--top_s); 1054827bd09bSSatish Balay } 1055827bd09bSSatish Balay } 1056827bd09bSSatish Balay 1057827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1058827bd09bSSatish Balay else 1059827bd09bSSatish Balay { 1060827bd09bSSatish Balay /* insertion sort for bottom */ 1061827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1062827bd09bSSatish Balay { 1063827bd09bSSatish Balay temp = *pj; 1064827bd09bSSatish Balay ptr = *pj2; 1065827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1066827bd09bSSatish Balay { 1067827bd09bSSatish Balay if (*pi <= temp) break; 1068827bd09bSSatish Balay *(pi+1)=*pi; 1069827bd09bSSatish Balay *(pi2+1)=*pi2; 1070827bd09bSSatish Balay } 1071827bd09bSSatish Balay *(pi+1)=temp; 1072827bd09bSSatish Balay *(pi2+1)=ptr; 1073827bd09bSSatish Balay } 1074827bd09bSSatish Balay 1075827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1076827bd09bSSatish Balay if (top_s==bottom_s) return; 1077827bd09bSSatish Balay 1078827bd09bSSatish Balay /* else pop another list from the stack */ 1079827bd09bSSatish Balay ar2 = (int **)*(--top_a); 1080827bd09bSSatish Balay ar = *(--top_a); 1081827bd09bSSatish Balay size = *(--top_s); 1082827bd09bSSatish Balay } 1083827bd09bSSatish Balay } 1084827bd09bSSatish Balay } 1085827bd09bSSatish Balay 1086827bd09bSSatish Balay 1087827bd09bSSatish Balay 1088827bd09bSSatish Balay /****************************************************************************** 1089827bd09bSSatish Balay Function: SMI_sort(). 1090827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1091827bd09bSSatish Balay Output: sorted list (in ascending order). 1092827bd09bSSatish Balay Return: none. 1093827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1094827bd09bSSatish Balay ******************************************************************************/ 1095827bd09bSSatish Balay void 1096827bd09bSSatish Balay SMI_sort(void *ar1, void *ar2, int size, int type) 1097827bd09bSSatish Balay { 1098827bd09bSSatish Balay if (type == SORT_INTEGER) 1099827bd09bSSatish Balay { 1100827bd09bSSatish Balay if (ar2) 1101827bd09bSSatish Balay {ivec_sort_companion((int*)ar1,(int*)ar2,size);} 1102827bd09bSSatish Balay else 1103827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1104827bd09bSSatish Balay } 1105827bd09bSSatish Balay else if (type == SORT_INT_PTR) 1106827bd09bSSatish Balay { 1107827bd09bSSatish Balay if (ar2) 1108827bd09bSSatish Balay {ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);} 1109827bd09bSSatish Balay else 1110827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1111827bd09bSSatish Balay } 1112827bd09bSSatish Balay 1113827bd09bSSatish Balay else 1114827bd09bSSatish Balay { 1115827bd09bSSatish Balay error_msg_fatal("SMI_sort only does SORT_INTEGER!"); 1116827bd09bSSatish Balay } 1117827bd09bSSatish Balay /* 1118827bd09bSSatish Balay if (type == SORT_REAL) 1119827bd09bSSatish Balay { 1120827bd09bSSatish Balay if (ar2) 1121827bd09bSSatish Balay {rvec_sort_companion(ar2,ar1,size);} 1122827bd09bSSatish Balay else 1123827bd09bSSatish Balay {rvec_sort(ar1,size);} 1124827bd09bSSatish Balay } 1125827bd09bSSatish Balay */ 1126827bd09bSSatish Balay } 1127827bd09bSSatish Balay 1128827bd09bSSatish Balay 1129827bd09bSSatish Balay 1130827bd09bSSatish Balay /**********************************ivec.c************************************** 1131827bd09bSSatish Balay Function ivec_linear_search() 1132827bd09bSSatish Balay 1133827bd09bSSatish Balay Input : 1134827bd09bSSatish Balay Output: 1135827bd09bSSatish Balay Return: 1136827bd09bSSatish Balay Description: 1137827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1138827bd09bSSatish Balay int 1139827bd09bSSatish Balay ivec_linear_search(register int item, register int *list, register int n) 1140827bd09bSSatish Balay { 1141827bd09bSSatish Balay register int tmp = n-1; 1142827bd09bSSatish Balay 1143827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 1144827bd09bSSatish Balay return(-1); 1145827bd09bSSatish Balay } 1146827bd09bSSatish Balay 1147827bd09bSSatish Balay 1148827bd09bSSatish Balay 1149827bd09bSSatish Balay /**********************************ivec.c************************************** 1150827bd09bSSatish Balay Function ivec_binary_search() 1151827bd09bSSatish Balay 1152827bd09bSSatish Balay Input : 1153827bd09bSSatish Balay Output: 1154827bd09bSSatish Balay Return: 1155827bd09bSSatish Balay Description: 1156827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1157827bd09bSSatish Balay int 1158827bd09bSSatish Balay ivec_binary_search(register int item, register int *list, register int rh) 1159827bd09bSSatish Balay { 1160827bd09bSSatish Balay register int mid, lh=0; 1161827bd09bSSatish Balay 1162827bd09bSSatish Balay rh--; 1163827bd09bSSatish Balay while (lh<=rh) 1164827bd09bSSatish Balay { 1165827bd09bSSatish Balay mid = (lh+rh)>>1; 1166827bd09bSSatish Balay if (*(list+mid) == item) 1167827bd09bSSatish Balay {return(mid);} 1168827bd09bSSatish Balay if (*(list+mid) > item) 1169827bd09bSSatish Balay {rh = mid-1;} 1170827bd09bSSatish Balay else 1171827bd09bSSatish Balay {lh = mid+1;} 1172827bd09bSSatish Balay } 1173827bd09bSSatish Balay return(-1); 1174827bd09bSSatish Balay } 1175827bd09bSSatish Balay 1176827bd09bSSatish Balay 1177827bd09bSSatish Balay 1178827bd09bSSatish Balay /**********************************ivec.c************************************** 1179827bd09bSSatish Balay Function rvec_dump 1180827bd09bSSatish Balay 1181827bd09bSSatish Balay Input : 1182827bd09bSSatish Balay Output: 1183827bd09bSSatish Balay Return: 1184827bd09bSSatish Balay Description: 1185827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1186827bd09bSSatish Balay void 1187827bd09bSSatish Balay rvec_dump(REAL *v, int n, int tag, int tag2, char * s) 1188827bd09bSSatish Balay { 1189827bd09bSSatish Balay int i; 1190827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 1191827bd09bSSatish Balay for (i=0;i<n;i++) 1192827bd09bSSatish Balay {printf("%f ",v[i]);} 1193827bd09bSSatish Balay printf("\n"); 1194827bd09bSSatish Balay fflush(stdout); 1195827bd09bSSatish Balay } 1196827bd09bSSatish Balay 1197827bd09bSSatish Balay 1198827bd09bSSatish Balay 1199827bd09bSSatish Balay /**********************************ivec.c************************************** 1200827bd09bSSatish Balay Function rvec_lb_ub() 1201827bd09bSSatish Balay 1202827bd09bSSatish Balay Input : 1203827bd09bSSatish Balay Output: 1204827bd09bSSatish Balay Return: 1205827bd09bSSatish Balay Description: 1206827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1207827bd09bSSatish Balay void 1208827bd09bSSatish Balay rvec_lb_ub(register REAL *arg1, register int n, REAL *lb, REAL *ub) 1209827bd09bSSatish Balay { 1210827bd09bSSatish Balay register REAL min = REAL_MAX; 1211827bd09bSSatish Balay register REAL max = -REAL_MAX; 1212827bd09bSSatish Balay 1213827bd09bSSatish Balay while (n--) 1214827bd09bSSatish Balay { 1215827bd09bSSatish Balay min = MIN(min,*arg1); 1216827bd09bSSatish Balay max = MAX(max,*arg1); 1217827bd09bSSatish Balay arg1++; 1218827bd09bSSatish Balay } 1219827bd09bSSatish Balay 1220827bd09bSSatish Balay *lb=min; 1221827bd09bSSatish Balay *ub=max; 1222827bd09bSSatish Balay } 1223827bd09bSSatish Balay 1224827bd09bSSatish Balay 1225827bd09bSSatish Balay 1226827bd09bSSatish Balay /********************************ivec.c************************************** 1227827bd09bSSatish Balay Function rvec_copy() 1228827bd09bSSatish Balay 1229827bd09bSSatish Balay Input : 1230827bd09bSSatish Balay Output: 1231827bd09bSSatish Balay Return: 1232827bd09bSSatish Balay Description: 1233827bd09bSSatish Balay *********************************ivec.c*************************************/ 1234827bd09bSSatish Balay void 1235827bd09bSSatish Balay rvec_copy(register REAL *arg1, register REAL *arg2, register int n) 1236827bd09bSSatish Balay { 1237827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 1238827bd09bSSatish Balay } 1239827bd09bSSatish Balay 1240827bd09bSSatish Balay 1241827bd09bSSatish Balay 1242827bd09bSSatish Balay /********************************ivec.c************************************** 1243827bd09bSSatish Balay Function rvec_zero() 1244827bd09bSSatish Balay 1245827bd09bSSatish Balay Input : 1246827bd09bSSatish Balay Output: 1247827bd09bSSatish Balay Return: 1248827bd09bSSatish Balay Description: 1249827bd09bSSatish Balay *********************************ivec.c*************************************/ 1250827bd09bSSatish Balay void 1251827bd09bSSatish Balay rvec_zero(register REAL *arg1, register int n) 1252827bd09bSSatish Balay { 1253827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 1254827bd09bSSatish Balay } 1255827bd09bSSatish Balay 1256827bd09bSSatish Balay 1257827bd09bSSatish Balay 1258827bd09bSSatish Balay /**********************************ivec.c************************************** 1259827bd09bSSatish Balay Function rvec_one() 1260827bd09bSSatish Balay 1261827bd09bSSatish Balay Input : 1262827bd09bSSatish Balay Output: 1263827bd09bSSatish Balay Return: 1264827bd09bSSatish Balay Description: 1265827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1266827bd09bSSatish Balay void 1267827bd09bSSatish Balay rvec_one(register REAL *arg1, register int n) 1268827bd09bSSatish Balay { 1269827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 1270827bd09bSSatish Balay } 1271827bd09bSSatish Balay 1272827bd09bSSatish Balay 1273827bd09bSSatish Balay 1274827bd09bSSatish Balay /**********************************ivec.c************************************** 1275827bd09bSSatish Balay Function rvec_neg_one() 1276827bd09bSSatish Balay 1277827bd09bSSatish Balay Input : 1278827bd09bSSatish Balay Output: 1279827bd09bSSatish Balay Return: 1280827bd09bSSatish Balay Description: 1281827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1282827bd09bSSatish Balay void 1283827bd09bSSatish Balay rvec_neg_one(register REAL *arg1, register int n) 1284827bd09bSSatish Balay { 1285827bd09bSSatish Balay while (n--) {*arg1++ = -1.0;} 1286827bd09bSSatish Balay } 1287827bd09bSSatish Balay 1288827bd09bSSatish Balay 1289827bd09bSSatish Balay 1290827bd09bSSatish Balay /**********************************ivec.c************************************** 1291827bd09bSSatish Balay Function rvec_set() 1292827bd09bSSatish Balay 1293827bd09bSSatish Balay Input : 1294827bd09bSSatish Balay Output: 1295827bd09bSSatish Balay Return: 1296827bd09bSSatish Balay Description: 1297827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1298827bd09bSSatish Balay void 1299827bd09bSSatish Balay rvec_set(register REAL *arg1, register REAL arg2, register int n) 1300827bd09bSSatish Balay { 1301827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 1302827bd09bSSatish Balay } 1303827bd09bSSatish Balay 1304827bd09bSSatish Balay 1305827bd09bSSatish Balay 1306827bd09bSSatish Balay /**********************************ivec.c************************************** 1307827bd09bSSatish Balay Function rvec_scale() 1308827bd09bSSatish Balay 1309827bd09bSSatish Balay Input : 1310827bd09bSSatish Balay Output: 1311827bd09bSSatish Balay Return: 1312827bd09bSSatish Balay Description: 1313827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1314827bd09bSSatish Balay void 1315827bd09bSSatish Balay rvec_scale(register REAL *arg1, register REAL arg2, register int n) 1316827bd09bSSatish Balay { 1317827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 1318827bd09bSSatish Balay } 1319827bd09bSSatish Balay 1320827bd09bSSatish Balay 1321827bd09bSSatish Balay 1322827bd09bSSatish Balay /********************************ivec.c************************************** 1323827bd09bSSatish Balay Function rvec_add() 1324827bd09bSSatish Balay 1325827bd09bSSatish Balay Input : 1326827bd09bSSatish Balay Output: 1327827bd09bSSatish Balay Return: 1328827bd09bSSatish Balay Description: 1329827bd09bSSatish Balay *********************************ivec.c*************************************/ 1330827bd09bSSatish Balay void 1331827bd09bSSatish Balay rvec_add(register REAL *arg1, register REAL *arg2, register int n) 1332827bd09bSSatish Balay { 1333827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 1334827bd09bSSatish Balay } 1335827bd09bSSatish Balay 1336827bd09bSSatish Balay 1337827bd09bSSatish Balay 1338827bd09bSSatish Balay /********************************ivec.c************************************** 1339827bd09bSSatish Balay Function rvec_dot() 1340827bd09bSSatish Balay 1341827bd09bSSatish Balay Input : 1342827bd09bSSatish Balay Output: 1343827bd09bSSatish Balay Return: 1344827bd09bSSatish Balay Description: 1345827bd09bSSatish Balay *********************************ivec.c*************************************/ 1346827bd09bSSatish Balay REAL 1347827bd09bSSatish Balay rvec_dot(register REAL *arg1, register REAL *arg2, register int n) 1348827bd09bSSatish Balay { 1349827bd09bSSatish Balay REAL dot=0.0; 1350827bd09bSSatish Balay 1351827bd09bSSatish Balay while (n--) {dot+= *arg1++ * *arg2++;} 1352827bd09bSSatish Balay 1353827bd09bSSatish Balay return(dot); 1354827bd09bSSatish Balay } 1355827bd09bSSatish Balay 1356827bd09bSSatish Balay 1357827bd09bSSatish Balay 1358827bd09bSSatish Balay /********************************ivec.c************************************** 1359827bd09bSSatish Balay Function rvec_axpy() 1360827bd09bSSatish Balay 1361827bd09bSSatish Balay Input : 1362827bd09bSSatish Balay Output: 1363827bd09bSSatish Balay Return: 1364827bd09bSSatish Balay Description: 1365827bd09bSSatish Balay *********************************ivec.c*************************************/ 1366827bd09bSSatish Balay void 1367827bd09bSSatish Balay rvec_axpy(register REAL *arg1, register REAL *arg2, register REAL scale, 1368827bd09bSSatish Balay register int n) 1369827bd09bSSatish Balay { 1370827bd09bSSatish Balay while (n--) {*arg1++ += scale * *arg2++;} 1371827bd09bSSatish Balay } 1372827bd09bSSatish Balay 1373827bd09bSSatish Balay 1374827bd09bSSatish Balay /********************************ivec.c************************************** 1375827bd09bSSatish Balay Function rvec_mult() 1376827bd09bSSatish Balay 1377827bd09bSSatish Balay Input : 1378827bd09bSSatish Balay Output: 1379827bd09bSSatish Balay Return: 1380827bd09bSSatish Balay Description: 1381827bd09bSSatish Balay *********************************ivec.c*************************************/ 1382827bd09bSSatish Balay void 1383827bd09bSSatish Balay rvec_mult(register REAL *arg1, register REAL *arg2, register int n) 1384827bd09bSSatish Balay { 1385827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 1386827bd09bSSatish Balay } 1387827bd09bSSatish Balay 1388827bd09bSSatish Balay 1389827bd09bSSatish Balay 1390827bd09bSSatish Balay /********************************ivec.c************************************** 1391827bd09bSSatish Balay Function rvec_max() 1392827bd09bSSatish Balay 1393827bd09bSSatish Balay Input : 1394827bd09bSSatish Balay Output: 1395827bd09bSSatish Balay Return: 1396827bd09bSSatish Balay Description: 1397827bd09bSSatish Balay *********************************ivec.c*************************************/ 1398827bd09bSSatish Balay void 1399827bd09bSSatish Balay rvec_max(register REAL *arg1, register REAL *arg2, register int n) 1400827bd09bSSatish Balay { 1401827bd09bSSatish Balay while (n--) {*arg1 = MAX(*arg1,*arg2); arg1++; arg2++;} 1402827bd09bSSatish Balay } 1403827bd09bSSatish Balay 1404827bd09bSSatish Balay 1405827bd09bSSatish Balay 1406827bd09bSSatish Balay /********************************ivec.c************************************** 1407827bd09bSSatish Balay Function rvec_max_abs() 1408827bd09bSSatish Balay 1409827bd09bSSatish Balay Input : 1410827bd09bSSatish Balay Output: 1411827bd09bSSatish Balay Return: 1412827bd09bSSatish Balay Description: 1413827bd09bSSatish Balay *********************************ivec.c*************************************/ 1414827bd09bSSatish Balay void 1415827bd09bSSatish Balay rvec_max_abs(register REAL *arg1, register REAL *arg2, register int n) 1416827bd09bSSatish Balay { 1417827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 1418827bd09bSSatish Balay } 1419827bd09bSSatish Balay 1420827bd09bSSatish Balay 1421827bd09bSSatish Balay 1422827bd09bSSatish Balay /********************************ivec.c************************************** 1423827bd09bSSatish Balay Function rvec_min() 1424827bd09bSSatish Balay 1425827bd09bSSatish Balay Input : 1426827bd09bSSatish Balay Output: 1427827bd09bSSatish Balay Return: 1428827bd09bSSatish Balay Description: 1429827bd09bSSatish Balay *********************************ivec.c*************************************/ 1430827bd09bSSatish Balay void 1431827bd09bSSatish Balay rvec_min(register REAL *arg1, register REAL *arg2, register int n) 1432827bd09bSSatish Balay { 1433827bd09bSSatish Balay while (n--) {*arg1 = MIN(*arg1,*arg2); arg1++; arg2++;} 1434827bd09bSSatish Balay } 1435827bd09bSSatish Balay 1436827bd09bSSatish Balay 1437827bd09bSSatish Balay 1438827bd09bSSatish Balay /********************************ivec.c************************************** 1439827bd09bSSatish Balay Function rvec_min_abs() 1440827bd09bSSatish Balay 1441827bd09bSSatish Balay Input : 1442827bd09bSSatish Balay Output: 1443827bd09bSSatish Balay Return: 1444827bd09bSSatish Balay Description: 1445827bd09bSSatish Balay *********************************ivec.c*************************************/ 1446827bd09bSSatish Balay void 1447827bd09bSSatish Balay rvec_min_abs(register REAL *arg1, register REAL *arg2, register int n) 1448827bd09bSSatish Balay { 1449827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 1450827bd09bSSatish Balay } 1451827bd09bSSatish Balay 1452827bd09bSSatish Balay 1453827bd09bSSatish Balay 1454827bd09bSSatish Balay /********************************ivec.c************************************** 1455827bd09bSSatish Balay Function rvec_exists() 1456827bd09bSSatish Balay 1457827bd09bSSatish Balay Input : 1458827bd09bSSatish Balay Output: 1459827bd09bSSatish Balay Return: 1460827bd09bSSatish Balay Description: 1461827bd09bSSatish Balay *********************************ivec.c*************************************/ 1462827bd09bSSatish Balay void 1463827bd09bSSatish Balay rvec_exists(register REAL *arg1, register REAL *arg2, register int n) 1464827bd09bSSatish Balay { 1465827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 1466827bd09bSSatish Balay } 1467827bd09bSSatish Balay 1468827bd09bSSatish Balay 1469827bd09bSSatish Balay 1470827bd09bSSatish Balay /**********************************ivec.c************************************** 1471827bd09bSSatish Balay Function rvec_non_uniform() 1472827bd09bSSatish Balay 1473827bd09bSSatish Balay Input : 1474827bd09bSSatish Balay Output: 1475827bd09bSSatish Balay Return: 1476827bd09bSSatish Balay Description: 1477827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1478827bd09bSSatish Balay void 1479827bd09bSSatish Balay rvec_non_uniform(REAL *arg1, REAL *arg2, register int n, register int *arg3) 1480827bd09bSSatish Balay { 1481827bd09bSSatish Balay register int i, j, type; 1482827bd09bSSatish Balay 1483827bd09bSSatish Balay 1484827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 1485827bd09bSSatish Balay for (i=0;i<n;) 1486827bd09bSSatish Balay { 1487827bd09bSSatish Balay /* clump 'em for now */ 1488827bd09bSSatish Balay j=i+1; 1489827bd09bSSatish Balay type = arg3[i]; 1490827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 1491827bd09bSSatish Balay {j++;} 1492827bd09bSSatish Balay 1493827bd09bSSatish Balay /* how many together */ 1494827bd09bSSatish Balay j -= i; 1495827bd09bSSatish Balay 1496827bd09bSSatish Balay /* call appropriate ivec function */ 1497827bd09bSSatish Balay if (type == GL_MAX) 1498827bd09bSSatish Balay {rvec_max(arg1,arg2,j);} 1499827bd09bSSatish Balay else if (type == GL_MIN) 1500827bd09bSSatish Balay {rvec_min(arg1,arg2,j);} 1501827bd09bSSatish Balay else if (type == GL_MULT) 1502827bd09bSSatish Balay {rvec_mult(arg1,arg2,j);} 1503827bd09bSSatish Balay else if (type == GL_ADD) 1504827bd09bSSatish Balay {rvec_add(arg1,arg2,j);} 1505827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1506827bd09bSSatish Balay {rvec_max_abs(arg1,arg2,j);} 1507827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1508827bd09bSSatish Balay {rvec_min_abs(arg1,arg2,j);} 1509827bd09bSSatish Balay else if (type == GL_EXISTS) 1510827bd09bSSatish Balay {rvec_exists(arg1,arg2,j);} 1511827bd09bSSatish Balay else 1512827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");} 1513827bd09bSSatish Balay 1514827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 1515827bd09bSSatish Balay } 1516827bd09bSSatish Balay } 1517827bd09bSSatish Balay 1518827bd09bSSatish Balay 1519827bd09bSSatish Balay 1520827bd09bSSatish Balay /**********************************ivec.c************************************** 1521827bd09bSSatish Balay Function rvec_fct_addr() 1522827bd09bSSatish Balay 1523827bd09bSSatish Balay Input : 1524827bd09bSSatish Balay Output: 1525827bd09bSSatish Balay Return: 1526827bd09bSSatish Balay Description: 1527827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1528827bd09bSSatish Balay vfp rvec_fct_addr(register int type) 1529827bd09bSSatish Balay { 1530827bd09bSSatish Balay if (type == NON_UNIFORM) 1531827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_non_uniform);} 1532827bd09bSSatish Balay else if (type == GL_MAX) 1533827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_max);} 1534827bd09bSSatish Balay else if (type == GL_MIN) 1535827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_min);} 1536827bd09bSSatish Balay else if (type == GL_MULT) 1537827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_mult);} 1538827bd09bSSatish Balay else if (type == GL_ADD) 1539827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_add);} 1540827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1541827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_max_abs);} 1542827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1543827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_min_abs);} 1544827bd09bSSatish Balay else if (type == GL_EXISTS) 1545827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_exists);} 1546827bd09bSSatish Balay 1547827bd09bSSatish Balay /* catch all ... not good if we get here */ 1548827bd09bSSatish Balay return(NULL); 1549827bd09bSSatish Balay } 1550827bd09bSSatish Balay 1551827bd09bSSatish Balay 1552827bd09bSSatish Balay /****************************************************************************** 1553827bd09bSSatish Balay Function: my_sort(). 1554827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1555827bd09bSSatish Balay Output: sorted list (in ascending order). 1556827bd09bSSatish Balay Return: none. 1557827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1558827bd09bSSatish Balay ******************************************************************************/ 1559827bd09bSSatish Balay void 1560827bd09bSSatish Balay rvec_sort(register REAL *ar, register int Size) 1561827bd09bSSatish Balay { 1562827bd09bSSatish Balay register REAL *pi, *pj, temp; 1563827bd09bSSatish Balay register REAL **top_a = (REAL **)offset_stack; 1564827bd09bSSatish Balay register PTRINT *top_s = psize_stack, *bottom_s = psize_stack; 1565827bd09bSSatish Balay register PTRINT size = (PTRINT) Size; 1566827bd09bSSatish Balay 1567827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1568827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1569827bd09bSSatish Balay size--; 1570827bd09bSSatish Balay 1571827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1572827bd09bSSatish Balay for (;;) 1573827bd09bSSatish Balay { 1574827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1575827bd09bSSatish Balay if (size > SORT_OPT) 1576827bd09bSSatish Balay { 1577827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1578827bd09bSSatish Balay pi = ar+1; 1579827bd09bSSatish Balay pj = ar+size; 1580827bd09bSSatish Balay 1581827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1582827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 1583827bd09bSSatish Balay 1584827bd09bSSatish Balay pj = ar+size; 1585827bd09bSSatish Balay 1586827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1587827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1588827bd09bSSatish Balay if (*pi > *pj) 1589827bd09bSSatish Balay {SWAP(*pi,*pj)} 1590827bd09bSSatish Balay if (*ar > *pj) 1591827bd09bSSatish Balay {SWAP(*ar,*pj)} 1592827bd09bSSatish Balay else if (*pi > *ar) 1593827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 1594827bd09bSSatish Balay 1595827bd09bSSatish Balay /* partition about pivot_value ... */ 1596827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1597827bd09bSSatish Balay for(;;) 1598827bd09bSSatish Balay { 1599827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1600827bd09bSSatish Balay do pi++; while (*pi<*ar); 1601827bd09bSSatish Balay do pj--; while (*pj>*ar); 1602827bd09bSSatish Balay 1603827bd09bSSatish Balay /* if we've crossed we're done */ 1604827bd09bSSatish Balay if (pj<pi) break; 1605827bd09bSSatish Balay 1606827bd09bSSatish Balay /* else swap */ 1607827bd09bSSatish Balay SWAP(*pi,*pj) 1608827bd09bSSatish Balay } 1609827bd09bSSatish Balay 1610827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1611827bd09bSSatish Balay SWAP(*ar,*pj) 1612827bd09bSSatish Balay 1613827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1614827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1615827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1616827bd09bSSatish Balay 1617827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1618827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1619827bd09bSSatish Balay { 1620827bd09bSSatish Balay *(top_a++) = pi; 1621827bd09bSSatish Balay size -= *top_s+2; 1622827bd09bSSatish Balay top_s++; 1623827bd09bSSatish Balay } 1624827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1625827bd09bSSatish Balay else if (size -= *top_s+2) 1626827bd09bSSatish Balay {;} 1627827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1628827bd09bSSatish Balay else 1629827bd09bSSatish Balay { 1630827bd09bSSatish Balay ar = *(--top_a); 1631827bd09bSSatish Balay size = *(--top_s); 1632827bd09bSSatish Balay } 1633827bd09bSSatish Balay } 1634827bd09bSSatish Balay 1635827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1636827bd09bSSatish Balay else 1637827bd09bSSatish Balay { 1638827bd09bSSatish Balay /* insertion sort for bottom */ 1639827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 1640827bd09bSSatish Balay { 1641827bd09bSSatish Balay temp = *pj; 1642827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 1643827bd09bSSatish Balay { 1644827bd09bSSatish Balay if (*pi <= temp) break; 1645827bd09bSSatish Balay *(pi+1)=*pi; 1646827bd09bSSatish Balay } 1647827bd09bSSatish Balay *(pi+1)=temp; 1648827bd09bSSatish Balay } 1649827bd09bSSatish Balay 1650827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1651827bd09bSSatish Balay if (top_s==bottom_s) return; 1652827bd09bSSatish Balay 1653827bd09bSSatish Balay /* else pop another list from the stack */ 1654827bd09bSSatish Balay ar = *(--top_a); 1655827bd09bSSatish Balay size = *(--top_s); 1656827bd09bSSatish Balay } 1657827bd09bSSatish Balay } 1658827bd09bSSatish Balay } 1659827bd09bSSatish Balay 1660827bd09bSSatish Balay 1661827bd09bSSatish Balay 1662827bd09bSSatish Balay /****************************************************************************** 1663827bd09bSSatish Balay Function: my_sort(). 1664827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1665827bd09bSSatish Balay Output: sorted list (in ascending order). 1666827bd09bSSatish Balay Return: none. 1667827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1668827bd09bSSatish Balay ******************************************************************************/ 1669827bd09bSSatish Balay void 1670827bd09bSSatish Balay rvec_sort_companion(register REAL *ar, register int *ar2, register int Size) 1671827bd09bSSatish Balay { 1672827bd09bSSatish Balay register REAL *pi, *pj, temp; 1673827bd09bSSatish Balay register REAL **top_a = (REAL **)offset_stack; 1674827bd09bSSatish Balay register PTRINT *top_s = psize_stack, *bottom_s = psize_stack; 1675827bd09bSSatish Balay register PTRINT size = (PTRINT) Size; 1676827bd09bSSatish Balay 1677827bd09bSSatish Balay register int *pi2, *pj2; 1678827bd09bSSatish Balay register int ptr; 1679827bd09bSSatish Balay register PTRINT mid; 1680827bd09bSSatish Balay 1681827bd09bSSatish Balay 1682827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1683827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1684827bd09bSSatish Balay size--; 1685827bd09bSSatish Balay 1686827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1687827bd09bSSatish Balay for (;;) 1688827bd09bSSatish Balay { 1689827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1690827bd09bSSatish Balay if (size > SORT_OPT) 1691827bd09bSSatish Balay { 1692827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1693827bd09bSSatish Balay mid = size>>1; 1694827bd09bSSatish Balay pi = ar+1; 1695827bd09bSSatish Balay pj = ar+mid; 1696827bd09bSSatish Balay pi2 = ar2+1; 1697827bd09bSSatish Balay pj2 = ar2+mid; 1698827bd09bSSatish Balay 1699827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1700827bd09bSSatish Balay SWAP(*pi,*pj) 1701827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1702827bd09bSSatish Balay 1703827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1704827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1705827bd09bSSatish Balay pj = ar+size; 1706827bd09bSSatish Balay pj2 = ar2+size; 1707827bd09bSSatish Balay if (*pi > *pj) 1708827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1709827bd09bSSatish Balay if (*ar > *pj) 1710827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1711827bd09bSSatish Balay else if (*pi > *ar) 1712827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1713827bd09bSSatish Balay 1714827bd09bSSatish Balay /* partition about pivot_value ... */ 1715827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1716827bd09bSSatish Balay for(;;) 1717827bd09bSSatish Balay { 1718827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1719827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1720827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1721827bd09bSSatish Balay 1722827bd09bSSatish Balay /* if we've crossed we're done */ 1723827bd09bSSatish Balay if (pj<pi) break; 1724827bd09bSSatish Balay 1725827bd09bSSatish Balay /* else swap */ 1726827bd09bSSatish Balay SWAP(*pi,*pj) 1727827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1728827bd09bSSatish Balay } 1729827bd09bSSatish Balay 1730827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1731827bd09bSSatish Balay SWAP(*ar,*pj) 1732827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1733827bd09bSSatish Balay 1734827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1735827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1736827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1737827bd09bSSatish Balay 1738827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1739827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1740827bd09bSSatish Balay { 1741827bd09bSSatish Balay *(top_a++) = pi; 1742827bd09bSSatish Balay *(top_a++) = (REAL *) pi2; 1743827bd09bSSatish Balay size -= *top_s+2; 1744827bd09bSSatish Balay top_s++; 1745827bd09bSSatish Balay } 1746827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1747827bd09bSSatish Balay else if (size -= *top_s+2) 1748827bd09bSSatish Balay {;} 1749827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1750827bd09bSSatish Balay else 1751827bd09bSSatish Balay { 1752827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1753827bd09bSSatish Balay ar = *(--top_a); 1754827bd09bSSatish Balay size = *(--top_s); 1755827bd09bSSatish Balay } 1756827bd09bSSatish Balay } 1757827bd09bSSatish Balay 1758827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1759827bd09bSSatish Balay else 1760827bd09bSSatish Balay { 1761827bd09bSSatish Balay /* insertion sort for bottom */ 1762827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1763827bd09bSSatish Balay { 1764827bd09bSSatish Balay temp = *pj; 1765827bd09bSSatish Balay ptr = *pj2; 1766827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1767827bd09bSSatish Balay { 1768827bd09bSSatish Balay if (*pi <= temp) break; 1769827bd09bSSatish Balay *(pi+1)=*pi; 1770827bd09bSSatish Balay *(pi2+1)=*pi2; 1771827bd09bSSatish Balay } 1772827bd09bSSatish Balay *(pi+1)=temp; 1773827bd09bSSatish Balay *(pi2+1)=ptr; 1774827bd09bSSatish Balay } 1775827bd09bSSatish Balay 1776827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1777827bd09bSSatish Balay if (top_s==bottom_s) return; 1778827bd09bSSatish Balay 1779827bd09bSSatish Balay /* else pop another list from the stack */ 1780827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1781827bd09bSSatish Balay ar = *(--top_a); 1782827bd09bSSatish Balay size = *(--top_s); 1783827bd09bSSatish Balay } 1784827bd09bSSatish Balay } 1785827bd09bSSatish Balay } 1786827bd09bSSatish Balay 1787827bd09bSSatish Balay 1788827bd09bSSatish Balay 1789827bd09bSSatish Balay 1790827bd09bSSatish Balay 1791827bd09bSSatish Balay /**********************************ivec.c************************************** 1792827bd09bSSatish Balay Function ivec_binary_search() 1793827bd09bSSatish Balay 1794827bd09bSSatish Balay Input : 1795827bd09bSSatish Balay Output: 1796827bd09bSSatish Balay Return: 1797827bd09bSSatish Balay Description: 1798827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1799827bd09bSSatish Balay int 1800827bd09bSSatish Balay rvec_binary_search(register REAL item, register REAL *list, register int rh) 1801827bd09bSSatish Balay { 1802827bd09bSSatish Balay register int mid, lh=0; 1803827bd09bSSatish Balay 1804827bd09bSSatish Balay rh--; 1805827bd09bSSatish Balay while (lh<=rh) 1806827bd09bSSatish Balay { 1807827bd09bSSatish Balay mid = (lh+rh)>>1; 1808827bd09bSSatish Balay if (*(list+mid) == item) 1809827bd09bSSatish Balay {return(mid);} 1810827bd09bSSatish Balay if (*(list+mid) > item) 1811827bd09bSSatish Balay {rh = mid-1;} 1812827bd09bSSatish Balay else 1813827bd09bSSatish Balay {lh = mid+1;} 1814827bd09bSSatish Balay } 1815827bd09bSSatish Balay return(-1); 1816827bd09bSSatish Balay } 1817827bd09bSSatish Balay 1818827bd09bSSatish Balay 1819827bd09bSSatish Balay 1820827bd09bSSatish Balay 1821827bd09bSSatish Balay 1822