Index: /trunk/Ohana/src/opihi/cmd.data/book.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/book.c	(revision 16630)
+++ /trunk/Ohana/src/opihi/cmd.data/book.c	(revision 16631)
@@ -7,4 +7,5 @@
 int book_getbook (int argc, char **argv);
 int book_listbook (int argc, char **argv);
+int book_shuffle (int argc, char **argv);
 int book_npages (int argc, char **argv);
 int book_newpage (int argc, char **argv);
@@ -22,4 +23,5 @@
   {1, "getbook",  book_getbook,  "get book name by location"},
   {1, "listbook", book_listbook, "list pages in a book"},
+  {1, "shuffle",  book_shuffle,  "shuffle pages in a book"},
   {1, "npages",   book_npages,   "return number of pages in a book"},
   {1, "newpage",  book_newpage,  "create a new page in a book"},
@@ -43,4 +45,5 @@
     gprint (GP_ERR, "    book getbook  (where) [-var var]           : get book name\n");
     gprint (GP_ERR, "    book listbook (book)                       : list a book\n");
+    gprint (GP_ERR, "    book shuffle  (book)                       : randomize pages in a book\n");
     gprint (GP_ERR, "    book npages   (book) [-var var] [-key key] : return number of pages in a book\n");
     gprint (GP_ERR, "    book newpage  (book) (page)                : create a new page in a book\n");
Index: /trunk/Ohana/src/opihi/cmd.data/book_commands.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/book_commands.c	(revision 16630)
+++ /trunk/Ohana/src/opihi/cmd.data/book_commands.c	(revision 16631)
@@ -378,4 +378,26 @@
 }
 
+int book_shuffle (int argc, char **argv) {
+
+  int where, N;
+  char *varName, *keyName, *keyValue;
+  Book *book;
+  Page *page;
+
+  if (argc != 2) {
+    gprint (GP_ERR, "USAGE: book shuffle (book)\n");
+    return FALSE;
+  }
+
+  book = FindBook (argv[1]);
+  if (book == NULL) {
+    gprint (GP_ERR, "book %s not found\n", argv[1]);
+    return FALSE;
+  }
+
+  ShufflePages (book);
+  return TRUE;
+}
+
 int book_setword (int argc, char **argv) {
 
Index: /trunk/Ohana/src/opihi/include/data.h
===================================================================
--- /trunk/Ohana/src/opihi/include/data.h	(revision 16630)
+++ /trunk/Ohana/src/opihi/include/data.h	(revision 16631)
@@ -29,5 +29,5 @@
   int Npages;
   Page **pages;
-  int *index;
+  // int *index; (why did I define this?  is it not used?)
   char **pageIDs;
 } Book;
@@ -52,4 +52,5 @@
 Page *GetPageRestricted (Book *book, int where, char *keyName, char *keyValue);
 Page *CreatePage (Book *book, char *name);
+int ShufflePages (Book *book);
 int DeletePage (Book *book, Page *page);
 void ListPages (Book *book);
Index: /trunk/Ohana/src/opihi/lib.data/book.c
===================================================================
--- /trunk/Ohana/src/opihi/lib.data/book.c	(revision 16630)
+++ /trunk/Ohana/src/opihi/lib.data/book.c	(revision 16631)
@@ -29,5 +29,5 @@
     ALLOCATE (book[0].pages, Page *, book[0].NPAGES);
     ALLOCATE (book[0].pageIDs, char *, book[0].NPAGES);
-    ALLOCATE (book[0].index, int, book[0].NPAGES);
+    // ALLOCATE (book[0].index, int, book[0].NPAGES);
 }
 
@@ -43,5 +43,5 @@
     free (book[0].pages);
     free (book[0].pageIDs);
-    free (book[0].index);
+    // free (book[0].index);
     free (book);
 }
Index: /trunk/Ohana/src/opihi/lib.data/page.c
===================================================================
--- /trunk/Ohana/src/opihi/lib.data/page.c	(revision 16630)
+++ /trunk/Ohana/src/opihi/lib.data/page.c	(revision 16631)
@@ -106,5 +106,5 @@
     REALLOCATE (book[0].pages, Page *, book[0].NPAGES);
     REALLOCATE (book[0].pageIDs, char *, book[0].NPAGES);
-    REALLOCATE (book[0].index, int, book[0].NPAGES);
+    // REALLOCATE (book[0].index, int, book[0].NPAGES);
   }
   ALLOCATE (page, Page, 1);
@@ -112,7 +112,42 @@
   book[0].pages[N] = page;
   book[0].pageIDs[N] = strcreate(name);
-  book[0].index[N] = N;
+  // book[0].index[N] = N;
   
   /* at this point, I should sort the index */
+
+  return (page);
+}
+
+void sortpages (int *seq, Page **pages, char **pageIDs, int N) {
+
+# define SWAPFUNC(A,B){ Page *tmpPage; char *tmpID; \
+  tmpPage = pages[A];   pages[A]   = pages[B];   pages[B] = tmpPage; \
+  tmpID   = pageIDs[A]; pageIDs[A] = pageIDs[B]; pageIDs[B] = tmpID; \
+}
+# define COMPARE(A,B)(seq[A] < seq[B])
+
+  OHANA_SORT (N, COMPARE, SWAPFUNC);
+
+# undef SWAPFUNC
+# undef COMPARE
+}
+
+/* make a new named page */
+int ShufflePages (Book *book) {
+
+  int i, N, *seq;
+  Page *page;
+
+  N = book[0].Npages;
+
+  // generate a random index
+  ALLOCATE (seq, int, N);
+  for (i = 0; i < N; i++) {
+    seq[i] = N * drand48();
+  }
+
+  // sort the pages by the random index
+  sortpages (seq, book[0].pages, book[0].pageIDs, N);
+  free (seq);
 
   return (page);
@@ -140,5 +175,5 @@
     book[0].pages[i] = book[0].pages[i + 1];
     book[0].pageIDs[i] = book[0].pageIDs[i + 1];
-    book[0].index[i] = book[0].index[i + 1];
+    // book[0].index[i] = book[0].index[i + 1];
   }
   book[0].Npages --;
@@ -148,5 +183,5 @@
     REALLOCATE (book[0].pages, Page *, book[0].NPAGES);
     REALLOCATE (book[0].pageIDs, char *, book[0].NPAGES);
-    REALLOCATE (book[0].index, int, book[0].NPAGES);
+    // REALLOCATE (book[0].index, int, book[0].NPAGES);
   }
 
