calc.c (plain text)
// Simple calc

// This sample demonstrate advanced PocketC concepts:
// simulating structures, indirect function calls.
//
// This sample sets up an event-based applet framework, and
// creates a integer calculator using it.
//
// Since malloc() returns an array of ints, and we need a
// more complex structure for our buttons, we create a
// template for the button structure out of globals. Since
// globals reside in memory in the same order that they are
// declared, we can use a block of globals to initialize our
// button list items. This works because memcpy() copies
// not only memory contents, but also memory types.

include "calc_framework.c"

updateDisp(int num) {
  rect(0, 0, 15, 160, 39, 0);
  textattr(6, 1, 0);
  textalign(12);
  text(159, 16, num);
  textattr(0, 1, 0);
}

int total;
int operand;
char operator;

doOp() {
  if (operator=='+') {
    total = total + operand;
  } else if (operator=='-') {
    total = total - operand;
  } else if (operator=='*') {
    total = total * operand;
  } else if (operator=='/') {
    total = total / operand;
  }
  operand = 0;
  operator = '+';
  updateDisp(total);
}


// common code for each button
#define NUM_BEG { operand = operand * 10 +
#define NUM_END ; updateDisp(operand); }

// button handlers
but0() NUM_BEG 0 NUM_END
but1() NUM_BEG 1 NUM_END
but2() NUM_BEG 2 NUM_END
but3() NUM_BEG 3 NUM_END
but4() NUM_BEG 4 NUM_END
but5() NUM_BEG 5 NUM_END
but6() NUM_BEG 6 NUM_END
but7() NUM_BEG 7 NUM_END
but8() NUM_BEG 8 NUM_END
but9() NUM_BEG 9 NUM_END
butC() { operator = '+'; operand = 0; total = 0; updateDisp(0); }
butPlus() { doOp(); operator = '+'; }
butMinus() { doOp(); operator = '-'; }
butMult() { doOp(); operator = '*'; }
butDiv() { doOp(); operator = '/'; }
butEq() { doOp(); }
exitfunc() { exitflag = 1; }

main() {
  // initialize graphics
  graph_on();
  title("Simple Calc");
  // create our buttons
  addButton("7", but7, 30, 40, 55, 65);
  addButton("8", but8, 55, 40, 80, 65);
  addButton("9", but9, 80, 40, 105, 65);
  addButton("/", butDiv, 105, 40, 130, 65);

  addButton("4", but4, 30, 65, 55, 90);
  addButton("5", but5, 55, 65, 80, 90);
  addButton("6", but6, 80, 65, 105, 90);
  addButton("*", butMult, 105, 65, 130, 90);

  addButton("1", but1, 30, 90, 55, 115);
  addButton("2", but2, 55, 90, 80, 115);
  addButton("3", but3, 80, 90, 105, 115);
  addButton("-", butMinus, 105, 90, 130, 115);

  addButton("0", but0, 30, 115, 55, 140);
  addButton("C", butC, 55, 115, 80, 140);
  addButton("=", butEq, 80, 115, 105, 140);
  addButton("+", butPlus, 105, 115, 130, 140);

  addButton("Exit", exitfunc, 30, 145, 130, 159);

  operator='+';
  updateDisp(0);
  // let's go!
  eventLoop();
}