home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / www / protocol / news / numberset.java < prev    next >
Text File  |  1995-08-11  |  6KB  |  256 lines

  1. /*
  2.  * @(#)NumberSet.java    1.4 95/03/14 James Gosling, Jonathan Payne
  3.  * 
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation for NON-COMMERCIAL purposes and without fee is hereby
  8.  * granted provided that this copyright notice appears in all copies. Please
  9.  * refer to the file "copyright.html" for further important copyright and
  10.  * licensing information.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
  15.  * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
  16.  * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
  17.  * ITS DERIVATIVES.
  18.  */
  19.  
  20. package net.www.protocol.news;
  21.  
  22. import java.io.*;
  23. import java.util.*;
  24. import net.nntp.*;
  25. import net.smtp.SmtpClient;
  26. import browser.Applet;
  27. import browser.WRWindow;
  28. import browser.DocumentManager;
  29. import net.TelnetInputStream;
  30. import net.UnknownHostException;
  31. import awt.*;
  32.  
  33. class NumberSet {
  34.     int starts[];
  35.     int ends[];
  36.     int nranges = 0;
  37.  
  38.     public NumberSet() {
  39.     }
  40.  
  41.     public String toString() {
  42.     StringBuffer buf = new StringBuffer(10);
  43.  
  44.     buf.append("NumberSet[");
  45.     buf.append(rangesString());
  46.     buf.append("]");
  47.  
  48.     return buf.toString();
  49.     }
  50.  
  51.     public String rangesString() {
  52.     StringBuffer buf = new StringBuffer();
  53.     int i;
  54.  
  55.     for (i = 0; i < nranges; i++) {
  56.         if (starts[i] == ends[i])
  57.         buf.append(starts[i]);
  58.         else {
  59.         buf.append(starts[i]);
  60.         buf.append("-");
  61.         buf.append(ends[i]);
  62.         }
  63.         if (i < nranges - 1)
  64.         buf.append(",");
  65.     }
  66.     return buf.toString();
  67.     }
  68.  
  69.     private int growArray(int array[])[] {
  70.     int narray[] = new int[array.length + 10];
  71.     int i;
  72.  
  73.     for (i = array.length; --i >= 0;)
  74.         narray[i] = array[i];
  75.  
  76.     return narray;
  77.     }
  78.  
  79.     private void makeCanonical() {
  80.     int i;
  81.  
  82.     for (i = nranges - 1; --i >= 0;) {
  83.         if (ends[i] + 1 == starts[i + 1]) {
  84.         ends[i] = ends[i + 1];
  85.         delete(i + 1, 1);
  86.         }
  87.     }
  88.     }
  89.  
  90.     private void insert(int where, int s, int e) {
  91.     int i = where;
  92.  
  93.     if (i < nranges && e == starts[i] - 1) {
  94.         starts[i] = s;
  95.         makeCanonical();
  96.     } else if (i > 0 && s == ends[i - 1] + 1) {
  97.         ends[i - 1] = e;
  98.         makeCanonical();
  99.     } else {
  100.         for (i = nranges; --i >= where;) {
  101.         starts[i + 1] = starts[i];
  102.         ends[i + 1] = ends[i];
  103.         }
  104.         starts[where] = s;
  105.         ends[where] = e;
  106.         nranges += 1;
  107.     }
  108.     }
  109.  
  110.     private void delete(int where, int count) {
  111.     int i;
  112.     int cnt = nranges - (where + count);
  113.  
  114.     for (i = where; --cnt >= 0; i++) {
  115.         starts[i] = starts[i + count];
  116.         ends[i] = ends[i + count];
  117.     }
  118.     nranges -= count;
  119.     }
  120.  
  121.     private int findClosest(int n) {
  122.     int i = nranges - 1;
  123.  
  124.     while (i > 0 && starts[i] > n)
  125.         i -= 1;
  126.     return i;
  127.     }
  128.  
  129.     public void add(int s, int e) {
  130.     int i;
  131.     int startIndex;
  132.     int endIndex;
  133.  
  134.     if (s > e) {
  135. //        System.out.print("Invalid range: [" + s + "-" + e + "]\n");
  136.         e = s;
  137.     }
  138.     if (starts == null) {
  139.         starts = new int[10];
  140.         ends = new int[10];
  141.     } else if (nranges >= starts.length) {
  142.         starts = growArray(starts);
  143.         ends = growArray(ends);
  144.     }
  145.     if (nranges == 0 || e < starts[0])
  146.         insert(0, s, e);
  147.     else if (s > ends[nranges - 1])
  148.         insert(nranges, s, e);
  149.     else {
  150.         startIndex = findClosest(s);
  151.         endIndex = findClosest(e);
  152.         if (startIndex == endIndex && !contains(s))
  153.         insert(startIndex + 1, s, e);
  154.         else {
  155.         starts[startIndex] = Math.min(s, starts[startIndex]);
  156.         ends[startIndex] = Math.max(e, ends[endIndex]);
  157.         if (endIndex != startIndex)
  158.             delete(startIndex + 1, endIndex - startIndex + 1);
  159.         }
  160.     }
  161.     }
  162.  
  163.     public void delete(int item) {
  164.     if (contains(item)) {
  165.         int which = findClosest(item);
  166.         int s, e;
  167.  
  168.         s = starts[which];
  169.         e = ends[which];
  170.         delete(which, 1);
  171.  
  172.         if (s <= item - 1)
  173.         add(s, item - 1);
  174.         if (item + 1 <= e)
  175.         add(item + 1, e);
  176.         makeCanonical();
  177.     }
  178.     }
  179.  
  180.     public void add(String r) {
  181.     int n;
  182.  
  183.     if (r.indexOf('-') != -1) {
  184.         StringTokenizer t = new StringTokenizer(r, "-");
  185.  
  186.         add(Integer.parseInt(t.nextToken()), Integer.parseInt(t.nextToken()));
  187.     } else if ((n = Integer.parseInt(r)) > 0)
  188.         add(n);
  189.     }
  190.  
  191.     public void add(int i) {
  192.     if (!contains(i))
  193.         add(i, i);
  194.     }
  195.  
  196.     public boolean contains(int n) {
  197.     int i;
  198.  
  199.     for (i = nranges; --i >= 0;)
  200.         if (n >= starts[i] && n <= ends[i])
  201.         return true;
  202.     return false;
  203.     }
  204.  
  205.     public int smallest() {
  206.     if (nranges == 0)
  207.         throw new Exception("Empty Number Set");
  208.     return starts[0];
  209.     }
  210.  
  211.     public int largest() {
  212.     if (nranges == 0)
  213.         throw new Exception("Empty Number Set");
  214.     return ends[nranges - 1];
  215.     }
  216.  
  217.     public boolean isEmpty() {
  218.     return nranges == 0;
  219.     }
  220.  
  221.     public NumberSet invert(int min, int max) {
  222.     NumberSet r = new NumberSet();
  223.     int i;
  224.  
  225.     if (nranges == 0) {
  226.         if (min <= max)
  227.         r.add(min, max);
  228.     } else {
  229.         if (min < starts[0])
  230.         r.add(min, starts[0] - 1);
  231.         for (i = 0; i < nranges - 1; i++) {
  232.         if (ends[i] + 1 <= starts[i + 1] - 1)
  233.             r.add(ends[i] + 1, starts[i + 1] - 1);
  234.         }
  235.         if (ends[i] + 1 <= max)
  236.         r.add(ends[i] + 1, max);
  237.     }
  238.     return r;
  239.     }
  240.  
  241.     int size() {
  242.     int cnt;
  243.     int total = 0;
  244.  
  245.     for (cnt = nranges; --cnt >= 0;)
  246.         total += ends[cnt] - starts[cnt] + 1;
  247.     return total;
  248.     }
  249.  
  250.     static public void main(String args[]) {
  251.     NumberSet set = new NumberSet();
  252.  
  253.     set.add("312-312");
  254.     }
  255. }
  256.