#include <stdio.h>
#include <stdlib.h>

/* Split code into two files to prevent inlining */

/* External versions of swap routines */
void swap(long *p, long *q);
void swap_a(long *xp, long *yp);

long course1 = 15213;
long course2 = 18213;

void call_swap() {
  swap(&course1, &course2);
}

long scount = 0;

/* Swap a[i] and a[j] */
void swap_ele(long a[], long i, long j) {
  swap(&a[i], &a[j]);
}

/* Swap a[i] and a[i+1].  Generate value that must be saved */
long swap_ele_diff(long a[], long i, long j) {
    long diff = a[j] - a[i];
    swap(&a[i], &a[j]);
    return diff;
}

/* Swap a[i] and a[j] */
void swap_ele_l(long a[], long i, long j) {
    long *loc[2];
    long b = i & 0x1;
    loc[b] = &a[i];
    loc[1-b] = &a[j];
    swap(loc[0], loc[1]);
}


/* Swap a[i] and a[j] */
long swap_ele_l_diff(long a[], long i, long j) {
    long *loc[2];
    long b = i & 0x1;
    long diff = a[j] - a[i];
    loc[b] = &a[i];
    loc[1-b] = &a[j];
    swap(loc[0], loc[1]);
    return diff;
}



/* Swap a[i] and a[i+1].  Generate value that must be saved */
long swap_ele_diff2(long a[], long i, long j) {
    long diff = a[j] - a[i];
    swap(&a[i], &a[j]); 
    long ndiff = a[j] - a[i];
    return diff + ndiff;
}

int main() { 
  printf("Initially: course1 = %ld, course2 = %ld\n", course1, course2);
  call_swap();
  printf("Finally: course1 = %ld, course2 = %ld\n", course1, course2);
  return 0;
}
