1 // Compile with:
2 //   clang++ --target=wasm32-wasi fraction-norm.cc -o fraction-norm.wasm -g \
3 //     -O0 -fdebug-prefix-map=$PWD=.
4 
5 struct Fraction {
6   long numerator;
7   long denominator;
8 };
9 
abs(long x)10 inline long abs(long x) { return x >= 0 ? x : -x; }
11 
norm(Fraction & n)12 extern "C" void norm(Fraction &n) {
13   long a = abs(n.numerator), b = abs(n.denominator);
14   if (a == 0 || b == 0)
15     return;
16   do {
17     a %= b;
18     if (a == 0)
19       break;
20     b %= a;
21   } while (b > 0);
22   long gcd = a + b;
23   if (n.denominator > 0) {
24     n.numerator /= gcd;
25     n.denominator /= gcd;
26   } else {
27     n.numerator /= -gcd;
28     n.denominator /= -gcd;
29   }
30 }
31 
main()32 int main() {
33   Fraction c = {6, 27};
34   norm(c);
35   return 0;
36 }
37