int
orderLoad (
Order * const               ordeptr,
FILE * const                stream)
{
  PASTIX_INT               versval;                      /* Version number */
  PASTIX_INT               cblknbr;
  PASTIX_INT               cblknum;
  PASTIX_INT               vertnbr;
  PASTIX_INT               vertnum;
  PASTIX_INT               vertnnd;
  PASTIX_INT *             permtax;
  PASTIX_INT *             peritax;
  int               i;

  if ((intLoad (stream, &versval) +
       intLoad (stream, &cblknbr) +
       intLoad (stream, &vertnbr) != 3) ||
      (versval != 0)                    ||
      (cblknbr > vertnbr)) {
    errorPrint ("orderLoad: bad input (1)");
    return     (1);
  }

  if (((ordeptr->rangtab = (PASTIX_INT *) memAlloc ((cblknbr + 1) * sizeof (PASTIX_INT))) == NULL) ||
      ((ordeptr->permtab = (PASTIX_INT *) memAlloc (vertnbr       * sizeof (PASTIX_INT))) == NULL) ||
      ((ordeptr->peritab = (PASTIX_INT *) memAlloc (vertnbr       * sizeof (PASTIX_INT))) == NULL)) {
    errorPrint ("orderLoad: out of memory");
    orderExit  (ordeptr);
    orderInit  (ordeptr);
    return     (1);
  }
  ordeptr->cblknbr = cblknbr;

  for (cblknum = 0, i = 1; (i == 1) && (cblknum <= cblknbr); cblknum ++) /* Read column-block data */
    i = intLoad (stream, &ordeptr->rangtab[cblknum]);

  for (vertnum = 0; (i == 1) && (vertnum < vertnbr); vertnum ++) /* Read direct permutation */
    i = intLoad (stream, &ordeptr->permtab[vertnum]);

  if (i != 1) {
    errorPrint ("orderLoad: bad input (2)");
    orderExit  (ordeptr);
    orderInit  (ordeptr);
    return     (1);
  }

  permtax = ordeptr->permtab - ordeptr->rangtab[0];
  peritax = ordeptr->peritab - ordeptr->rangtab[0];
  for (vertnum = ordeptr->rangtab[0], vertnnd = vertnum + vertnbr; /* Build inverse permutation */
       vertnum < vertnnd; vertnum ++)
    peritax[permtax[vertnum]] = vertnum;

  return (0);
}
int
SCOTCH_graphOrderInit (
const SCOTCH_Graph * const  grafptr,              /*+ Graph to order                     +*/
SCOTCH_Ordering * const     ordeptr,              /*+ Ordering structure to initialize   +*/
SCOTCH_Num * const          permtab,              /*+ Direct permutation array           +*/
SCOTCH_Num * const          peritab,              /*+ Inverse permutation array          +*/
SCOTCH_Num * const          cblkptr,              /*+ Pointer to number of column blocks +*/
SCOTCH_Num * const          rangtab,              /*+ Column block range array           +*/
SCOTCH_Num * const          treetab)              /*+ Separator tree array               +*/
{
  Graph *             srcgrafptr;
  LibOrder *          libordeptr;

#ifdef SCOTCH_DEBUG_LIBRARY1
  if (sizeof (SCOTCH_Ordering) < sizeof (LibOrder)) {
    errorPrint ("SCOTCH_graphOrderInit: internal error");
    return     (1);
  }
#endif /* SCOTCH_DEBUG_LIBRARY1 */

  srcgrafptr = (Graph *) grafptr;                 /* Use structure as source graph */
  libordeptr = (LibOrder *) ordeptr;
  libordeptr->permtab = ((permtab == NULL) || ((void *) permtab == (void *) grafptr)) ? NULL : (Gnum *) permtab;
  libordeptr->peritab = ((peritab == NULL) || ((void *) peritab == (void *) grafptr)) ? NULL : (Gnum *) peritab;
  libordeptr->cblkptr = ((cblkptr == NULL) || ((void *) cblkptr == (void *) grafptr)) ? NULL : (Gnum *) cblkptr;
  libordeptr->rangtab = ((rangtab == NULL) || ((void *) rangtab == (void *) grafptr)) ? NULL : (Gnum *) rangtab;
  libordeptr->treetab = ((treetab == NULL) || ((void *) treetab == (void *) grafptr)) ? NULL : (Gnum *) treetab;

  return (orderInit (&libordeptr->o, srcgrafptr->baseval, srcgrafptr->vertnbr, libordeptr->peritab));
}