| 1 | // **************************************************************************
|
|---|
| 2 | /** @struct Description
|
|---|
| 3 |
|
|---|
| 4 | @brief A struct which stores a name, a unit and a comment
|
|---|
| 5 |
|
|---|
| 6 | To have proper descriptions of commands and services in the network
|
|---|
| 7 | (and later proper informations in the FITS files) this struct provides
|
|---|
| 8 | a simple storage for a name, a unit and a comment.
|
|---|
| 9 |
|
|---|
| 10 | Assume you want to write a descriptive string for a command with three arguments.
|
|---|
| 11 | It could look like this:
|
|---|
| 12 |
|
|---|
| 13 | COMMAND=Description|int[addr]:Address range (from - to)|val[byte]:Value to be set
|
|---|
| 14 |
|
|---|
| 15 | Description is a general description of the command or service itself,
|
|---|
| 16 | int and val are the names of the arguments (e.g. names of FITS columns),
|
|---|
| 17 | addr and byte have the meaning of a unit (e.g. unit of FITS column)
|
|---|
| 18 | and the text after the colon is a description of the arguments
|
|---|
| 19 | (e.g. comment of a FITS column). The description must not contain a
|
|---|
| 20 | line-break character \n.
|
|---|
| 21 |
|
|---|
| 22 | Such a string can then be converted with SplitDescription into a vector
|
|---|
| 23 | of Description objects, each containing the name, the unit and a
|
|---|
| 24 | comment indivdually. The first object will contain COMMAND as name and
|
|---|
| 25 | Description as comment. The unit will remain empty.
|
|---|
| 26 |
|
|---|
| 27 | You can omit either the name, the unit or the comment or any
|
|---|
| 28 | combination of them. The descriptions of the individual format strings
|
|---|
| 29 | are separated by a vertical line. If you want to enclose the name into
|
|---|
| 30 | []-braces (e.g. marking an optional argument in a dim command), you
|
|---|
| 31 | have add empty brackets for the units.
|
|---|
| 32 |
|
|---|
| 33 | For a suggestion for rules for the names please have a look at:
|
|---|
| 34 | http://heasarc.gsfc.nasa.gov/docs/heasarc/ofwg/docs/ofwg_recomm/r15.html
|
|---|
| 35 |
|
|---|
| 36 | For units please see:
|
|---|
| 37 | http://heasarc.gsfc.nasa.gov/docs/heasarc/ofwg/docs/general/ogip_93_001/ogip_93_001.html
|
|---|
| 38 |
|
|---|
| 39 | */
|
|---|
| 40 | // **************************************************************************
|
|---|
| 41 | #include "Description.h"
|
|---|
| 42 |
|
|---|
| 43 | #include <sstream>
|
|---|
| 44 |
|
|---|
| 45 | using namespace std;
|
|---|
| 46 |
|
|---|
| 47 | // --------------------------------------------------------------------------
|
|---|
| 48 | //
|
|---|
| 49 | //! This function breaks down a descriptive string into its components.
|
|---|
| 50 | //! For details see class reference.
|
|---|
| 51 | //!
|
|---|
| 52 | //! @param buffer
|
|---|
| 53 | //! string which should be broekn into pieces
|
|---|
| 54 | //!
|
|---|
| 55 | //! @returns
|
|---|
| 56 | //! A vector<Description> containing all the descriptions found.
|
|---|
| 57 | //! The first entry contains the Description members name and comment,
|
|---|
| 58 | //! corresponding to the service or command name the Description
|
|---|
| 59 | //! list is for and its corresponding description.
|
|---|
| 60 | //
|
|---|
| 61 | vector<Description> Description::SplitDescription(const string &buffer)
|
|---|
| 62 | {
|
|---|
| 63 | const size_t p0 = buffer.find_first_of('=');
|
|---|
| 64 |
|
|---|
| 65 | const string svc = buffer.substr(0, p0);
|
|---|
| 66 | const string desc = buffer.substr(p0+1);
|
|---|
| 67 |
|
|---|
| 68 | const size_t p = desc.find_first_of('|');
|
|---|
| 69 |
|
|---|
| 70 | // Extract a general description
|
|---|
| 71 | const string d = Trim(desc.substr(0, p));
|
|---|
| 72 |
|
|---|
| 73 | vector<Description> vec;
|
|---|
| 74 | vec.push_back(Description(svc, "", d));
|
|---|
| 75 |
|
|---|
| 76 | if (p==string::npos)
|
|---|
| 77 | return vec;
|
|---|
| 78 |
|
|---|
| 79 | string buf;
|
|---|
| 80 | stringstream stream(desc.substr(p+1));
|
|---|
| 81 | while (getline(stream, buf, '|'))
|
|---|
| 82 | {
|
|---|
| 83 | if (buf.empty())
|
|---|
| 84 | continue;
|
|---|
| 85 |
|
|---|
| 86 | const size_t p1 = buf.find_first_of(':');
|
|---|
| 87 |
|
|---|
| 88 | const string comment = p1==string::npos ? "" : buf.substr(p1+1);
|
|---|
| 89 | if (p1!=string::npos)
|
|---|
| 90 | buf.erase(p1);
|
|---|
| 91 |
|
|---|
| 92 | const size_t p2 = buf.find_last_of('[');
|
|---|
| 93 | const size_t p3 = buf.find_last_of(']');
|
|---|
| 94 |
|
|---|
| 95 | const bool hasunit = p2<p3 && p2!=string::npos;
|
|---|
| 96 |
|
|---|
| 97 | const string unit = hasunit ? buf.substr(p2+1, p3-p2-1) : "";
|
|---|
| 98 | const string name = hasunit ? buf.substr(0, p2) : buf;
|
|---|
| 99 |
|
|---|
| 100 | vec.push_back(Description(name, unit, comment));
|
|---|
| 101 | }
|
|---|
| 102 |
|
|---|
| 103 | return vec;
|
|---|
| 104 | }
|
|---|