/* A program by Josh Parnell that prints its own source code. */
#include <iostream>
#include <string>
#include <sstream>
#include <vector>

void ps(const std::string& printString, std::vector<std::string>& buffer)
{
  std::stringstream selfCode;
  std::cout << printString << std::endl;
  selfCode << char(32) << char(32) << char(112) << char(115) << char(40) << char(34) << printString
  << char(34) << char(44) << char(98) << char(41) << char(59);
  buffer.push_back(selfCode.str());
}
void pb(std::vector<std::string>& buffer)
{
  for (unsigned int i = 0; i < buffer.size(); ++i)
  std::cout << buffer[i] << std::endl;
  std::cout << char(32) << char(32) << char(112) << char(98) << char(40) << char(98) << char(41) << char(59) << std::endl;
  std::cout << char(125) << std::endl;
}
int main()
{
  std::vector<std::string> b;
  ps("/* A program by Josh Parnell that prints its own source code. */",b);
  ps("#include <iostream>",b);
  ps("#include <string>",b);
  ps("#include <sstream>",b);
  ps("#include <vector>",b);
  ps("",b);
  ps("void ps(const std::string& printString, std::vector<std::string>& buffer)",b);
  ps("{",b);
  ps("  std::stringstream selfCode;",b);
  ps("  std::cout << printString << std::endl;",b);
  ps("  selfCode << char(32) << char(32) << char(112) << char(115) << char(40) << char(34) << printString",b);
  ps("  << char(34) << char(44) << char(98) << char(41) << char(59);",b);
  ps("  buffer.push_back(selfCode.str());",b);
  ps("}",b);
  ps("void pb(std::vector<std::string>& buffer)",b);
  ps("{",b);
  ps("  for (unsigned int i = 0; i < buffer.size(); ++i)",b);
  ps("  std::cout << buffer[i] << std::endl;",b);
  ps("  std::cout << char(32) << char(32) << char(112) << char(98) << char(40) << char(98) << char(41) << char(59) << std::endl;",b);
  ps("  std::cout << char(125) << std::endl;",b);
  ps("}",b);
  ps("int main()",b);
  ps("{",b);
  ps("  std::vector<std::string> b;",b);
  pb(b);
}
