/* public domain */
#include <iostream>
#include <vector>
#include <string>

#include <botan/bigint.h>
#include <botan/pipe.h>
#include <botan/hex.h>
using namespace Botan;

void strip_comments(std::string& line)
   {
   if(line.find('#') != std::string::npos)
      line = line.erase(line.find('#'), std::string::npos);
   }

void strip_newlines(std::string& line)
   {
   while(line.find('\n') != std::string::npos)
      line = line.erase(line.find('\n'), 1);
   }

/* Strip comments, whitespace, etc */
void strip(std::string& line)
   {
   strip_comments(line);

   while(line.find(' ') != std::string::npos)
      line = line.erase(line.find(' '), 1);

   while(line.find('\t') != std::string::npos)
      line = line.erase(line.find('\t'), 1);
   }

SecureVector<byte> decode_hex(const std::string& in)
   {
   SecureVector<byte> hex;
   for(u32bit j = 0; j != in.length(); j++)
      if(Hex_Decoder::is_valid(in[j]))
         hex.append(in[j]);

   if(hex.size() % 2)
      throw Exception("decode_hex: Odd input length (bad!): " + in);

   Botan::Pipe pipe(new Botan::Hex_Decoder);
   pipe.process_msg(hex, hex.size());
   return pipe.read_all();
   }

std::vector<std::string> parse(const std::string& line)
   {
   const char DELIMITER = ':';
   std::vector<std::string> substr;
   std::string::size_type start = 0, end = line.find(DELIMITER);
   while(end != std::string::npos)
      {
      substr.push_back(line.substr(start, end-start));
      start = end+1;
      end = line.find(DELIMITER, start);
      }
   if(line.size() > start)
      substr.push_back(line.substr(start));
   while(substr.size() <= 4) // at least 5 substr, some possibly empty
      substr.push_back("");
   return substr;
   }

BigInt to_bigint(const std::string& h)
   {
   return BigInt::decode((const byte*)h.data(),
                         h.length(), BigInt::Hexadecimal);
   }
