00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <mpcl/text/codegen/clause_tag_string.hh>
00027 #include <mpcl/text/codegen/defs.hh>
00028 #include <mpcl/text/regex/matcher.hh>
00029
00030
00031
00032
00033
00034
00035 void mpcl::text::codegen::TClauseTagString::
00036 overloadFrom (const TClauseTagString& rkySOURCE_CLAUSE_TAG)
00037 {
00038
00039 assign (rkySOURCE_CLAUSE_TAG);
00040 gCheckParameters = rkySOURCE_CLAUSE_TAG.gCheckParameters;
00041
00042 }
00043
00044
00045 void mpcl::text::codegen::TClauseTagString::
00046 read (std::basic_istream<char_type, traits_type>& rtSOURCE_ISTREAM)
00047 {
00048
00049 using std::basic_istream;
00050 using std::ios;
00051 using text::regex::TMatcher;
00052
00053 bool gHasTarget = false;
00054 ios::iostate tInitialIostate = rtSOURCE_ISTREAM.rdstate();
00055 basic_istream<char_type, traits_type>::pos_type tInitialPos = rtSOURCE_ISTREAM.tellg();
00056 TMatcher tMatcher (rtSOURCE_ISTREAM);
00057
00058 gCheckParameters = true;
00059 tMatcher.setCaseSensitiveness (false);
00060
00061
00062
00063
00064 while ( tMatcher.scan (pkcCommentTagPattern, NULL) );
00065 if ( !tMatcher.scan (pkcCLAUSE_TagBegin, NULL) )
00066 {
00067 rtSOURCE_ISTREAM.setstate (std::ios::failbit);
00068 }
00069 else
00070 {
00071
00072
00073
00074 for (short int I = 0; ( I < 3 ) ;++I)
00075 {
00076 if ( !tMatcher.scan (pkcCLAUSE_TagNameAttr, (std::basic_string<char>*) this, NULL) )
00077 {
00078 if ( tMatcher.scan (pkcCLAUSE_TagTargetAttr, &yTarget, NULL) > 0 )
00079 {
00080 gHasTarget = true;
00081 }
00082 else
00083 {
00084 if ( !tMatcher.scan (pkcCLAUSE_TagNoCheckAttr, NULL) )
00085 {
00086 break;
00087 }
00088 else
00089 {
00090 gCheckParameters = false;
00091 }
00092 }
00093 }
00094 }
00095
00096
00097
00098
00099
00100 if ( !tMatcher.scan (pkcCLAUSE_TagEnd, NULL) )
00101 {
00102 rtSOURCE_ISTREAM.seekg (tInitialPos);
00103 rtSOURCE_ISTREAM.clear (tInitialIostate);
00104 rtSOURCE_ISTREAM.setstate (std::ios::failbit);
00105 }
00106 else
00107 {
00108
00109
00110
00111 if ( !gHasTarget )
00112 {
00113 yTarget.erase();
00114 }
00115 else
00116 {
00117 append (pkcTargetSeparator);
00118 append (yTarget);
00119 }
00120 }
00121 }
00122
00123 }
00124
00125
00126
00127
00128
00129
00130 bool mpcl::text::codegen::TClauseTagString::
00131 mustCheckParameters (void) const
00132 {
00133
00134 return gCheckParameters;
00135
00136 }
00137
00138
00139 const mpcl::text::TString& mpcl::text::codegen::TClauseTagString::
00140 name (void) const
00141 {
00142
00143 return (const TString&) *this;
00144
00145 }
00146
00147
00148 const mpcl::text::TString& mpcl::text::codegen::TClauseTagString::
00149 target (void) const
00150 {
00151
00152 return yTarget;
00153
00154 }
00155
00156
00157 void mpcl::text::codegen::TClauseTagString::
00158 write (std::basic_ostream<char_type, traits_type>& rtTARGET_OSTREAM) const
00159 {
00160
00161 if ( yTarget.empty() )
00162 {
00163 rtTARGET_OSTREAM << "<clause name=\"";
00164 operator << (rtTARGET_OSTREAM, (std::string) *this);
00165 rtTARGET_OSTREAM << "\"";
00166 }
00167 else
00168 {
00169 size_type zTargetSeparatorPosition;
00170 TString yRealName;
00171
00172 if ( npos == (zTargetSeparatorPosition = rfind (pkcTargetSeparator)) )
00173 {
00174 throw TBadInstantiateSyntaxException ("malformed name", __FILE__, __LINE__);
00175 }
00176 yRealName = substr (0, zTargetSeparatorPosition);
00177 rtTARGET_OSTREAM << "<clause name=\"" << yRealName << "\" target=\"" << yTarget << "\"";
00178 }
00179 if ( !gCheckParameters )
00180 {
00181 rtTARGET_OSTREAM << " nocheck";
00182 }
00183 rtTARGET_OSTREAM << ">";
00184
00185 }