Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 #include <fstream>
00041 #include <iostream>
00042 #include <string.h>
00043 #include <string>
00044 #include <stdlib.h>
00045 
00051 int main (int argc, char* argv[])
00052 {
00053   int argi;
00054   for (argi = 1; argi < argc; ++argi) {
00055 
00056     if (argv[argi][0] != '-') {
00057       break;
00058     }
00059     if (argv[argi][1] == 0) {
00060       ++argi;
00061       break;
00062     }
00063     char short_opt, *long_opt, *opt_arg;
00064     if (argv[argi][1] != '-') {
00065       short_opt = argv[argi][1];
00066       opt_arg = &argv[argi][2];
00067       long_opt = &argv[argi][2];
00068       while (*long_opt != '\0') {
00069         ++long_opt;
00070       }
00071     }
00072     else {
00073       short_opt = 0;
00074       long_opt = &argv[argi][2];
00075       opt_arg = long_opt;
00076       while ((*opt_arg != '=') && (*opt_arg != '\0')) {
00077         ++opt_arg;
00078       }
00079       if (*opt_arg == '=') {
00080         *opt_arg++ = '\0';
00081       }
00082     }
00083 
00084     if ((short_opt == 'h') || (strcmp (long_opt, "help") == 0)) {
00085       std::cout << "Usage: plyheader [OPTION] [[INFILE] OUTFILE]\n";
00086       std::cout << "Extract the header from a PLY file.\n";
00087       std::cout << "\n";
00088       std::cout << "  -h, --help       display this help and exit\n";
00089       std::cout << "  -v, --version    output version information and exit\n";
00090       std::cout << "\n";
00091       std::cout << "With no INFILE/OUTFILE, or when INFILE/OUTFILE is -, read standard input/output.\n";
00092       std::cout << "\n";
00093       std::cout << "Report bugs to <www.pointclouds.org/issues>.\n";
00094       return EXIT_SUCCESS;
00095     }
00096 
00097     else if ((short_opt == 'v') || (strcmp (long_opt, "version") == 0)) {
00098       std::cout << "plyheader \n";
00099       std::cout << " Point Cloud Library (PCL) - www.pointclouds.org\n";
00100       std::cout << " Copyright (c) 2007-2012, Ares Lagae\n";
00101       std::cout << " Copyright (c) 2012, Willow Garage, Inc.\n";
00102       std::cout << " All rights reserved.\n";
00103       std::cout << " Redistribution and use in source and binary forms, with or without\n";
00104       std::cout << " modification, are permitted provided that the following conditions\n";
00105       std::cout << " are met:\n";
00106       std::cout << "  * Redistributions of source code must retain the above copyright\n";
00107       std::cout << "    notice, this list of conditions and the following disclaimer.\n";
00108       std::cout << "  * Redistributions in binary form must reproduce the above\n";
00109       std::cout << "    copyright notice, this list of conditions and the following\n";
00110       std::cout << "    disclaimer in the documentation and/or other materials provided\n";
00111       std::cout << "    with the distribution.\n";
00112       std::cout << "  * Neither the name of Willow Garage, Inc. nor the names of its\n";
00113       std::cout << "    contributors may be used to endorse or promote products derived\n";
00114       std::cout << "    from this software without specific prior written permission.\n";
00115       std::cout << " THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n";
00116       std::cout << " \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n";
00117       std::cout << " LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n";
00118       std::cout << " FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n";
00119       std::cout << " COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n";
00120       std::cout << " INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n";
00121       std::cout << " BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n";
00122       std::cout << " LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n";
00123       std::cout << " CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n";
00124       std::cout << " LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n";
00125       std::cout << " ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n";
00126       std::cout << " POSSIBILITY OF SUCH DAMAGE.\n";
00127       return EXIT_SUCCESS;
00128     }
00129 
00130     else {
00131       std::cerr << "plyheader: " << "invalid option `" << argv[argi] << "'" << "\n";
00132       std::cerr << "Try `" << argv[0] << " --help' for more information.\n";
00133       return EXIT_FAILURE;
00134     }
00135   }
00136 
00137   int parc = argc - argi;
00138   char** parv = argv + argi;
00139   if (parc > 2) {
00140     std::cerr << "plyheader: " << "too many parameters" << "\n";
00141     std::cerr << "Try `" << argv[0] << " --help' for more information.\n";
00142     return EXIT_FAILURE;
00143   }
00144 
00145   std::ifstream ifstream;
00146   const char* ifilename = "";
00147   if (parc > 0) {
00148     ifilename = parv[0];
00149     if (strcmp (ifilename, "-") != 0) {
00150       ifstream.open (ifilename);
00151       if (!ifstream.is_open ()) {
00152         std::cerr << "plyheader: " << ifilename << ": " << "no such file or directory" << "\n";
00153         return EXIT_FAILURE;
00154       }
00155     }
00156   }
00157 
00158   std::ofstream ofstream;
00159   const char* ofilename = "";
00160   if (parc > 1) {
00161     ofilename = parv[1];
00162     if (strcmp (ofilename, "-") != 0) {
00163       ofstream.open (ofilename);
00164       if (!ofstream.is_open ()) {
00165         std::cerr << "plyheader: " << ofilename << ": " << "could not open file" << "\n";
00166         return EXIT_FAILURE;
00167       }
00168     }
00169   }
00170 
00171   std::istream& istream = ifstream.is_open () ? ifstream : std::cin;
00172   std::ostream& ostream = ofstream.is_open () ? ofstream : std::cout;
00173 
00174   char magic[3];
00175   istream.read (magic, 3);
00176   if (!istream || (magic[0] != 'p') || (magic[1] != 'l') || (magic[2] != 'y')){
00177     return EXIT_FAILURE;
00178   }
00179   istream.ignore (1);
00180   ostream << magic[0] << magic[1] << magic[2] << "\n";
00181   std::string line;
00182   while (std::getline (istream, line)) {
00183     ostream << line << "\n";
00184     if (line == "end_header") {
00185       break;
00186     }
00187   }
00188   return istream ? EXIT_SUCCESS : EXIT_FAILURE;
00189 }