Jpp  debug
the software that should make you happy
Functions
JEditProperties.cc File Reference

General purpose program to edit or create properties file. More...

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
#include <set>
#include <map>
#include "JLang/JEquationParameters.hh"
#include "JLang/JEquation.hh"
#include "JLang/JToken.hh"
#include "JSupport/JMeta.hh"
#include "Jeep/JProperties.hh"
#include "Jeep/JComment.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

General purpose program to edit or create properties file.

Author
mdejong

Definition in file JEditProperties.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 25 of file JEditProperties.cc.

26 {
27  using namespace std;
28  using namespace JPP;
29 
30  typedef JToken<';'> token_type;
31 
32  string inputFile;
33  string outputFile;
34  JEquationParameters parameters("=", ";\n", "", "#");
35  vector<token_type> modifier;
36  set<string> rm;
37  int width;
38  bool squash;
39  int debug;
40 
41  try {
42 
43  JProperties properties;
44 
45  properties["sep"] = parameters.getSeparator();
46  properties["eol"] = parameters.getEndOfLine();
47  properties["div"] = parameters.getDivision();
48  properties["skip"] = parameters.getSkipLine();
49  properties["left"] = parameters.getLeftBracket();
50  properties["right"] = parameters.getRightBracket();
51  properties["ws"] = parameters.getWhiteSpace();
52  properties["cc"] = parameters.getComment();
53 
54  JParser<> zap("General purpose program to edit or create properties file.");
55 
56  zap['f'] = make_field(inputFile) = "";
57  zap['o'] = make_field(outputFile) = "";
58  zap['@'] = make_field(properties) = JPARSER::initialised();
59  zap['M'] = make_field(modifier, "modifier; syntax \"<key> = <value>[" << token_type::SEPARATOR << "..]\"") = JPARSER::initialised();
60  zap['r'] = make_field(rm, "remove key") = JPARSER::initialised();
61  zap['w'] = make_field(width, "format width of key") = 12;
62  zap['q'] = make_field(squash, "squash meta data");
63  zap['d'] = make_field(debug, "debug level") = 2;
64 
65  zap(argc, argv);
66  }
67  catch(const exception &error) {
68  FATAL(error.what() << endl);
69  }
70 
71 
72  JComment comment;
74 
75  const JEquationFacet facet(parameters);
76 
77  // input
78 
79  if (inputFile != "") {
80 
81  ifstream in(inputFile.c_str());
82 
83  in >> comment;
84 
85  in.imbue(locale(in.getloc(), facet.clone()));
86 
87  for (JEquation equation; in >> equation; ) {
88  data[equation.getKey()] = equation.getValue();
89  }
90 
91  in.close();
92  }
93 
94  if (squash) {
95  comment.clear();
96  }
97 
98  comment.add(JMeta(argc, argv));
99 
100  // edit or create
101 
102  if (!modifier.empty()) {
103 
104  istringstream is;
105 
106  is.imbue(locale(is.getloc(), facet.clone()));
107 
108  for (const token_type& token : modifier) {
109 
110  is.clear();
111  is.str(token);
112 
113  JEquation equation;
114 
115  if (is >> equation && facet.isSeparator(equation.getSeparator()))
116  data[equation.getKey()] = equation.getValue();
117  else
118  ERROR("Invalid modifier: " << token << endl);
119  }
120  }
121 
122  if (!rm.empty()) {
123 
124  for (const string& key : rm) {
125 
126  map<string, string>::iterator i = data.find(key);
127 
128  if (i != data.end()) {
129  data.erase(i);
130  }
131  }
132  }
133 
134  // output
135 
136  filebuf buffer;
137 
138  if (outputFile != "") {
139  buffer.open(outputFile.c_str(), ios::out);
140  }
141 
142  ostream os(buffer.is_open() ? &buffer : cout.rdbuf());
143 
144  os << comment;
145 
146  os.imbue(locale(cout.getloc(), facet.clone()));
147 
148  for (const auto& item : data) {
149  os << setw(width) << left << item.first << right << facet.getDefaultWhiteSpace()
150  << facet.getSeparator() << facet.getDefaultWhiteSpace()
151  << item.second << facet.getEndOfLine();
152  }
153 
154  buffer.close();
155 }
string outputFile
#define ERROR(A)
Definition: JMessage.hh:66
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
Utility class to parse parameter values.
Definition: JProperties.hh:501
Facet class to specify parsing of equations in currect locale (see class JLANG::JEquation).
Simple data structure to support I/O of equations (see class JLANG::JEquation).
const std::string & getEndOfLine() const
Get end of line characters.
const std::string & getWhiteSpace() const
Get white space characters.
const std::string & getComment() const
Get comment string.
const std::string & getSeparator() const
Get separator characters.
char getLeftBracket() const
Get left bracket.
const std::string & getSkipLine() const
Get skip line characters.
const std::string & getDivision() const
Get division characters.
char getRightBracket() const
Get right bracket.
General purpose equation class.
Definition: JEquation.hh:47
const std::string & getKey() const
Get key.
Definition: JEquation.hh:163
const std::string & getValue() const
Get value.
Definition: JEquation.hh:185
const char getSeparator() const
Get separator.
Definition: JEquation.hh:174
Wrapper class around string.
Definition: JToken.hh:26
Utility class to parse command line options.
Definition: JParser.hh:1714
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JSTDTypes.hh:14
Auxiliary class for comment.
Definition: JComment.hh:43
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:84
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:72