summaryrefslogtreecommitdiff
path: root/docs/chapter22/examples/BubbleSort.smp
blob: a491bd82a299fc860a3bd658b2c58d612c64a23c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// -*- mode: java;  -*-

// An implementation of
// https://sampleprograms.io/projects/bubble-sort/
//
// Bubble sort, with reading (parsing) and writing (formatting) the data.


val _exit = { u8[~] msg ->
    sys.io.p(msg);
    sys.libc._exit(1);
};

val usage = { -> _exit("stdin must look like [4, 3, 2, 1]"); };

// Scanner
struct Scan {
    int !x;
    u8[~] buf;
};

// Skip whitespace
val skip = { !Scan s ->
    while( s.buf[s.x] <= ' ' )
        s.x++;
};


// Require specific syntax or usage
val require = { !Scan !s, u8 c ->
    skip(s);
    if( s.buf[s.x++] != c )
        usage();
};

val peek = { !Scan !s, u8 c ->
    skip(s);
    if( s.buf[s.x] != c ) return false;
    s.x++;
    return true;
};

val number = { !Scan s ->
    skip(s);
    i32 n = 0;
    while( '0' <= s.buf[s.x] & s.buf[s.x] <= '9' )
        n = n*10 + (s.buf[s.x++] - '0');
    return n;
};

val sort = { int[] ns, int len ->
    var done = false;
    while( !done ) {
        done = true;
        for( var i = 0; i < len-1; i++ )
            if( ns[i] > ns[i+1] ) {
                int tmp = ns[i];
                ns[i] = ns[i+1];
                ns[i+1] = tmp; // Swap
                done = false;
            }
    }
};

// Read from stdin a line of the form "[ 4, 3, 2, 1]" and print it sorted.
val main = { ->
    !Scan !s = new Scan{ buf = sys.io.stdin(); };
    require(s,'[');
    // Array of parsed results
    int[] !ns = new int[16];
    i32 len = 0;
    // Parse a list of numbers
    if( !peek(s,']') ) {        // Handle the empty list
        // Parse "123, " until a something else
        while( s.x < s.buf# ) {
            int n = number(s);
            ns[len++] = n;
            if( !peek(s,',') )
                break;
        };
        require(s,']');         // Close the list
    }

    // Bubble sort array of integers
    sort(ns,len);

    // Print a list of numbers
    sys.io.p("[ ");
    u8[] !junk = new u8[1];
    for( int i=0; i<len; i++ ) {
        int x = ns[i];
        if( !x ) { sys.io.p("0, "); continue; }

        int ten = 1, log = 0;
        while( ten <= x ) { ten *= 10; log++; }
        ten /= 10;
        for( int i=0; i<log; i++ ) {
            int q = x/ten;
            int r = x - q*ten;
            junk[0] = q+'0';
            sys.io.p(junk);
            x = r;
            ten /= 10;
        }
        sys.io.p(", ");
    }
    sys.io.p("]");
    return 0;
};