/*
   Item9: read from and write to a file
*/

import java.util.*;

public class Item9 extends Item8
{
   // CONVERT AN ITEM INTO A STRING REPRESENTATION

   public String toString() {
      return "Item {\n" + fieldsToString() + "}\n";
   }

   public String fieldsToString() {
      String s = "";

      s += "   id " + id + "\n";
      s += "   nPts " + nPts + "\n";
      s += "   x0 " + x0 + "\n";
      s += "   y0 " + y0 + "\n";
      s += "   nKeys " + nKeys + "\n";
      s += "   nLinked " + nLinked + "\n";
      s += "   text \"" + text + "\"\n";
      s += "   X " + toString(X, nPts) + "\n";
      s += "   Y " + toString(Y, nPts) + "\n";
      s += "   xKey " + toString(xKey, nKeys) + "\n";
      s += "   yKey " + toString(yKey, nKeys) + "\n";
      s += "   ckx " + toString(ckx, nKeys, nLinked) + "\n";
      s += "   cky " + toString(cky, nKeys, nLinked) + "\n";
      s += "   ckc " + toString(ckc, nKeys, nLinked) + "\n";

      s += "   linkedItem { ";
      for (int i = 0 ; i < nLinked ; i++)
         s += linkedItem[i].id + " ";
      s += "}\n";

      return s;
   }

   String toString(int A[], int len) {
      String s = "{ ";
      for (int i = 0 ; i < len ; i++)
         s += A[i] + " ";
      return s + "} ";
   }

   String toString(int A[][], int m, int n) {
      String s = "{ ";
      for (int i = 0 ; i < m ; i++)
         s += toString(A[i], n);
      return s + "} ";
   }

   // CONVERT A STRING REPRESENTAION INTO AN ITEM

   StringTokenizer st;
   String token;
   Item item[];

   public void parse(StringTokenizer st, Item item[]) {
      this.st = st;
      this.item = item;

      getToken(); // "Item"

      for (getToken() ; ! getToken().equals("}") ; ) {
         parseField();
      }
   }

   public void parseField() {
      if      (token.equals("id"        )) id      = parseInt();
      else if (token.equals("nPts"      )) nPts    = parseInt();
      else if (token.equals("x0"        )) x0      = parseInt();
      else if (token.equals("y0"        )) y0      = parseInt();
      else if (token.equals("nKeys"     )) nKeys   = parseInt();
      else if (token.equals("nLinked"   )) nLinked = parseInt();
      else if (token.equals("text"      )) text    = parseStr();
      else if (token.equals("X"         )) parse(X   );
      else if (token.equals("Y"         )) parse(Y   );
      else if (token.equals("xKey"      )) parse(xKey);
      else if (token.equals("yKey"      )) parse(yKey);
      else if (token.equals("ckx"       )) parse(ckx );
      else if (token.equals("cky"       )) parse(cky );
      else if (token.equals("ckc"       )) parse(ckc );
      else if (token.equals("ckc"       )) parse(ckc );
      else if (token.equals("linkedItem")) parse(linkedItem, item);
   }

   String getToken() {
      return token = st.nextToken();
   }

   int parseInt() {
      getToken();
      return intValue();
   }

   int intValue() {
      return (new Integer(token)).intValue();
   }

   String parseStr() {
      String s = getToken();
      while (s.charAt(token.length()-1) != '\"')
         s += getToken();
      return s.substring(1, s.length()-1);
   }

   int parse(int val[]) {
      getToken();
      return parseList(val);
   }

   int parseList(int val[]) {
      int n = 0;
      while ( ! getToken().equals("}") ) {
         val[n++] = intValue(); 
      }
      return n;
   }

   int parse(int val[][]) {
      getToken();
      int m = 0;
      while ( ! getToken().equals("}") )
         parseList(val[m++]);
      return m;
   }

   int parse(Item val[], Item item[]) {
      getToken();
      int n = 0;
      while ( ! getToken().equals("}") )
         val[n++] = item[intValue()];
      return n;
   }
}


