File: final_solution.cpp

package info (click to toggle)
seqan2 2.4.0%2Bdfsg-8~bpo8%2B1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-backports
  • size: 223,616 kB
  • sloc: cpp: 256,884; ansic: 91,671; python: 8,339; sh: 995; xml: 570; makefile: 242; awk: 51
file content (117 lines) | stat: -rw-r--r-- 4,447 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
      #include <iostream>

      #include <seqan/arg_parse.h>

      struct ModifyStringOptions
      {
          unsigned period;
          bool toUppercase;
          bool toLowercase;
          seqan::CharString text;

          ModifyStringOptions() :
              period(1), toUppercase(false), toLowercase(false)
          {}
      };

      seqan::ArgumentParser::ParseResult
      parseCommandLine(ModifyStringOptions & options, int argc, char const ** argv)
      {
          // Setup ArgumentParser.
          seqan::ArgumentParser parser("modify_string");
          // Set short description, version, and date.
          setShortDescription(parser, "String Modifier");
          setVersion(parser, "1.0");
          setDate(parser, "July 2012");

          // Define usage line and long description.
          addUsageLine(parser,
                       "[\\fIOPTIONS\\fP] \"\\fITEXT\\fP\"");
          addDescription(parser,
                         "This program allows simple character modifications to "
                         "each i-th character.");

          // We require one argument.
          addArgument(parser, seqan::ArgParseArgument(
              seqan::ArgParseArgument::STRING, "TEXT"));

          // Define Options -- Section Modification Options
          addSection(parser, "Modification Options");
          addOption(parser, seqan::ArgParseOption(
              "i", "period", "Period to use for the index.",
              seqan::ArgParseArgument::INTEGER, "INT"));
          setDefaultValue(parser, "period", "1");
          addOption(parser, seqan::ArgParseOption(
              "U", "uppercase", "Select to-uppercase as operation."));
          addOption(parser, seqan::ArgParseOption(
              "L", "lowercase", "Select to-lowercase as operation."));

          // Add Examples Section.
          addTextSection(parser, "Examples");
          addListItem(parser,
                      "\\fBmodify_string\\fP \\fB-U\\fP \\fIveryverylongword\\fP",
                      "Print upper case version of \"veryverylongword\"");
          addListItem(parser,
                      "\\fBmodify_string\\fP \\fB-L\\fP \\fB-i\\fP \\fI3\\fP "
                      "\\fIveryverylongword\\fP",
                      "Print \"veryverylongword\" with every third character "
                      "converted to upper case.");

          // Parse command line.
          seqan::ArgumentParser::ParseResult res = seqan::parse(parser, argc, argv);

          // Only extract  options if the program will continue after parseCommandLine()
          if (res != seqan::ArgumentParser::PARSE_OK)
              return res;

          // Extract option values.
          getOptionValue(options.period, parser, "period");
          options.toUppercase = isSet(parser, "uppercase");
          options.toLowercase = isSet(parser, "lowercase");
          seqan::getArgumentValue(options.text, parser, 0);

          // If both to-uppercase and to-lowercase were selected then this is an error.
          if (options.toUppercase && options.toLowercase)
          {
              std::cerr << "ERROR: You cannot specify both to-uppercase and to-lowercase!\n";
              return seqan::ArgumentParser::PARSE_ERROR;
          }

          return seqan::ArgumentParser::PARSE_OK;
      }

      seqan::CharString modifyString(seqan::CharString const & text,
                                     ModifyStringOptions const & options)
      {
          seqan::CharString result;

          if (options.toLowercase)
          {
              for (unsigned i = 0; i < length(text); ++i)
                  appendValue(result, tolower(text[i]));
          }
          else
          {
              for (unsigned i = 0; i < length(text); ++i)
                  appendValue(result, toupper(text[i]));
          }

          return result;
      }

      int main(int argc, char const ** argv)
      {
          // Parse the command line.
          ModifyStringOptions options;
          seqan::ArgumentParser::ParseResult res = parseCommandLine(options, argc, argv);

          // If parsing was not successful then exit with code 1 if there were errors.
          // Otherwise, exit with code 0 (e.g. help was printed).
          if (res != seqan::ArgumentParser::PARSE_OK)
              return res == seqan::ArgumentParser::PARSE_ERROR;

          std::cout << modifyString(options.text, options) << '\n';

          return 0;
      }