// Copyright 2015 The Emscripten Authors.  All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License.  Both these licenses can be
// found in the LICENSE file.

#include <stdio.h>
#include <emscripten.h>
#include <assert.h>

void print1(const char *c, int x) {
  EM_ASM({ out([$0, $1]) }, c, x);
}

void print2(const char *c, int x, int y) {
  EM_ASM({ out([$0, $1, $2]) }, c, x, y);
}

typedef void (*func_v)();
typedef void (*func_f)(float);
typedef void (*func_i)(int);
typedef void (*func_ii)(int, int);

void sleeper() {
  emscripten_sleep(100);
}

void sibling(int x, int y) {
  print2("hi %d, %d\n", x, y);
}

void middle();

void recurser() {
  middle();
}

void middle() {
  sleeper();
  sibling(1, 2);
  recurser();
}

void pre(float f) {
  print1("bi, %f\n", f);
  sibling(3, 4);
  volatile func_ii ii = sibling;
  ii(5, 6);
}

void post(int y) {
  print1("tri %d\n", y);
  volatile func_i i = post;
  i(4);
  volatile func_v v = recurser;
  v();
}

void post2(int y) {
  print1("trip %d\n", y);
  volatile func_i i = post;
  i(4);
  recurser();
}


int main() {
  volatile func_f f = pre;
  f(1.5);
  middle();
  volatile func_i i = post;
  i(3);
  volatile func_i i2 = post2;
  i2(3);
}

