------------------------------------------------------------------------------
MC logo
Sort Using Goto
[^] Semantics
------------------------------------------------------------------------------
[Ch. 1: Overview and History] [Syntax] [Names and Scope] [Types and Type Systems] [Semantics] [Functions] [Memory Management] [Imperitive Programs and Functional Abstraction] [Modular and Class Abstraction] [Functional Programming] [Logic Programming]
[Copy v. Reference Assignment] [Sort Using Goto] [Return Value and Exceptional I/O]
gosort.c
#include <stdio.h>
#include <stdlib.h>

/*
 * This program reads in a series of integers and sorts them using a bubble 
 * sort.  It is written using goto and if() goto instead of sane looping
 * constructs.  
 *
 * Do not try this at home.
 *
 * I hope it is not a mystery why we don't use goto anymore.
 */

#define SIZE 100

main()
{
        int nums[SIZE]; // Numbers.
        int count;      // How many
        int limit;      // Pair scan limit.
        int tmp;        // Exchange tmp.

        // Read in some integers.
        int i = 0;
 reader:
        if(i >= SIZE) goto toobig;
        if(scanf("%d", &nums[i]) != 1) goto read_done;
        i++;
        goto reader;
 read_done:
        count = i;

        // Most of this stuff breaks with size zero.
        if(count <= 0) goto nothing;

        // Sort won't work properly with one value.  And isn't needed.
        if(count <= 1) goto doprint;

        limit = count - 2;

        // Scan for out-of-order pairs.
 pairscan:
        i = 0;

        // See if the pair at [i] and [i+1] is in order, and swap them
        // if not.
 pairswap:
        if(nums[i] <= nums[i+1]) goto keep;
        tmp = nums[i];
        nums[i] = nums[i+1];
        nums[i+1] = tmp;
 keep:
        // Increment pair scan, and repeat the pair swap if needed.
        if(++i <= limit) goto pairswap;

        // Reduce the pair scan limit, and perform the next one
        // if needed.
        if(--limit >= 0) goto pairscan;

 doprint:
        // Print the sorted list.
        i = 0;
 printloop:
        printf("%d ", nums[i]);
        if(++i < count) goto printloop;
        printf("\n");
 nothing:
        exit(0);

 toobig:
        printf("More than %d input values.\n", SIZE);
        exit(1);
}