00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "nrro.h"
00021
00022 using namespace std;
00023
00024
00025
00026
00027 int Nrro::numComments() const
00028 {
00029 if(!_nrrd->cmt) return 0;
00030 return _nrrd->cmtArr->len;
00031 }
00032
00033
00034
00035
00036 std::string Nrro::getComment(int i)
00037 {
00038 if((!_nrrd->cmt) || ( i >= _nrrd->cmtArr->len))
00039 return std::string();
00040 return std::string(_nrrd->cmt[i]);
00041 }
00042
00043
00044
00045
00046 std::string Nrro::getComment(const std::string key)
00047 {
00048 char *cmt = nrrdCommentScan(_nrrd, key.c_str());
00049 if(cmt)
00050 {
00051 return std::string(cmt);
00052 }
00053 return std::string();
00054 }
00055
00056
00057
00058
00059 void Nrro::addComment(const std::string comment)
00060 {
00061 nrrdCommentAdd(_nrrd,comment.c_str());
00062 }
00063
00064
00065
00066
00067 void Nrro::addComment(const std::string key, const std::string comment)
00068 {
00069 std::string cmt = key;
00070 cmt += ":";
00071 cmt += comment;
00072 nrrdCommentAdd(_nrrd,cmt.c_str());
00073 }
00074
00075
00076
00077
00078 void Nrro::setComment(int i, const std::string comment)
00079 {
00080 if((!_nrrd->cmt) || ( i >= _nrrd->cmtArr->len))
00081 {
00082 return;
00083 }
00084
00085 if(comment.empty())
00086 {
00087 NrroDbg("setComment(i), adding an empty comment???");
00088 return;
00089 }
00090
00091
00092
00093
00094 if(_nrrd->cmt[i]){
00095 if(_nrrd->cmtArr->freeCB)
00096 {
00097 _nrrd->cmtArr->freeCB(_nrrd->cmt[i]);
00098 }
00099 else
00100 {
00101 _nrrd->cmtArr->doneCB(_nrrd->cmt[i]);
00102 }
00103 }
00104 _nrrd->cmt[i] = airStrdup(comment.c_str());
00105 }
00106
00107
00108
00109
00110 static const std::string whitespc("\t \n");
00111
00112
00113
00114
00115
00116
00117 bool stringHasKey(const std::string &key, const std::string &cmt)
00118 {
00119 int idx;
00120
00121 if((idx=cmt.find(key)) != -1)
00122 {
00123
00124 idx+= key.length();
00125
00126 if((idx=cmt.find_first_not_of(whitespc,idx)) != -1)
00127 {
00128
00129 if(cmt[idx] == ':')
00130 {
00131
00132
00133 if(cmt.find_first_not_of(whitespc, idx+1) != -1)
00134 {
00135
00136
00137 return true;
00138 }
00139 }
00140 }
00141 }
00142 return false;
00143 }
00144
00145
00146
00147
00148 void Nrro::setComment(const std::string key, const std::string comment)
00149 {
00150
00151 if((!_nrrd->cmt))
00152 {
00153 addComment(key,comment);
00154 return;
00155 }
00156
00157
00158 if(!nrrdCommentScan(_nrrd, key.c_str()))
00159 {
00160 addComment(key,comment);
00161 return;
00162 }
00163
00164
00165
00166
00167
00168
00169 std::string cmt = key;
00170 cmt += ":";
00171 cmt += comment;
00172
00173
00174 for(int i=0; i<numComments(); ++i)
00175 {
00176
00177
00178
00179 if( _nrrd->cmt[i] && stringHasKey(key, std::string(_nrrd->cmt[i])) )
00180 {
00181 setComment(i,cmt);
00182 return;
00183 }
00184 }
00185
00186
00187 NrroErr("setComment(), comment not set, not found and not detected empty");
00188 return;
00189 }
00190