PageRenderTime 65ms CodeModel.GetById 34ms RepoModel.GetById 0ms app.codeStats 1ms

/sys/src/cmd/NPB3.2.1/NPB3.2-SER/DC/adc.c

https://bitbucket.org/ericvh/hare/
C | 635 lines | 557 code | 34 blank | 44 comment | 75 complexity | e0c50940a1aabf4f473e08a479f5729d MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "adc.h"
  5. #define BlockSize 1024
  6. void swap4(void * num){
  7. char t, *p;
  8. p = (char *) num;
  9. t = *p; *p = *(p + 3); *(p + 3) = t;
  10. t = *(p + 1); *(p + 1) = *(p + 2); *(p + 2) = t;
  11. }
  12. void swap8(void * num){
  13. char t, *p;
  14. p = (char *) num;
  15. t = *p; *p = *(p + 7); *(p + 7) = t;
  16. t = *(p + 1); *(p + 1) = *(p + 6); *(p + 6) = t;
  17. t = *(p + 2); *(p + 2) = *(p + 5); *(p + 5) = t;
  18. t = *(p + 3); *(p + 3) = *(p + 4); *(p + 4) = t;
  19. }
  20. void initADCpar(ADC_PAR *par){
  21. par->ndid=0;
  22. par->dim=5;
  23. par->mnum=1;
  24. par->tuplenum=100;
  25. /* par->isascii=1; */
  26. par->inverse_endian=0;
  27. par->filename="ADC";
  28. par->clss='U';
  29. }
  30. int ParseParFile(char* parfname,ADC_PAR *par);
  31. int GenerateADC(ADC_PAR *par);
  32. typedef struct Factorization{
  33. long int *mlt;
  34. long int *exp;
  35. long int dim;
  36. } Factorization;
  37. void ShowFactorization(Factorization *nmbfct){
  38. int i=0;
  39. for(i=0;i<nmbfct->dim;i++){
  40. if(nmbfct->mlt[i]==1){
  41. if(i==0) fprintf(stderr,"prime.");
  42. break;
  43. }
  44. if(i>0) fprintf(stderr,"*");
  45. if(nmbfct->exp[i]==1)
  46. fprintf(stderr,"%ld",nmbfct->mlt[i]);
  47. else
  48. fprintf(stderr,"%ld^%ld",nmbfct->mlt[i],
  49. nmbfct->exp[i]);
  50. }
  51. fprintf(stderr,"\n");
  52. }
  53. long int adcprime[]={
  54. 421,601,631,701,883,
  55. 419,443,647,21737,31769,
  56. 1427,18353,22817,34337,98717,
  57. 3527,8693,9677,11093,18233};
  58. long int ListFirstPrimes(long int mpr,long int *prlist){
  59. /*
  60. fprintf(stderr,"ListFirstPrimes: listing primes less than %ld...\n",
  61. mpr);
  62. */
  63. long int prnum=0;
  64. int composed=0;
  65. long int nmb=0,j=0;
  66. prlist[prnum++]=2;
  67. prlist[prnum++]=3;
  68. prlist[prnum++]=5;
  69. prlist[prnum++]=7;
  70. for(nmb=8;nmb<mpr;nmb++){
  71. composed=0;
  72. for(j=0;prlist[j]*prlist[j]<=nmb;j++){
  73. if(nmb-prlist[j]*((long int)(nmb/prlist[j]))==0){
  74. composed=1;
  75. break;
  76. }
  77. }
  78. if(composed==0) prlist[prnum++]=nmb;
  79. }
  80. /* fprintf(stderr,"ListFirstPrimes: Done.\n"); */
  81. return prnum;
  82. }
  83. long long int LARGE_NUM=0x4FFFFFFFFFFFFFFFLL;
  84. long long int maxprmfctr=59;
  85. long long int GetLCM(long long int mask,
  86. Factorization **fctlist,
  87. long int *adcexpons){
  88. int i=0,j=0,k=0;
  89. int* expons=(int*) calloc(maxprmfctr+1,sizeof(int));
  90. long long int LCM=1;
  91. long int pr=2;
  92. int genexp=1,lexp=1,fct=2;
  93. for(i=0;i<maxprmfctr+1;i++)expons[i]=0;
  94. i=0;
  95. while(mask>0){
  96. if(mask==2*(mask/2)){
  97. mask=mask>>1;
  98. i++;
  99. continue;
  100. }
  101. pr=adcprime[i];
  102. genexp=adcexpons[i];
  103. /*
  104. fprintf(stderr,"[%ld,%ld]\n",pr,genexp);
  105. ShowFactorization(fctlist[genexp]);
  106. */
  107. for(j=0;j<fctlist[pr-1]->dim;j++){
  108. fct=fctlist[pr-1]->mlt[j];
  109. lexp=fctlist[pr-1]->exp[j];
  110. for(k=0;k<fctlist[genexp]->dim;k++){
  111. if(fctlist[genexp]->mlt[k]==1) break;
  112. if(fct!=fctlist[genexp]->mlt[k]) continue;
  113. lexp-=fctlist[genexp]->exp[k];
  114. break;
  115. }
  116. if(expons[fct]<lexp)expons[fct]=lexp;
  117. }
  118. mask=mask>>1;
  119. i++;
  120. }
  121. /*
  122. for(i=0;i<maxprmfctr;i++){
  123. if(expons[i]>0) fprintf(stderr,"*%ld^%ld",i,expons[i]);
  124. }
  125. fprintf(stderr,"\n");
  126. */
  127. for(i=0;i<=maxprmfctr;i++){
  128. while(expons[i]>0){
  129. LCM*=i;
  130. if(LCM>LARGE_NUM/maxprmfctr) return LCM;
  131. expons[i]--;
  132. }
  133. }
  134. /* fprintf(stderr,"==== %lld\n",LCM); */
  135. free(expons);
  136. return LCM;
  137. }
  138. void ExtendFactors(long int nmb,long int firstdiv,
  139. Factorization *nmbfct,Factorization **fctlist){
  140. Factorization *divfct=fctlist[nmb/firstdiv];
  141. int fdivused=0;
  142. int multnum=0;
  143. int i=0;
  144. /* fprintf(stderr,"==== %lld %ld %ld\n",divfct->dim,nmb,firstdiv); */
  145. for(i=0;i<divfct->dim;i++){
  146. if(divfct->mlt[i]==1){
  147. if(fdivused==0){
  148. nmbfct->mlt[multnum]=firstdiv;
  149. nmbfct->exp[multnum]=1;
  150. }
  151. break;
  152. }
  153. if(divfct->mlt[i]<firstdiv){
  154. nmbfct->mlt[i]=divfct->mlt[i];
  155. nmbfct->exp[i]=divfct->exp[i];
  156. multnum++;
  157. }else if(divfct->mlt[i]==firstdiv){
  158. nmbfct->mlt[i]=divfct->mlt[i];
  159. nmbfct->exp[i]=divfct->exp[i]+1;
  160. fdivused=1;
  161. }else{
  162. int j=i;
  163. if(fdivused==0) j=i+1;
  164. nmbfct->mlt[j]=divfct->mlt[i];
  165. nmbfct->exp[j]=divfct->exp[i];
  166. }
  167. }
  168. }
  169. void GetFactorization(long int prnum,long int *prlist,
  170. Factorization **fctlist){
  171. /*fprintf(stderr,"GetFactorization: factorizing first %ld numbers.\n",
  172. prnum);*/
  173. long int i=0,j=0;
  174. Factorization *fct=(Factorization*)malloc(2*sizeof(Factorization));
  175. long int len=0,isft=0,div=1,firstdiv=1;
  176. fct->dim=2;
  177. fct->mlt=(long int*)malloc(2*sizeof(long int));
  178. fct->exp=(long int*)malloc(2*sizeof(long int));
  179. for(i=0;i<fct->dim;i++){
  180. fct->mlt[i]=1;
  181. fct->exp[i]=0;
  182. }
  183. fct->mlt[0]=2;
  184. fct->exp[0]=1;
  185. fctlist[2]=fct;
  186. fct=(Factorization*)malloc(2*sizeof(Factorization));
  187. fct->dim=2;
  188. fct->mlt=(long int*)malloc(2*sizeof(long int));
  189. fct->exp=(long int*)malloc(2*sizeof(long int));
  190. for(i=0;i<fct->dim;i++){
  191. fct->mlt[i]=1;
  192. fct->exp[i]=0;
  193. }
  194. fct->mlt[0]=3;
  195. fct->exp[0]=1;
  196. fctlist[3]=fct;
  197. for(i=0;i<prlist[prnum-1];i++){
  198. len=0;
  199. isft=i;
  200. while(isft>0){
  201. len++;
  202. isft=isft>>1;
  203. }
  204. fct=(Factorization*)malloc(2*sizeof(Factorization));
  205. fct->dim=len;
  206. fct->mlt=(long int*)malloc(len*sizeof(long int));
  207. fct->exp=(long int*)malloc(len*sizeof(long int));
  208. for(j=0;j<fct->dim;j++){
  209. fct->mlt[j]=1;
  210. fct->exp[j]=0;
  211. }
  212. div=1;
  213. for(j=0;prlist[j]*prlist[j]<=i;j++){
  214. firstdiv=prlist[j];
  215. if(i-firstdiv*((long int)i/firstdiv)==0){
  216. div=firstdiv;
  217. if(firstdiv*firstdiv==i){
  218. fct->mlt[0]=firstdiv;
  219. fct->exp[0]=2;
  220. }else{
  221. ExtendFactors(i,firstdiv,fct,fctlist);
  222. }
  223. break;
  224. }
  225. }
  226. if(div==1){
  227. fct->mlt[0]=i;
  228. fct->exp[0]=1;
  229. }
  230. fctlist[i]=fct;
  231. /*
  232. ShowFactorization(fct);
  233. */
  234. }
  235. /* fprintf(stderr,"GetFactorization: Done.\n"); */
  236. }
  237. long int adcexp[]={
  238. 11,13,17,19,23,
  239. 23,29,31,37,41,
  240. 41,43,47,53,59,
  241. 3,5,7,11,13};
  242. long int adcexpS[]={
  243. 11,13,17,19,23};
  244. long int adcexpW[]={
  245. 2*2,2*2*2*5,2*3,2*2*5,2*3*7,
  246. 23,29,31,2*2,2*2*19};
  247. long int adcexpA[]={
  248. 2*2,2*2*2*5,2*3,2*2*5,2*3*7,
  249. 2*19,2*13,2*19,2*2*2*13*19,2*2*2*19*19,
  250. 2*23,2*2*2*2,2*2*2*2*2*23,2*2*2*2*2,2*2*23};
  251. long int adcexpB[]={
  252. 2*2*7,2*2*2*5,2*3*7,2*2*5*7,2*3*7*7,
  253. 2*19,2*13,2*19,2*2*2*13*19,2*2*2*19*19,
  254. 2*31,2*2*2*2*31,2*2*2*2*2*31,2*2*2*2*2*29,2*2*29,
  255. 2*43,2*2,2*2,2*2*47,2*2*2*43};
  256. long int UpPrimeLim=100000;
  257. typedef struct dc_view{
  258. long long int vsize;
  259. long int vidx;
  260. } DC_view;
  261. int CompareSizesByValue( const void* sz0, const void* sz1) {
  262. long long int *size0=(long long int*)sz0,
  263. *size1=(long long int*)sz1;
  264. int res=0;
  265. if(*size0-*size1>0) res=1;
  266. else if(*size0-*size1<0) res=-1;
  267. return res;
  268. }
  269. int CompareViewsBySize( const void* vw0, const void* vw1) {
  270. DC_view *lvw0=(DC_view *)vw0, *lvw1=(DC_view *)vw1;
  271. int res=0;
  272. if(lvw0->vsize>lvw1->vsize) res=1;
  273. else if(lvw0->vsize<lvw1->vsize) res=-1;
  274. else if(lvw0->vidx>lvw1->vidx) res=1;
  275. else if(lvw0->vidx<lvw1->vidx) res=-1;
  276. return res;
  277. }
  278. int CalculateVeiwSizes(ADC_PAR *par){
  279. unsigned long long totalInBytes = 0;
  280. unsigned long long nViewDims, nCubeTuples = 0;
  281. const char *adcfname=par->filename;
  282. int NDID=par->ndid;
  283. char clss=par->clss;
  284. int dcdim=par->dim;
  285. long long int tnum=par->tuplenum;
  286. long long int i=0,j=0;
  287. Factorization
  288. **fctlist=(Factorization **) calloc(UpPrimeLim,sizeof(Factorization *));
  289. long int *prlist=(long int *) calloc(UpPrimeLim,sizeof(long int));
  290. int prnum=ListFirstPrimes(UpPrimeLim,prlist);
  291. DC_view *dcview=(DC_view *)calloc((1<<dcdim),sizeof(DC_view));
  292. const char* vszefname0;
  293. char *vszefname=NULL;
  294. FILE* view=NULL;
  295. int minvn=1, maxvn=(1<<dcdim), vinc=1;
  296. long idx=0;
  297. GetFactorization(prnum,prlist,fctlist);
  298. for(i=1;i<(1<<dcdim);i++){
  299. long long int LCM=1;
  300. switch(clss){
  301. case 'U':
  302. LCM=GetLCM(i,fctlist,adcexp);
  303. break;
  304. case 'S':
  305. LCM=GetLCM(i,fctlist,adcexpS);
  306. break;
  307. case 'W':
  308. LCM=GetLCM(i,fctlist,adcexpW);
  309. break;
  310. case 'A':
  311. LCM=GetLCM(i,fctlist,adcexpA);
  312. break;
  313. case 'B':
  314. LCM=GetLCM(i,fctlist,adcexpB);
  315. break;
  316. }
  317. if(LCM>tnum) LCM=tnum;
  318. dcview[i].vsize=LCM;
  319. dcview[i].vidx=i;
  320. }
  321. for(i=0;i<UpPrimeLim;i++){
  322. if(!fctlist[i]) continue;
  323. if(fctlist[i]->mlt) free(fctlist[i]->mlt);
  324. if(fctlist[i]->exp) free(fctlist[i]->exp);
  325. free(fctlist[i]);
  326. }
  327. free(fctlist);
  328. free(prlist);
  329. vszefname0="view.sz";
  330. vszefname=(char*)calloc(BlockSize,sizeof(char));
  331. sprintf(vszefname,"%s.%s.%d",adcfname,vszefname0,NDID);
  332. if(!(view = fopen(vszefname, "w+")) ) {
  333. fprintf(stderr,"CalculateVeiwSizes: Can't open file: %s\n",vszefname);
  334. return 0;
  335. }
  336. qsort( dcview, (1<<dcdim), sizeof(DC_view),CompareViewsBySize);
  337. switch(clss){
  338. case 'U':
  339. vinc=1<<3;
  340. break;
  341. case 'S':
  342. break;
  343. case 'W':
  344. break;
  345. case 'A':
  346. vinc=1<<6;
  347. break;
  348. case 'B':
  349. vinc=1<<14;
  350. break;
  351. }
  352. for(i=minvn;i<maxvn;i+=vinc){
  353. nViewDims = 0;
  354. fprintf(view,"Selection:");
  355. idx=dcview[i].vidx;
  356. for(j=0;j<dcdim;j++)
  357. if((idx>>j)&0x1==1) { fprintf(view," %lld",j+1); nViewDims++;}
  358. fprintf(view,"\nView Size: %lld\n",dcview[i].vsize);
  359. totalInBytes += (8+4*nViewDims)*dcview[i].vsize;
  360. nCubeTuples += dcview[i].vsize;
  361. }
  362. fprintf(view,"\nTotal in bytes: %lld Number of tuples: %lld\n",
  363. totalInBytes, nCubeTuples);
  364. fclose(view);
  365. free(dcview);
  366. fprintf(stderr,"View sizes are written into %s\n",vszefname);
  367. free(vszefname);
  368. return 1;
  369. }
  370. int ParseParFile(char* parfname,ADC_PAR *par){
  371. char line[BlockSize];
  372. FILE* parfile=NULL;
  373. char* pos=strchr(parfname,'.');
  374. int linenum=0,i=0;
  375. const char *kwd;
  376. if(!(parfile = fopen(parfname, "r")) ) {
  377. fprintf(stderr,"ParseParFile: Can't open file: %s\n",parfname);
  378. return 0;
  379. }
  380. if(pos) pos=strchr(pos+1,'.');
  381. if(pos) sscanf(pos+1,"%d",&(par->ndid));
  382. linenum=0;
  383. while(fgets(&line[0],BlockSize,parfile)){
  384. i=0;
  385. kwd=adcKeyword[i];
  386. while(kwd){
  387. if(strstr(line,"#")) {
  388. ;/*comment line, do nothing*/
  389. }else if(strstr(line,kwd)){
  390. char *pos=line+strlen(kwd)+1;
  391. switch(i){
  392. case 0:
  393. sscanf(pos,"%d",&(par->dim));
  394. break;
  395. case 1:
  396. sscanf(pos,"%d",&(par->mnum));
  397. break;
  398. case 2:
  399. sscanf(pos,"%lld",&(par->tuplenum));
  400. break;
  401. case 3:
  402. /* sscanf(pos,"%d",&(par->isascii)); */
  403. break;
  404. case 4:
  405. sscanf(pos,"%d",&(par->inverse_endian));
  406. break;
  407. case 5:
  408. par->filename=(char*) malloc(strlen(pos)*sizeof(char));
  409. sscanf(pos,"%s",par->filename);
  410. break;
  411. case 6:
  412. sscanf(pos,"%c",&(par->clss));
  413. break;
  414. }
  415. break;
  416. }
  417. i++;
  418. kwd=adcKeyword[i];
  419. }
  420. linenum++;
  421. }
  422. fclose(parfile);
  423. switch(par->clss){/* overwriting parameters according the class */
  424. case 'S':
  425. par->dim=5;
  426. par->mnum=1;
  427. par->tuplenum=1000;
  428. break;
  429. case 'W':
  430. par->dim=10;
  431. par->mnum=1;
  432. par->tuplenum=100000;
  433. break;
  434. case 'A':
  435. par->dim=15;
  436. par->mnum=1;
  437. par->tuplenum=1000000;
  438. break;
  439. case 'B':
  440. par->dim=20;
  441. par->mnum=1;
  442. par->tuplenum=10000000;
  443. break;
  444. }
  445. return 1;
  446. }
  447. int WriteADCPar(ADC_PAR *par,char* fname){
  448. char *lname=(char*) calloc(BlockSize,sizeof(char));
  449. FILE *parfile=NULL;
  450. sprintf(lname,"%s",fname);
  451. parfile=fopen(lname,"w");
  452. if(!parfile){
  453. fprintf(stderr,"WriteADCPar: can't open file %s\n",lname);
  454. return 0;
  455. }
  456. fprintf(parfile,"attrNum=%ld\n",par->dim);
  457. fprintf(parfile,"measuresNum=%ld\n",par->mnum);
  458. fprintf(parfile,"tuplesNum=%lld\n",par->tuplenum);
  459. fprintf(parfile,"class=%c\n",par->clss);
  460. /* fprintf(parfile,"isASCII=%d\n",par->isascii); */
  461. fprintf(parfile,"INVERSE_ENDIAN=%d\n",par->inverse_endian);
  462. fprintf(parfile,"fileName=%s\n",par->filename);
  463. fclose(parfile);
  464. return 1;
  465. }
  466. void ShowADCPar(ADC_PAR *par){
  467. fprintf(stderr,"********************* ADC paramters\n");
  468. fprintf(stderr," id %ld\n",par->ndid);
  469. fprintf(stderr," attributes %ld\n",par->dim);
  470. fprintf(stderr," measures %ld\n",par->mnum);
  471. fprintf(stderr," tuples %lld\n",par->tuplenum);
  472. fprintf(stderr," class \t%c\n",par->clss);
  473. fprintf(stderr," filename %s\n",par->filename);
  474. fprintf(stderr,"***********************************\n");
  475. }
  476. long int adcgen[]={
  477. 2,7,3,2,2,
  478. 2,2,5,31,7,
  479. 2,3,3,3,2,
  480. 5,2,2,2,3};
  481. int GetNextTuple(int dcdim, int measnum,
  482. long long int* attr,long long int* meas,
  483. char clss){
  484. static int tuplenum=0;
  485. static const int maxdim=20;
  486. static int measbound=31415;
  487. int i=0,j=0;
  488. int maxattr=0;
  489. static long int seed[20];
  490. long int *locexp=NULL;
  491. if(dcdim>maxdim){
  492. fprintf(stderr,"GetNextTuple: number of dcdim is too large:%ld",
  493. dcdim);
  494. return 0;
  495. }
  496. if(measnum>measbound){
  497. fprintf(stderr,"GetNextTuple: number of mes is too large:%ld",
  498. measnum);
  499. return 0;
  500. }
  501. locexp=adcexp;
  502. switch(clss){
  503. case 'S':
  504. locexp=adcexpS;
  505. break;
  506. case 'W':
  507. locexp=adcexpW;
  508. break;
  509. case 'A':
  510. locexp=adcexpA;
  511. break;
  512. case 'B':
  513. locexp=adcexpB;
  514. break;
  515. }
  516. if(tuplenum==0){
  517. for(i=0;i<maxdim;i++){
  518. int tmpgen=adcgen[i];
  519. for(j=0;j<locexp[i]-1;j++){
  520. tmpgen*=adcgen[i];
  521. tmpgen=tmpgen%adcprime[i];
  522. }
  523. adcgen[i]=tmpgen;
  524. }
  525. fprintf(stderr,"Prime \t Generator \t Seed\n");
  526. for(i=0;i<dcdim;i++){
  527. seed[i]=(adcprime[i]+1)/2;
  528. fprintf(stderr,"%ld \t %ld \t\t %ld \n",adcprime[i],adcgen[i],seed[i]);
  529. }
  530. }
  531. tuplenum++;
  532. maxattr=0;
  533. for(i=0;i<dcdim;i++){
  534. attr[i]=seed[i]*adcgen[i];
  535. attr[i]-=adcprime[i]*((long long int)attr[i]/adcprime[i]);
  536. seed[i]=attr[i];
  537. if(seed[i]>maxattr) maxattr=seed[i];
  538. }
  539. for(i=0;i<measnum;i++){
  540. meas[i]=(long long int)(seed[i]*maxattr);
  541. meas[i]-=measbound*(meas[i]/measbound);
  542. }
  543. return 1;
  544. }
  545. int GenerateADC(ADC_PAR *par){
  546. int dcdim=par->dim,
  547. mesnum=par->mnum,
  548. tplnum=par->tuplenum;
  549. char *adcfname=(char*)calloc(BlockSize,sizeof(char));
  550. FILE *adc;
  551. int i=0,j=0;
  552. long long int* attr=NULL,*mes=NULL;
  553. /*
  554. if(par->isascii==1){
  555. sprintf(adcfname,"%s.tpl.%d",par->filename,par->ndid);
  556. if(!(adc = fopen(adcfname, "w+"))) {
  557. fprintf(stderr,"GenerateADC: Can't open file: %s\n",adcfname);
  558. return 0;
  559. }
  560. }else{
  561. */
  562. sprintf(adcfname,"%s.dat.%d",par->filename,par->ndid);
  563. if(!(adc = fopen(adcfname, "wb+"))){
  564. fprintf(stderr,"GenerateADC: Can't open file: %s\n",adcfname);
  565. return 0;
  566. }
  567. /* } */
  568. attr=(long long int *)malloc(dcdim*sizeof(long long int));
  569. mes=(long long int *)malloc(mesnum*sizeof(long long int));
  570. fprintf(stderr,"\nGenerateADC: writing %ld tuples of %ld attributes and %ld measures to %s\n",
  571. tplnum,dcdim,mesnum,adcfname);
  572. for(i=0;i<tplnum;i++){
  573. if(!GetNextTuple(dcdim,mesnum,attr,mes,par->clss)) return 0;
  574. /*
  575. if(par->isascii==1){
  576. for(int j=0;j<dcdim;j++)fprintf(adc,"%lld ",attr[j]);
  577. for(int j=0;j<mesnum;j++)fprintf(adc,"%lld ",mes[j]);
  578. fprintf(adc,"\n");
  579. }else{
  580. */
  581. for(j=0;j<mesnum;j++){
  582. long long mv = mes[j];
  583. if(par->inverse_endian==1) swap8(&mv);
  584. fwrite(&mv, 8, 1, adc);
  585. }
  586. for(j=0;j<dcdim;j++){
  587. int av = attr[j];
  588. if(par->inverse_endian==1) swap4(&av);
  589. fwrite(&av, 4, 1, adc);
  590. }
  591. }
  592. /* } */
  593. fclose(adc);
  594. fprintf(stderr,"Binary ADC file %s ",adcfname);
  595. fprintf(stderr,"have been generated.\n");
  596. free(attr);
  597. free(mes);
  598. free(adcfname);
  599. CalculateVeiwSizes(par);
  600. return 1;
  601. }