TheBoussinesqModel  3.2.1
 All Data Structures Files Functions Variables Typedefs Macros Pages
key.palette.c
Go to the documentation of this file.
1 
2 /* KeyPalette MANAGES THE I/O FILES OF A MODEL
3 KeyPalette Version 0.9375 KMackenzie
4 
5 file key.palette.c
6 
7 Copyright, 2009 Emanuele Cordano and Riccardo Rigon
8 
9 This file is part of KeyPalette.
10  KeyPalette is free software: you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  KeyPalette is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with this program. If not, see <http://www.gnu.org/licenses/>.
22 */
23 
24 
25 #include "turtle.h"
26 
27 
28 
29 #include "tensor3D.h"
30 //#include "networks.h"
31 #include "t_utilities.h"
32 #include "key.palette.h"
33 
34 #define REFK "_to_"
35 
36 KEYWORDS *read_keywords (FILE *init, short print) {
37 
60 KEYWORDS *keywords;
61 
62 
63 
64 STRINGBIN *stringarray;
65 
66 LONGVECTOR *vname, *vcomment;
67 
68 long nrows,kj;
69 
70 
71 keywords=(KEYWORDS *)malloc(sizeof(KEYWORDS));
72 if (!keywords) t_error("Keywords struct was not allocated");
73 
74 
75 stringarray=read_stringarray(init,print);
76 
77 
78 if (stringarray->index->nh%2==0) {
79  nrows=stringarray->index->nh/2;
80 
81 }else{
82  t_error("Missing string (keywords or comment!!) in the *.init or *.inpts file ");
83  return NULL;
84 
85 }
86 
87 vname=new_longvector(nrows);
88 vcomment=new_longvector(nrows);
89 
90 for (kj=vname->nl;kj<=nrows;kj++){
91  vname->element[kj]=stringarray->index->element[2*kj-1];
92  vcomment->element[kj]=stringarray->index->element[2*kj];
93 // printf("\n vcom= %d \n",vcomment->element[kj]);
94 }
95 
96 keywords->names=new_stringbin(vname);
97 keywords->comments=new_stringbin(vcomment);
98 
99 
100 for (kj=1;kj<=nrows;kj++){
101 
102  strcpy(keywords->comments->element[kj]+1,stringarray->element[2*kj]+1);
103  strcpy(keywords->names->element[kj]+1,stringarray->element[2*kj-1]+1);
104 
105 
106 }
107 
108 free_stringbin(stringarray);
109 free_longvector(vname);
110 free_longvector(vcomment);
111 
112 
113 if (!keywords) t_error(" Function read_keywords did not work !!");
114 return keywords;
115 
116 
117 
118 
119 
120 
121 }
122 
123 
124 KEYWORDS_LIST *read_keywords_list (char *filename, short print){
125 
155  FILE *fd;
156  KEYWORDS_LIST* array;
157 
158  long index,j,nl,nh;
159 
160 
161  fd=t_fopen(filename,"r");
162  index=read_index(fd,print);
163  array=(KEYWORDS_LIST *)malloc(sizeof(KEYWORDS_LIST));
164  if (!array) t_error("Keywords_list struct was not allocated");
165 
166  nl=NL;
167  nh=index;
168  array->element=(KEYWORDS **)malloc((size_t)((nh-nl+1+NR_END)*sizeof(KEYWORDS *)));
169  array->isdynamic=isDynamic;
170  array->nh=nh;
171  array->nl=nl;
172 
173  for (j=nl;j<=nh;j++){
174  array->element[j]=read_keywords(fd,print);
175  }
176 
177  return array;
178 
179 
180  t_fclose(fd);
181 
182 }
183 
184 void write_keywords(KEYWORDS *keywords){
185 
198  long kcount;
199 
200  printf ("\n HERE ARE WRITTEN THE FOLLOWING KEYWORDS : \n ");
201 
202  for (kcount=keywords->names->index->nl;kcount<=keywords->names->index->nh;kcount++){
203 
204  printf ("\nkeyword n %ld : %s as %s \n ",kcount,keywords->names->element[kcount]+1,keywords->comments->element[kcount]+1);
205 
206  }
207 
208  printf("\n");
209 
210 
211 }
212 
213 
214 
215 
217 
218 
235  long kcount;
236 
237 
238  if (filenames->index->nh!=comments->index->nh) {
239 
240  t_error("Error in write_read_filenames: there is no correspondence between comments and keyword files");
241  }else{
242 
243  printf ("THE PROGRAM HAS JUST READ THE FOLLOWING FILENAMES: \n ");
244 
245  for (kcount=filenames->index->nl;kcount<=filenames->index->nh;kcount++){
246  // if (strcmp(filenames->element[kcount]+1,NOFILE_NAME))
247  printf ("\nREAD FILENAME: %s as file %ld i.e. %s",filenames->element[kcount]+1,kcount,comments->element[kcount]+1);
248 
249  }
250 
251  printf("\n");
252 
253 
254  }
255 
256  }
257 
258 
259 KEYWORDS_LIST *reorder_keywords_list(KEYWORDS_LIST *written_palette, STRINGBIN *keywords_model, long jread, char *empty_name) {
260 
261 
287  KEYWORDS_LIST *palette;
288 
289  LONGVECTOR *lennames;
290  LONGVECTOR *keyreferences;
291  LONGVECTOR *vi,*wi;
292  long keycnt,namescnt,j;
293  char *key_ref, *key_written;
294 
295  palette=(KEYWORDS_LIST *)malloc(sizeof(KEYWORDS_LIST));
296  if (!palette) t_error("Keywords_list struct palette was not allocated");
297 
298  palette->nl=keywords_model->index->nl;
299  palette->nh=keywords_model->index->nh;
300  palette->element=(KEYWORDS **)malloc((size_t)((keywords_model->index->nh-keywords_model->index->nl+1+NR_END)*sizeof(KEYWORDS *)));
301  palette->isdynamic=isDynamic;
302 
303  lennames=new_longvector(keywords_model->index->nh);
304  keyreferences=new_longvector(keywords_model->index->nh);
305  for (keycnt=keywords_model->index->nl;keycnt<=keywords_model->index->nh;keycnt++){
306 
307  key_ref=keywords_model->element[keycnt]+1;
308 
309  lennames->element[keycnt]=(long)strlen(empty_name);
310  keyreferences->element[keycnt]=EMPTY_VALUE;
311 
312  for (namescnt=written_palette->nl;namescnt<=written_palette->nh;namescnt++){
313 
314  key_written=written_palette->element[namescnt]->names->element[jread]+1;
315 
316  if (!strcmp(key_ref,key_written)) keyreferences->element[keycnt]=namescnt;
317 
318 
319  }
320 
321  }
322 
323  for (keycnt=keywords_model->index->nl;keycnt<=keywords_model->index->nh;keycnt++){
324 
325  palette->element[keycnt]=(KEYWORDS *)malloc(sizeof(KEYWORDS *));
326  if (!palette->element[keycnt]) t_error("Keywords palette->element[j] was not allocated");
327 
328  if (keyreferences->element[keycnt]==EMPTY_VALUE) {
329  vi=new_longvector(2);
330  wi=new_longvector(2);
331 
332  vi->element[1]=(long)strlen(keywords_model->element[keycnt]+1)+1;
333  vi->element[2]=(long)strlen(empty_name)+1;
334  wi->element[1]=(long)strlen(empty_name)+1;
335  wi->element[2]=(long)strlen(empty_name)+1;
336 
337  palette->element[keycnt]->names=new_stringbin(vi);
338  palette->element[keycnt]->comments=new_stringbin(wi);
339 
340  strcpy(palette->element[keycnt]->names->element[1]+1,keywords_model->element[keycnt]+1);
341  strcpy(palette->element[keycnt]->comments->element[1]+1,empty_name);
342 
343  strcpy(palette->element[keycnt]->names->element[2]+1,empty_name);
344  strcpy(palette->element[keycnt]->comments->element[2]+1,empty_name);
345 
346  free_longvector(vi);
347  free_longvector(wi);
348 
349  }else {
350 
351  palette->element[keycnt]->names=new_stringbin(written_palette->element[keyreferences->element[keycnt]]->names->index);
352  palette->element[keycnt]->comments=new_stringbin(written_palette->element[keyreferences->element[keycnt]]->comments->index);
353 
354  for (j=palette->element[keycnt]->names->index->nl;j<=palette->element[keycnt]->names->index->nh;j++){
355  strcpy(palette->element[keycnt]->names->element[j]+1,written_palette->element[keyreferences->element[keycnt]]->names->element[j]+1);
356  strcpy(palette->element[keycnt]->comments->element[j]+1,written_palette->element[keyreferences->element[keycnt]]->comments->element[j]+1);
357 
358  }
359 
360  }
361 
362  }
363 
364  free_longvector(keyreferences);
365  free_longvector(lennames);
366 
367 
368 
369  return palette;
370 
371 
372  }
373 
374 
375 
376 KEYWORDS_LIST *read_and_reorder_keywords_list(char *filename, STRINGBIN *keywords_model, long jread, char *empty_name,short print){
377 
378 
400  KEYWORDS_LIST *keylist1, *keylist2;
401 
402  keylist1=read_keywords_list(filename,print);
403 
404  keylist2=reorder_keywords_list(keylist1,keywords_model,jread,empty_name);
405 
406  free_keywords_list(keylist1);
407 
408  return keylist2;
409 
410 
411 }
412 
413 
414 void free_keywords_list(KEYWORDS_LIST* keywords_list){
415 
416 
433  long jj;
434  for (jj=keywords_list->nl;jj<=keywords_list->nh;jj++) {
435  free_keywords(keywords_list->element[jj]);
436  }
437 
438  free(keywords_list);
439 }
440 
441 
442 
443 
444 
445 
446 
447 void free_keywords(KEYWORDS *keywords) {
448 
465  free_stringbin(keywords->names);
466  free_stringbin(keywords->comments);
467 
468  free(keywords);
469 
470 }
471 
472 
473 
474 
475  STRINGBIN *read_names(FILE *fd, STRINGBIN *keywords, char *empty_name,short print) {
476 
477 
478 
508  KEYWORDS *written_names;
509  /* WARNING: the comment of a keyword a generic comment,
510  * the comment of a filename is a keyword !!! */
511  LONGVECTOR *lennames;
512  LONGVECTOR *keyreferences;
513  char *empty_name_extended;
514 
515 
516 
517 
518 
519 
520  STRINGBIN *names;
521 
522  long keycnt,namescnt;
523 
524  char *key_written, *key_ref;
525  char *empty_name_temp;
526  written_names=read_keywords(fd,print);
527 
528  lennames=new_longvector(keywords->index->nh);
529  keyreferences=new_longvector(keywords->index->nh);
530  empty_name_temp=join_strings(empty_name,REFK);
531  for (keycnt=keywords->index->nl; keycnt<=keywords->index->nh;keycnt++) {
532 
533  key_ref=keywords->element[keycnt]+1;
534  empty_name_extended=join_strings(empty_name_temp,keywords->element[keycnt]+1);
535  lennames->element[keycnt]=(long)strlen(empty_name_extended)+1;
536  free(empty_name_extended);
537  keyreferences->element[keycnt]=EMPTY_VALUE;
538 
539 
540 
541  for (namescnt=written_names->comments->index->nl;namescnt<=written_names->comments->index->nh;namescnt++){
542 
543  key_written=written_names->comments->element[namescnt]+1;
544 // printf ("\n keycnt= %d namescnt= %d \n ",keycnt,namescnt);
545 // printf(key_ref);
546 // printf("\n and \n");
547 // printf(key_written);
548 // printf("\n");
549 
550  if (!strcmp(key_ref,key_written)) {
551 // printf ("\n keycnt= %d namescnt= %d \n ",keycnt,namescnt);
552 
553  lennames->element[keycnt]=written_names->names->index->element[namescnt];
554  keyreferences->element[keycnt]=namescnt;
555 
556  }
557  }
558 
559  }
560  names=new_stringbin(lennames);
561 
562  for (keycnt=names->index->nl;keycnt<=names->index->nh;keycnt++){
563  if (keyreferences->element[keycnt]==EMPTY_VALUE) {
564 
565  empty_name_extended=join_strings(empty_name_temp,keywords->element[keycnt]+1);
566  strcpy(names->element[keycnt]+1,empty_name_extended);
567  free(empty_name_extended);
568  }else {
569  strcpy(names->element[keycnt]+1,written_names->names->element[keyreferences->element[keycnt]]+1);
570  }
571 
572  }
573 
574  free_longvector(lennames);
575  free_longvector(keyreferences);
576  free_keywords(written_names);
577  //free(key_ref);
578  //free(key_written);
579 
580  free(empty_name_temp);
581  return names;
582 
583 
584  }
585 
586 
587  STRINGBIN *join_path_to_stringbin(char *path, STRINGBIN *stringvector,char *no_joinstring) {
588 
589 
590  /*
591  STRINGBIN *join_path_to_stringbin(char *path, STRINGBIN *stringvector)
592 
593  \brief It adds a string to each element of a stringbin
594  \author Emanuele Cordano
595 
596  \date 5 March 2008
597 
598  */
599 
600  LONGVECTOR *lenstring;
601 
602  STRINGBIN *joinedstring;
603  long i;
604  char *str;
605 
606  lenstring=new_longvector(stringvector->index->nh);
607  for (i=lenstring->nl;i<=lenstring->nh;i++) {
608  if (!strcmp(stringvector->element[i]+1,no_joinstring)) {
609  lenstring->element[i]=(long)strlen(stringvector->element[i]+1)+1;
610  } else {
611  str=join_strings(path,stringvector->element[i]+1);
612  lenstring->element[i]=(long)strlen(str)+1;
613  free(str);
614  }
615  }
616  joinedstring=new_stringbin(lenstring);
617  for (i=lenstring->nl;i<=lenstring->nh;i++) {
618  if (!strcmp(stringvector->element[i]+1,no_joinstring)) {
619  strcpy(joinedstring->element[i]+1,stringvector->element[i]+1);
620  } else {
621  str=join_strings(path,stringvector->element[i]+1);
622  strcpy(joinedstring->element[i]+1,str);
623  free(str);
624  }
625 
626  }
627  free_longvector(lenstring);
628 
629  return joinedstring;
630 
631 
632  }