#!/bin/sh
cat > rev.c <<REV
#include <stdio.h>
#include <stdlib.h>

void swap (char *left, char *right)
{
    char c = *left; *left = *right; *right = c;
}

void rev(char *line)
{
    char *end = line;
    while ((*end != '\r') && (*end != '\n') && (*end != '\0')) end++;
    for (;;) {
      swap(line++, --end);
      if (end - line <= 1) break;
    }
}

int main(int argc, char **argv) {
char line[256];
  for (;;) {
    if (gets(line) == NULL) break;
    rev(line);
    puts(line);
  }
  exit(0);
  return(0);
}
REV
cc -o rev rev.c
cat > findcommon.c <<FC
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
char *s, line[256], lastline[256];

  *lastline = '\0';
  for (;;) {
    if (gets(line) == NULL) break;
    s = strchr(line, '\n'); if (s != NULL) *s = '\0';

    if ((*lastline) && (strncmp(line, lastline, strlen(lastline)) == 0)) {
      printf("%s =< %s\n", line, lastline);
    }
    strcpy(lastline, line);
  }
  return(0);
}
FC
cc -o findcommon findcommon.c
./rev < $1 | sort | ./findcommon | ./rev
