/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */

/*
  Sizer - computes the size of a .hex file
  Part of the Arduino project - http://www.arduino.cc/

  Copyright (c) 2006 David A. Mellis

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software Foundation,
  Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  
  $Id$
*/

package processing.app.debug;

import processing.app.Base;

import java.io.*;
import java.util.*;

public class Sizer implements MessageConsumer {
  private String buildPath, sketchName;
  private String firstLine;
  private long size;
  private RunnerException exception;

  public Sizer(String buildPath, String sketchName) {
    this.buildPath = buildPath;
    this.sketchName = sketchName;
  }
  
  public long computeSize() throws RunnerException {
    
    String commandSize[];
    String arch = Base.getArch();
    
    if(arch == "msp430") {
      String basePath = Base.getMSP430BasePath();
      commandSize = new String[] {
        basePath + "msp430-size",
        " "
      };
    } 
    else if (arch == "lm4f" || arch == "cc3200") {
      String basePath = Base.getLM4FBasePath();
      commandSize = new String[] {
        basePath + "arm-none-eabi-size",
        " "
      };
    } else if(arch == "c2000") {
    	//TODO: Figure out this command
        String basePath = Base.getC2000BasePath();
        commandSize = new String[] {
          basePath + "c2000-size",
          " "
        };
  	}else {
      String basePath = Base.getAvrBasePath();
      commandSize = new String[] {
        basePath + "avr-size",
        " "
      };
    }
    if(arch == "lm4f" || arch == "cc3200") {
      commandSize[1] = buildPath + File.separator + sketchName + ".elf";    	
    }else {
    	commandSize[1] = buildPath + File.separator + sketchName + ".hex";
    }
    int r = 0;
    try {
      exception = null;
      size = -1;
      firstLine = null;
      Process process = Runtime.getRuntime().exec(commandSize);
      MessageSiphon in = new MessageSiphon(process.getInputStream(), this);
      MessageSiphon err = new MessageSiphon(process.getErrorStream(), this);

      boolean running = true;

      while(running) {
        try {
          if (in.thread != null)
            in.thread.join();
          if (err.thread != null)
            err.thread.join();
          r = process.waitFor();
          running = false;
        } catch (InterruptedException intExc) { }
      }
    } catch (Exception e) {
      // The default Throwable.toString() never returns null, but apparently
      // some sub-class has overridden it to do so, thus we need to check for
      // it.  See: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1166589459
      exception = new RunnerException(
        (e.toString() == null) ? e.getClass().getName() + r : e.toString() + r);
    }
    
    if (exception != null)
      throw exception;
      
    if (size == -1)
      throw new RunnerException(firstLine);
      
    return size;
  }
  
  public void message(String s) {
    if (firstLine == null)
      firstLine = s;
    else {
      String arch = Base.getArch();
      StringTokenizer st = new StringTokenizer(s, " ");
      try {
        if(arch == "lm4f") {
        	size = (new Integer(st.nextToken().trim())).longValue();
        	size += (new Integer(st.nextToken().trim())).longValue();
        } else {
	    	st.nextToken();
	    	st.nextToken();        	
	        st.nextToken();
	        size += (new Integer(st.nextToken().trim())).longValue();
        }
      } catch (NoSuchElementException e) {
        exception = new RunnerException(e.toString());
      } catch (NumberFormatException e) {
        exception = new RunnerException(e.toString());
      }
    }
  }
}

@@ -3776,16 +3776,36 @@
 = %22lm4f%22
+ %7C%7C arch == %22cc3200%22
 ) %7B%0A    

Fix calculate Sketch size for CC3200