Adding file operations result checking.
[debian/gnuradio] / gr-trellis / src / lib / interleaver.cc
index 427db72e3197143556573a6768fe45fd215146ae..ff15eeadc8a974c03577acf170e5dbe79ff8a341 100644 (file)
-/* -*- c++ -*- */\r
-/*\r
- * Copyright 2002 Free Software Foundation, Inc.\r
- *\r
- * This file is part of GNU Radio\r
- *\r
- * GNU Radio is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2, or (at your option)\r
- * any later version.\r
- *\r
- * GNU Radio is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with GNU Radio; see the file COPYING.  If not, write to\r
- * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
- * Boston, MA 02111-1307, USA.\r
- */\r
-\r
-#include <cstdlib> \r
-#include <cstdio>\r
-#include <stdexcept>\r
-#include <cmath>\r
-#include "quicksort_index.h"\r
-#include "interleaver.h"\r
-\r
-interleaver::interleaver()\r
-{\r
-  d_K=0;\r
-  d_INTER.resize(0);\r
-  d_DEINTER.resize(0);\r
-}\r
-\r
-interleaver::interleaver(const interleaver &INTERLEAVER)\r
-{\r
-  d_K=INTERLEAVER.K();\r
-  d_INTER=INTERLEAVER.INTER();\r
-  d_DEINTER=INTERLEAVER.DEINTER();\r
-}\r
-\r
-interleaver::interleaver(const int K, const std::vector<int> &INTER)\r
-{\r
-  d_K=K;\r
-  d_INTER=INTER;\r
-  d_DEINTER.resize(d_K);\r
-  \r
-  // generate DEINTER table\r
-  for(int i=0;i<d_K;i++) {\r
-    d_DEINTER[d_INTER[i]]=i;\r
-  }\r
-}\r
-\r
-//######################################################################\r
-//# Read an INTERLEAVER specification from a file.\r
-//# Format (hopefully will become more flexible in the future...):\r
-//# K\r
-//# blank line\r
-//# list of space separated K integers from 0 to K-1 in appropriate order\r
-//# optional comments\r
-//######################################################################\r
-interleaver::interleaver(const char *name) \r
-{\r
-  FILE *interleaverfile;\r
-\r
-  if((interleaverfile=fopen(name,"r"))==NULL) \r
-    throw std::runtime_error ("file open error in interleaver()");\r
-    //printf("file open error in interleaver()\n");\r
-  \r
-  fscanf(interleaverfile,"%d\n",&d_K);\r
-  d_INTER.resize(d_K);\r
-  d_DEINTER.resize(d_K);\r
-\r
-  for(int i=0;i<d_K;i++) fscanf(interleaverfile,"%d",&(d_INTER[i]));\r
-  \r
-  // generate DEINTER table\r
-  for(int i=0;i<d_K;i++) {\r
-    d_DEINTER[d_INTER[i]]=i;\r
-  }\r
-}\r
-\r
-//######################################################################\r
-//# Generate a random interleaver\r
-//######################################################################\r
-interleaver::interleaver(const int K, unsigned int seed)\r
-{\r
-  d_K=K;\r
-  d_INTER.resize(d_K);\r
-  d_DEINTER.resize(d_K);\r
-\r
-  std::runtime_error ("Not yet implemented: something wrong with quicksort\n");\r
-/*\r
-  srand(seed); \r
-  std::vector<int> tmp(d_K);\r
-  for(int i=0;i<d_K;i++)\r
-    //d_INTER[i]=i;\r
-    tmp[i] = rand(); \r
-  quicksort_index <int> (tmp,d_INTER,0,d_K);\r
-\r
-  // generate DEINTER table\r
-  for(int i=0;i<d_K;i++) {\r
-    d_DEINTER[d_INTER[i]]=i;\r
-  }\r
-*/\r
-}\r
-\r
+/* -*- c++ -*- */
+/*
+ * Copyright 2002 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <cstdlib> 
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include <fstream>
+#include <stdexcept>
+#include <cmath>
+#include "quicksort_index.h"
+#include "interleaver.h"
+
+
+
+
+interleaver::interleaver()
+{
+  d_K=0;
+  d_INTER.resize(0);
+  d_DEINTER.resize(0);
+}
+
+interleaver::interleaver(const interleaver &INTERLEAVER)
+{
+  d_K=INTERLEAVER.K();
+  d_INTER=INTERLEAVER.INTER();
+  d_DEINTER=INTERLEAVER.DEINTER();
+}
+
+interleaver::interleaver(int K, const std::vector<int> &INTER)
+{
+  d_K=K;
+  d_INTER=INTER;
+  d_DEINTER.resize(d_K);
+  
+  // generate DEINTER table
+  for(int i=0;i<d_K;i++) {
+    d_DEINTER[d_INTER[i]]=i;
+  }
+}
+
+//######################################################################
+//# Read an INTERLEAVER specification from a file.
+//# Format (hopefully will become more flexible in the future...):
+//# K
+//# blank line
+//# list of space separated K integers from 0 to K-1 in appropriate order
+//# optional comments
+//######################################################################
+interleaver::interleaver(const char *name) 
+{
+  FILE *interleaverfile;
+
+  if((interleaverfile=fopen(name,"r"))==NULL) 
+    throw std::runtime_error ("file open error in interleaver()");
+    //printf("file open error in interleaver()\n");
+  
+  if(fscanf(interleaverfile,"%d\n",&d_K) == EOF) {
+    if(ferror(interleaverfile) != 0)
+      throw std::runtime_error ("interleaver::interleaver(const char *name): file read error\n");
+  }
+
+  d_INTER.resize(d_K);
+  d_DEINTER.resize(d_K);
+
+  for(int i=0;i<d_K;i++) {
+    if(fscanf(interleaverfile,"%d",&(d_INTER[i])) == EOF) {
+      if(ferror(interleaverfile) != 0)
+       throw std::runtime_error ("interleaver::interleaver(const char *name): file read error\n");
+    }
+  }
+  
+  // generate DEINTER table
+  for(int i=0;i<d_K;i++) {
+    d_DEINTER[d_INTER[i]]=i;
+  }
+}
+
+//######################################################################
+//# Generate a random interleaver
+//######################################################################
+interleaver::interleaver(int K, int seed)
+{
+  d_K=K;
+  d_INTER.resize(d_K);
+  d_DEINTER.resize(d_K);
+
+  if(seed>=0) srand((unsigned int)seed); 
+  std::vector<int> tmp(d_K);
+  for(int i=0;i<d_K;i++) {
+    d_INTER[i]=i;
+    tmp[i] = rand(); 
+  }
+  quicksort_index <int> (tmp,d_INTER,0,d_K-1);
+
+  // generate DEINTER table
+  for(int i=0;i<d_K;i++) {
+    d_DEINTER[d_INTER[i]]=i;
+  }
+}
+
+
+
+
+
+//######################################################################
+//# Write an INTERLEAVER specification from a file.
+//# Format
+//# K
+//# blank line
+//# list of space separated K integers from 0 to K-1 in appropriate order
+//# optional comments
+//######################################################################
+void interleaver::write_interleaver_txt(std::string filename)
+{
+   std::ofstream interleaver_fname (filename.c_str());
+   if (!interleaver_fname) {std::cout << "file not found " << std::endl ; exit(-1);}
+   interleaver_fname << d_K << std::endl;
+   interleaver_fname << std::endl;
+   for(int i=0;i<d_K;i++)
+     interleaver_fname << d_INTER[i] << ' ';
+   interleaver_fname << std::endl;
+   interleaver_fname.close();
+}