#include <stdlib.h>
#include <assert.h>
#include "pvm3.h"
#include "pgpvm2.h"

#define TAG_UNSORTED                     1
#define TAG_SORTED                       2

int increase(a, b) char *a; char *b;
{ if (*a==*b) return 0;
  if (*a>*b) return 1;
  return -1;
}

void main()
{ char *data;
  int mytid, buffer_id, bytes, typetag, nb, myrank, tid;

  mytid=pvm_mytid();

  pg_tids("y");

  pg_beglab(4);

  buffer_id = pvm_recv(-1, -1);
  pvm_bufinfo(buffer_id, &bytes, &typetag, &tid);
  pvm_upkint(&myrank, 1, 1);
  pvm_upkint(&nb, 1, 1);

  data=(char *)malloc(sizeof(char)*nb);
  assert(data!=NULL);

  pvm_upkbyte(data, nb, 1);

  pg_endlab(4);

  pg_beglab(5);

  qsort((void *)data, nb, sizeof(char),
        (int (*)(const void *, const void *))increase);

  pg_endlab(5);

  pvm_initsend(PvmDataRaw);
  pvm_pkint(&myrank, 1, 1);
  pvm_pkbyte(data, nb, 1);
  pvm_send(tid, TAG_SORTED);

  free(data);

  pvm_exit();
  exit(0);
}
