00001 #include "dbcrst.h"
00002 #include "descript.h"
00003 #include "aliast.h"
00004 #include "iotools.h"
00005 #include "transcrsec.h"
00006 #include <string.h>
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 csect :: csect(void)
00017 {
00018 type = crsectypet(-1);
00019 ninst = 0;
00020 inst = NULL;
00021 instu = NULL;
00022 ridx = NULL;
00023 ninstu = 0;
00024 }
00025
00026
00027
00028
00029
00030
00031
00032
00033 csect :: ~csect(void)
00034 {
00035 long i;
00036 if (inst)
00037 {
00038 for (i=0; i < ninst; i++)
00039 delete [] inst[i];
00040 }
00041 delete [] inst;
00042 delete [] instu;
00043 delete [] ridx;
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 void csect::alloc(long ni)
00059 {
00060 ninst = ni;
00061 inst = new char*[ninst];
00062 memset(inst, 0, sizeof(*inst)*ninst);
00063 instu = new long[ninst];
00064 memset(instu, 0, sizeof(*instu)*ninst);
00065 ridx = new long[ninst];
00066 memset(ridx, 0, sizeof(*ridx)*ninst);
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 void csect::alloctc(long ni)
00082 {
00083 ninst = ni;
00084 instu = new long[ninst];
00085 memset(instu, 0, sizeof(*instu)*ninst);
00086 ridx = new long[ninst];
00087 memset(ridx, 0, sizeof(*ridx)*ninst);
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 long csect :: read(XFILE *in)
00105 {
00106 long i, id;
00107 char emsg[1001];
00108
00109 xfscanf(in, "%k%m%k%ld", "crstype", &crsectypet_kwdset, &type, "num_inst", &ninst);
00110
00111 alloc(ninst);
00112 for (i=0; i < ninst; i++)
00113
00114
00115
00116 {
00117 inst[i] = new char[1025];
00118 memset(inst[i], 0, sizeof(*inst[i])*1025);
00119 xfscanf(in, "%ld", &id);
00120 if ((id < 1) || (id > ninst))
00121 {
00122 sprintf(emsg, "index of the cross-section type instance is out of range <1,%ld>\n"
00123 "input file : %s, line=%ld, column=%ld", ninst, in->fname, in->line, in->col);
00124 print_err(emsg, __FILE__, __LINE__, __func__);
00125 return 1;
00126 }
00127 else
00128 {
00129 xfscanf(in,"%a", inst[id-1]);
00130 skipline(in);
00131 }
00132 }
00133 return(0);
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 dbcrst :: dbcrst(void)
00145 {
00146 numt = 0L;
00147 crs = NULL;
00148 crsu = NULL;
00149 ncrsu = 0L;
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159 dbcrst :: ~dbcrst(void)
00160 {
00161 delete [] crs;
00162 delete [] crsu;
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 long dbcrst::read(XFILE *in)
00178 {
00179
00180 xfscanf(in, "%k%ld", "num_crsec_types", &numt);
00181
00182 crs = new csect[numt];
00183 crsu = new long[numt];
00184 memset(crsu, 0, sizeof(*crsu)*numt);
00185 for (long i = 0; i < numt; i++)
00186 {
00187
00188 if (crs[i].read(in))
00189 {
00190 return(i+1);
00191 }
00192 }
00193 return 0;
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 long dbcrst::readtc(XFILE *in, transcrsec *transc, descript *d)
00212 {
00213 kwd_handling bmode;
00214
00215 xfscanf(in, "%k%ld", "num_crsec_types", &numt);
00216
00217 crs = new csect[numt];
00218 crsu = new long[numt];
00219 memset(crsu, 0, sizeof(*crsu)*numt);
00220 transc->ncst = numt;
00221 transc->cstype = new crsectypet [numt];
00222 transc->numtype = new long [numt];
00223 for (long i = 0; i < numt; i++)
00224 {
00225 xfscanf(in, "%k%m %k%ld", "crstype", &crsectypet_kwdset, &crs[i].type, "num_inst", &crs[i].ninst);
00226 crs[i].alloctc(crs[i].ninst);
00227 transc->cstype[i] = crs[i].type;
00228 transc->numtype[i] = crs[i].ninst;
00229 if (d->matkwd == no)
00230 {
00231 bmode = in->kwdmode;
00232 if (in->index_created)
00233 in->kwdmode = sect_mode_ignore;
00234 else
00235 in->kwdmode = ignore;
00236 }
00237
00238 transc->readcrsectype(in, transc->cstype[i], transc->numtype[i]);
00239 if (d->matkwd == no)
00240 in->kwdmode = bmode;
00241 }
00242 return 0;
00243 }
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 long dbcrst :: search_crs(crsectypet ce, long ci)
00261 {
00262 long i,ret = -1;
00263
00264 for (i = 0; i < numt; i++)
00265 {
00266 if ((crs[i].type == ce) && ((ci >= 0) && (ci < crs[i].ninst)))
00267 {
00268 ret = i;
00269 break;
00270 }
00271 }
00272 return(ret);
00273 }
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 void dbcrst::mark_used(long ic, long csti)
00288 {
00289 if (crs[ic].instu[csti] == 0)
00290 {
00291 crs[ic].ninstu++;
00292 crs[ic].instu[csti]++;
00293 if (crsu[ic] == 0)
00294 {
00295 crsu[ic]++;
00296 ncrsu++;
00297 }
00298 }
00299 }
00300
00301
00302
00303
00304
00305
00306
00307
00308 void dbcrst::renumber_id(void)
00309 {
00310 long i, k, rindex;
00311
00312 for (i = 0; i < numt; i++)
00313 {
00314 if (crs[i].ninstu)
00315 {
00316 rindex = 1;
00317 for (k = 0; k < crs[i].ninst; k++)
00318 {
00319 if (crs[i].instu[k])
00320 {
00321 crs[i].ridx[k] = rindex;
00322 rindex++;
00323 }
00324 }
00325 }
00326 }
00327 }