Verified Commit a72cc6a7 authored by Adam Matoušek's avatar Adam Matoušek
Browse files

More demos.

parent c7e2d471
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -32,6 +32,10 @@ $(DEMO_FILES:=.o): %.o: % FORCE
	ls seagolc || $(MAKE) seagolc
	ls seagolc || $(MAKE) seagolc
	./seagolc $*
	./seagolc $*


$(DEMO_FILES:.glum=): %: %.glum.o
	@echo "Linking with libc"
	clang -o $@ $<

FORCE:
FORCE:


# Disable this implicit rule:
# Disable this implicit rule:

demo/arrays.glum

deleted100644 → 0
+0 −10
Original line number Original line Diff line number Diff line
// vim: ft=c

int * array_to_ptr( int n )
{
    int x[ n ];
    x[2] = 5;
    if ( x[ 4 ] )
        return x + 3;
    return x;
}

demo/sorts.glum

0 → 100644
+117 −0
Original line number Original line Diff line number Diff line
// vim: ft=c

/* C library */

int printf( char *, ... );

/* End of C library */

void no_sort( int *, int ) {}
void select_sort( int *, int );
void quick_sort( int *, int );

bool sort_tester( void(*)( int *, int ) sort )
{
    int array[ 20 ];
    array[  0 ] = 80;
    array[  1 ] = 42;
    array[  2 ] = 3;
    array[  3 ] = 19;
    array[  4 ] = 20;
    array[  5 ] = 67;
    array[  6 ] = 8;
    array[  7 ] = 1;
    array[  8 ] = 52;
    array[  9 ] = 3;
    array[ 10 ] = 82;
    array[ 11 ] = 81;
    array[ 12 ] = 80;
    array[ 13 ] = 17;
    array[ 14 ] = 10;
    array[ 15 ] = 65;
    array[ 16 ] = 3;
    array[ 17 ] = 33;
    array[ 18 ] = 8;
    array[ 19 ] = 2;

    sort( array, 20 );

    int i = 0;
    int last = array[ 0 ];
    bool sorted = true;
    while ( i < 20 ) {
        printf( "%d, ", array[ i ] );
        if ( array[ i ] < last )
            sorted = false;
        last = array[ i ];
        ++i;
    }
    if ( sorted )
        printf( "sorted OK\n" );
    else
        printf( "not sorted NOK\n" );
    return sorted;
}

int main()
{
    printf( "Input array:\n" );
    sort_tester( no_sort );
    bool ok = true;
    printf( "Selection sort:\n" );
    ok &= sort_tester( select_sort );
    printf( "Quicksort:\n" );
    ok &= sort_tester( quick_sort );
    return !ok;
}

void select_sort( int * a, int n )
{
    int * end = a + n;
    int * first_unsorted = a;
    int * swap_candidate = a;
    while ( first_unsorted < end ) {
        swap_candidate = first_unsorted;
        int * it = first_unsorted;
        while ( ++it < end ) {
            if ( *it < *swap_candidate )
                swap_candidate = it;
        }
        if ( swap_candidate != first_unsorted ) {
            int tmp = *first_unsorted;
            *first_unsorted = *swap_candidate;
            *swap_candidate = tmp;
        }
        ++first_unsorted;
    }
}

void quick_sort( int * a, int n )
{
    if ( n < 2 )
        return;

    int pivot = a[ n / 2 ];

    int i = 0;
    int j = n - 1;
    do {
        while ( a[ i ] < pivot )
            i++;
        while ( a[ j ] > pivot )
            j--;

        if ( i >= j )
            break;

        int tmp = a[ i ];
        a[ i ] = a[ j ];
        a[ j ] = tmp;

        ++i;
        --j;
    } while ( true );

    quick_sort( a, i );
    quick_sort( a + i, n - i );
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -17,8 +17,8 @@ int factorial_iter( int x ) {
        return -1;
        return -1;
    int product = 1;
    int product = 1;
    while ( x > 0 ) {
    while ( x > 0 ) {
        product = product * x;
        product *= x;
        x -= 1;
        x--;
    }
    }
    return product;
    return product;
}
}