Import from CVS into darcs.
[noose.git] / rl.c
bloba51fa221ec147860a1fd01c355263181dbfd832c
1 /*
2 * rl.c
3 * Created: Sun Feb 25 22:30:43 2001 by tek@wiw.org
4 * Revised: Sun Feb 25 22:30:43 2001 (pending)
5 * Copyright 2001 Julian E. C. Squires (tek@wiw.org)
6 * This program comes with ABSOLUTELY NO WARRANTY.
7 * $Id: rl.c,v 1.1.1.1 2001/02/26 03:19:54 tek Exp $
8 *
9 */
11 #include <stdio.h>
12 #include <stdlib.h>
14 #include "noose.h"
16 rangelist_t *rl_new(int begin, int end, rangelist_t *next);
17 void rl_delete(rangelist_t *rl);
18 void rl_exclude(rangelist_t **rl, int begin, int end);
20 rangelist_t *rl_new(int begin, int end, rangelist_t *next)
22 rangelist_t *p;
24 p = malloc(sizeof(rangelist_t));
25 if(p == NULL) {
26 fprintf(stderr, "%s: Out of memory.\n", PROGNAME);
27 return NULL;
29 p->begin = begin;
30 p->end = end;
31 p->next = next;
32 return p;
35 void rl_delete(rangelist_t *rl)
37 rangelist_t *dead;
39 while(rl != NULL) {
40 dead = rl;
41 rl = rl->next;
42 free(dead);
44 return;
47 void rl_exclude(rangelist_t **rlp, int begin, int end)
49 rangelist_t *rl;
51 rl = *rlp;
52 while(rl != NULL) {
53 if(begin <= rl->begin && end >= rl->end) { /* no parts left */
54 *rlp = rl->next;
55 rl = rl->next;
56 rl_delete(rl);
57 continue;
58 } else if(begin <= rl->begin && end >= rl->begin && end < rl->end) {
59 /* shrink right */
60 rl->begin = end+1;
61 } else if(begin >= rl->begin && begin < rl->end && end >= rl->end) {
62 /* shrink left */
63 rl->end = begin-1;
64 } else if(begin > rl->begin && end < rl->end) {
65 /* two parts */
66 rl->next = rl_new(end+1, rl->end, rl->next);
67 rl->end = begin-1;
70 rl = rl->next;
74 /* EOF rl.c */