PIPS
print.c
Go to the documentation of this file.
1 /*
2 
3  $Id: print.c 23180 2016-09-09 12:37:41Z irigoin $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 /* Main C functions to print code, sequential or parallel
28  */
29 
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <string.h>
33 
34 #include "genC.h"
35 #include "linear.h"
36 
37 #include "misc.h"
38 #include "pipsdbm.h"
39 #include "properties.h"
40 
41 #include "ri-util.h"
42 #include "text-util.h"
43 
44 #include "top-level.h" // *_EXT macros
45 
46 #include "prettyprint.h"
47 
48 /******************************************************************** UTILS */
49 // THESE FUNCTIONS SHOULD BE ELSEWHERE?
50 
51 /* generate resource res_name for module mod_name with prefix file_ext
52  * as the text provided. it should be made clear who is to free the
53  * texte structure. currently it looks like a massive memory leak.
54  */
56  const char* mod_name, /* module name */
57  const char* res_name, /* resource name [DBR_...] */
58  const char* file_ext, /* file extension */
59  text texte /* text to be printed as this resource */)
60 {
61  string filename, localfilename, dir;
62  FILE *fd;
63 
64  localfilename = db_build_file_resource_name(res_name, mod_name, file_ext);
66  filename = strdup(concatenate(dir, "/", localfilename, NULL));
67  free(dir);
68 
69  fd = safe_fopen(filename, "w");
70  debug_on("PRETTYPRINT_DEBUG_LEVEL");
71  print_text(fd, texte);
72  debug_off();
73  safe_fclose(fd, filename);
74 
75  DB_PUT_FILE_RESOURCE(res_name, mod_name, localfilename);
76  write_an_attachment_file(filename);
77  free(filename);
78 
79  return true;
80 }
81 
83  const char* mod_name,
84  const char* res_name,
85  const char* file_ext,
86  text t)
87 {
88  bool ok = make_text_resource(mod_name, res_name, file_ext, t);
89  free_text(t);
90  return ok;
91 }
92 
93 static bool is_user_view; /* print_code or print_source */
94 
96 {
97  return is_user_view;
98 }
99 
100 
101 /* Generic function to prettyprint some sequential or parallel code, or
102  even user view for the given module. */
103 bool print_code_or_source(string mod_name) {
104  bool success = false;
105  text r = make_text(NIL);
106  entity module;
108  string pp;
109  bool print_graph_p = get_bool_property("PRETTYPRINT_UNSTRUCTURED_AS_A_GRAPH");
110  string resource_name =
111  strdup(print_graph_p ? DBR_GRAPH_PRINTED_FILE
112  : (is_user_view ? DBR_PARSED_PRINTED_FILE
113  : DBR_PRINTED_FILE));
114  string file_ext = string_undefined;
115 
116  /* FI: This test could be moved up in pipsmake? */
118  /* FI: Should be a pips_internal_error() as pipsmake is here to
119  avoid this very problem... */
120  pips_user_error("Module \"\%s\"\n not found", mod_name);
121  return false;
122  }
123 
124  /*
125  * Set the current language
126  */
128  if(value_code_p(mv)) {
129  code c = value_code(mv);
131  }
132 
133  switch(get_prettyprint_language_tag()) {
134  case is_language_fortran:
135  file_ext = strdup(concatenate(is_user_view ? PRETTYPRINT_FORTRAN_EXT
136  : PREDICAT_FORTRAN_EXT,
137  print_graph_p ? GRAPH_FILE_EXT : "",
138  NULL));
139  break;
140  case is_language_c:
141  file_ext = strdup(concatenate(is_user_view ? PRETTYPRINT_C_EXT
142  : PREDICAT_C_EXT,
143  print_graph_p ? GRAPH_FILE_EXT : "",
144  NULL));
145  break;
147  file_ext = strdup(concatenate(is_user_view ? PRETTYPRINT_F95_EXT
148  : PREDICAT_F95_EXT,
149  print_graph_p ? GRAPH_FILE_EXT : "",
150  NULL));
151  break;
152  default:
153  pips_internal_error("Language unknown !");
154  break;
155  }
156 
158 
159  /* Since we want to prettyprint with a sequential syntax, save the
160  PRETTYPRINT_PARALLEL property that may select the parallel output
161  style before overriding it: */
162  pp = strdup(get_string_property("PRETTYPRINT_PARALLEL"));
163  /* Select the default prettyprint style for sequential prettyprint: */
164  set_string_property("PRETTYPRINT_PARALLEL",
165  get_string_property("PRETTYPRINT_SEQUENTIAL_STYLE"));
166 
168  : DBR_CODE,
169  mod_name,
170  true);
171 
173 
174  debug_on("PRETTYPRINT_DEBUG_LEVEL");
175 
179  success = make_text_resource(mod_name, resource_name, file_ext, r);
181 
182  debug_off();
183 
184  /* Restore the previous PRETTYPRINT_PARALLEL property for the next
185  parallel code prettyprint: */
186  set_string_property("PRETTYPRINT_PARALLEL", pp);
187  free(pp);
188 
191 
192  free_text(r);
194  free(file_ext);
195 
196  return success;
197 }
198 
199 
200 /* Build a textual resource for a parallel code using a string optional
201  parallel style (dialect such as "f90", "doall", "hpf", "omp" */
203  const char* mod_name,
204  const char* style)
205 {
206  bool success = false;
207  text r = make_text(NIL);
208  entity module = module_name_to_entity(mod_name);
210  string pp = string_undefined;
211 
213 
214  if (style) {
215  pp = strdup(get_string_property("PRETTYPRINT_PARALLEL"));
216  set_string_property("PRETTYPRINT_PARALLEL", style);
217  }
218 
220 
222 
223  mod_stat = (statement)
224  db_get_memory_resource(DBR_PARALLELIZED_CODE, mod_name, true);
225 
226  debug_on("PRETTYPRINT_DEBUG_LEVEL");
228  debug_off();
229 
231 
232  switch(get_prettyprint_language_tag()) {
233  case is_language_fortran:
234  success = make_text_resource(mod_name,
235  DBR_PARALLELPRINTED_FILE,
236  PARALLEL_FORTRAN_EXT,
237  r);
238  break;
239  case is_language_c:
240  success = make_text_resource(mod_name,
241  DBR_PARALLELPRINTED_FILE,
242  PARALLEL_C_EXT,
243  r);
244  break;
246  success = make_text_resource(mod_name,
247  DBR_PARALLELPRINTED_FILE,
248  PARALLEL_FORTRAN95_EXT,
249  r);
250  break;
251  default:
252  pips_internal_error("Language unknown !");
253  break;
254  }
255 
257 
258  if (style) {
259  set_string_property("PRETTYPRINT_PARALLEL", pp);
260  free(pp);
261  }
262 
264 
265  free_text(r);
266  return success;
267 }
268 
269 
270 /************************************************************ PIPSMAKE HOOKS */
271 
272 bool print_code(const string mod_name)
273 {
274  is_user_view = false;
275  return print_code_or_source(mod_name);
276 }
277 
278 bool print_source(const string mod_name)
279 {
280  is_user_view = true;
281  return print_code_or_source(mod_name);
282 }
283 
284 bool print_parallelized_code(const string mod_name)
285 {
286  return print_parallelized_code_common(mod_name, NULL);
287 }
288 
289 bool print_parallelized90_code(const string mod_name)
290 {
291  return print_parallelized_code_common(mod_name, "f90");
292 }
293 
294 bool print_parallelized77_code(const string mod_name)
295 {
296  return print_parallelized_code_common(mod_name, "doall");
297 }
298 
300 {
302 }
303 
304 #define all_priv "PRETTYPRINT_ALL_PRIVATE_VARIABLES"
305 
306 bool print_parallelizedOMP_code(const string mod_name)
307 {
309  pips_user_warning("avoid property " all_priv "=TRUE with OMP\n");
310 
311  return print_parallelized_code_common(mod_name, "omp");
312 }
313 
314 bool print_parallelizedMPI_code(const string mod_name)
315 {
316  return print_parallelized_code_common(mod_name, "mpi");
317 }
318 
319 /**************************************************************** DEBUG UTIL */
320 
321 #include "pips-libs.h"
322 
323 #ifdef HAVE_PIPS_effects_util_LIBRARY
324 #include "effects-util.h"
325 #endif // HAVE_PIPS_effects_util_LIBRARY
326 
327 #ifdef HAVE_PIPS_effects_generic_LIBRARY
328 #include "effects-generic.h"
329 #endif // HAVE_PIPS_effects_generic_LIBRARY
330 
331 #ifdef HAVE_PIPS_effects_simple_LIBRARY
332 #include "effects-simple.h" // print_effect
333 #else
334 #define print_effects(e) \
335  pips_internal_error("print_effects function not available")
336 #define print_effect(e) \
337  pips_internal_error("print_effect function not available")
338 #endif // HAVE_PIPS_effects_simple_LIBRARY
339 
340 #ifdef HAVE_PIPS_effects_convex_LIBRARY
341 #include "effects-convex.h"
342 #else
343 #define print_region(x) \
344  pips_internal_error("print_region function not available")
345 #endif // HAVE_PIPS_effects_convex_LIBRARY
346 
347 #ifdef HAVE_PIPS_semantics_LIBRARY
348 #include "semantics.h"
349 #endif // HAVE_PIPS_semantics_LIBRARY
350 
351 #ifdef HAVE_PIPS_transformer_LIBRARY
352 #include "transformer.h"
353 #else
354 #define transformer_with_temporary_values_p(t) ((t) != NULL)
355 #define dump_transformer(t) \
356  pips_internal_error("dump_transformer function not available")
357 #define print_transformer(t) \
358  pips_internal_error("print_transformer function not available")
359 #endif // HAVE_PIPS_transformer_LIBRARY
360 
361 #ifdef HAVE_PIPS_points_to_LIBRARY
362 #include "points_to_private.h"
363 #include "points-to.h"
364 #else
365 // hmmm... "effects-util.h" may include "points_to_private.h"...
366 #ifndef points_to_domain
367 #define points_to_domain (-1)
368 #endif // points_to_domain
369 #ifndef points_to_list_domain
370 #define points_to_list_domain (-1)
371 #endif // points_to_list_domain
372 #ifndef points_to_graph_domain
373 #define points_to_graph_domain (-1)
374 #endif // points_to_graph_domain
375 #define print_points_to(x) \
376  pips_internal_error("print_points_to function not available")
377 #define print_points_to_cell(x) \
378  pips_internal_error("print_points_to_cell function not available")
379 #define print_points_to_cells(x) \
380  pips_internal_error("print_points_to_cells function not available")
381 #define print_points_to_list(x) \
382  pips_internal_error("print_points_to_list function not available")
383 #define print_points_to_graph(x) \
384  pips_internal_error("print_points_to_graph function not available")
385 #define print_points_to_relations(x) \
386  pips_internal_error("print_points_to_relations function not available")
387 #endif // HAVE_PIPS_points_to_LIBRARY
388 
389 /* For debugging: prettyprint many different kinds of newgen objects
390  * FC: type should be gen_chunk...
391  */
393 {
394  debug_on("PRETTYPRINT_DEBUG_LEVEL");
396  (void) fprintf(stderr, "UNDEFINED NEWGEN OBJECT\n");
397  else if(x==0)
398  (void) fprintf(stderr, "EMPTY LIST\n");
399  else {
400  int ot = expression_domain_number(x);
401  if(ot==0)
402  (void) fprintf(stderr,"PROBABLY AN EMPTY LIST\n");
403  else if(expression_undefined_p(x))
404  (void) fprintf(stderr,"UNDEFINED NEWGEN OBJECT\n");
405  else if(ot==expression_domain)
407  else if(ot==reference_domain)
409  else if(ot==points_to_domain)
410  print_points_to((points_to) x); // See also print_points_to_relation
411  else if(ot==cell_domain) {
413  fprintf(stderr, "\n");
414  }
415  else if(ot==type_domain)
416  print_type((type) x);
417  else if(ot==statement_domain)
419  else if(ot==effect_domain) {
421  if(descriptor_none_p(d))
422  print_effect((effect) x);
423  else
424  print_region((effect) x);
425  }
426  else if(ot==points_to_list_domain)
428  else if(ot==points_to_graph_domain)
430  else if(ot==text_domain)
431  print_text(stderr, (text) x);
432  else if(ot==entity_domain) {
435  if(entity_undefined_p(mx))
436  fprintf(stderr, "%s\n", entity_name((entity) x));
437  else {
438  if(m!=mx)
439  fprintf(stderr,"%s" MODULE_SEP_STRING, entity_local_name(mx));
440  fprintf(stderr, "%s\n", entity_local_name((entity) x));
441  }
442  }
443  else if(ot==basic_domain) {
444  string s = basic_to_string((basic) x);
445  fprintf(stderr, "%s\n", s);
446  free(s);
447  }
448  else if(ot==transformer_domain) {
451  dump_transformer(t);
452  else {
453  // FI: print_transformer() core dumps in interprocedural
454  // settings and dump_transformer() is as good for debugging ig
455  // not better
456  dump_transformer(t);
457  }
458  }
459  else if(ot==effects_domain) {
460  list el = effects_effects((effects) x);
461  dprint((expression) el);
462  }
463  else if(ot==dimension_domain) {
464  dimension d = (dimension) x;
467  // list ql = dimension_qualifiers(d);
468  // FI: lets forget abut qualifiers
469  print_expression(l);
470  print_expression(u);
471  }
472  else if(ot==qualifier_domain) {
473  qualifier q = (qualifier) x;
474  print_qualifier(q);
475  }
476  else if(0<=ot && ot<1000)
477  (void) fprintf(stderr, "Unprocessed Newgen Object with tag %d\n", ot);
478  else if(ot>1000 || ot<=0) {
479  // FI: I do not know how to get the largest Newgen type
480  // We could assume that the object is a list and look for the type
481  // of the first object...
482  (void) fprintf(stderr,"NOT A NEWGEN OBJECT. MAYBE A LIST\n");
483  expression cx = EXPRESSION(CAR((list) x));
484  int cot = expression_domain_number(cx);
485  if(cot==expression_domain)
487  else if(cot==reference_domain)
489  else if(cot==cell_domain)
491  else if(cot==type_domain)
492  print_types((list) x);
493  else if(cot==statement_domain)
495  else if(cot==effect_domain)
496  print_effects((list) x);
497  else if(cot==points_to_domain)
499  else if(cot==transformer_domain) {
500  list tl = (list) x;
501  FOREACH(TRANSFORMER, t, tl) {
503  dump_transformer(t);
504  else
505  dump_transformer(t);
506  }
507  }
508  else if(cot==entity_domain) {
509  // print_entities((list) x);
510  list el = (list) x;
512  FOREACH(ENTITY, e, el) {
514  if(m!=me)
515  fprintf(stderr,"%s" MODULE_SEP_STRING, entity_local_name(me));
516  fprintf(stderr, "%s\n", entity_local_name(e));
517  }
518  }
519  else if(cot==dimension_domain) {
520  list dl = (list) x;
521  FOREACH(DIMENSION, d, dl) {
524  // list ql = dimension_qualifiers(d);
525  // FI: lets forget abut qualifiers
526  print_expression(l);
527  print_expression(u);
528  }
529  }
530  else if(cot==qualifier_domain) {
531  list ql = (list) x;
532  print_qualifiers(ql);
533  }
534  else
535  (void) fprintf(stderr, "If a list, a list of unknown objects: tag=%d\n", (int) cot);
536  }
537  }
538  debug_off();
539 }
text make_text(list a)
Definition: text.c:107
void free_text(text p)
Definition: text.c:74
void begin_attachment_prettyprint(void)
The translation functions between unique names and objects:
void end_attachment_prettyprint(void)
Clean the things related with the attachment of properties:
void write_an_attachment_file(string file_name)
Add the attachment in Emacs mode by creating a twin file that is decorated with Emacs properties:
struct _newgen_struct_qualifier_ * qualifier
struct _newgen_struct_statement_ * statement
Definition: cloning.h:21
#define resource_name(x)
Definition: database.h:108
#define cell_domain
newgen_cell_interpretation_domain_defined
Definition: effects.h:85
#define effects_domain
newgen_effects_classes_domain_defined
Definition: effects.h:133
#define effect_descriptor(x)
Definition: effects.h:646
#define effects_effects(x)
Definition: effects.h:710
#define descriptor_none_p(x)
Definition: effects.h:602
#define effect_domain
newgen_descriptor_domain_defined
Definition: effects.h:117
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
FILE * safe_fopen(const char *filename, const char *what)
Definition: file.c:67
char * get_string_property(const char *)
int safe_fclose(FILE *stream, const char *filename)
Definition: file.c:77
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
void free(void *)
bool success
Definition: gpips-local.h:59
void reset_current_module_entity(void)
Reset the current module entity.
Definition: static.c:97
void reset_current_module_statement(void)
Reset the current module statement.
Definition: static.c:221
statement set_current_module_statement(statement)
Set the current module statement.
Definition: static.c:165
entity set_current_module_entity(entity)
static.c
Definition: static.c:66
entity get_current_module_entity(void)
Get the entity of the current module.
Definition: static.c:85
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
#define CAR(pcons)
Get the value of the first element of a list.
Definition: newgen_list.h:92
#define FOREACH(_fe_CASTER, _fe_item, _fe_list)
Apply/map an instruction block on all the elements of a list.
Definition: newgen_list.h:179
string db_get_memory_resource(const char *rname, const char *oname, bool pure)
Return the pointer to the resource, whatever it is.
Definition: database.c:755
#define DB_PUT_FILE_RESOURCE
Put a file resource into the current workspace database.
Definition: pipsdbm-local.h:85
static statement mod_stat
We want to keep track of the current statement inside the recurse.
Definition: impact_check.c:41
void set_prettyprint_language_from_property(enum language_utype native)
set the prettyprint language according to the property PRETTYPRINT_LANGUAGE @description If the prope...
Definition: language.c:103
enum language_utype get_prettyprint_language_tag()
Definition: language.c:67
string db_build_file_resource_name(const char *rname, const char *oname, const char *suffix)
returns an allocated file name for a file resource.
Definition: lowlevel.c:169
#define debug_on(env)
Definition: misc-local.h:157
#define pips_user_warning
Definition: misc-local.h:146
#define pips_internal_error
Definition: misc-local.h:149
#define debug_off()
Definition: misc-local.h:160
#define pips_user_error
Definition: misc-local.h:147
#define MODULE_SEP_STRING
Definition: naming-local.h:30
string concatenate(const char *,...)
Return the concatenation of the given strings.
Definition: string.c:183
#define string_undefined
Definition: newgen_types.h:40
struct cons * list
Definition: newgen_types.h:106
static char * module
Definition: pips.c:74
string db_get_current_workspace_directory(void)
Definition: workspace.c:96
void print_references(list rl)
Definition: expression.c:163
void print_expressions(list le)
Definition: expression.c:98
void print_expression(expression e)
no file descriptor is passed to make is easier to use in a debugging stage.
Definition: expression.c:58
void print_reference(reference r)
Definition: expression.c:142
text empty_text(entity __attribute__((unused)) e, int __attribute__((unused)) m, statement __attribute__((unused)) s)
Definition: misc.c:219
void close_prettyprint()
because some prettyprint functions may be used for debug, so the last hook set by somebody may have s...
Definition: misc.c:242
void init_prettyprint(text(*hook)(entity, int, statement))
checks that the prettyprint hook was actually reset...
Definition: misc.c:231
bool print_parallelizedHPF_code(const string module_name)
Definition: print.c:299
#define print_effect(e)
Definition: print.c:336
bool print_parallelized_code(const string mod_name)
Definition: print.c:284
#define transformer_with_temporary_values_p(t)
Definition: print.c:354
bool print_source(const string mod_name)
Definition: print.c:278
static bool print_parallelized_code_common(const char *mod_name, const char *style)
Build a textual resource for a parallel code using a string optional parallel style (dialect such as ...
Definition: print.c:202
bool print_code_or_source(string mod_name)
Generic function to prettyprint some sequential or parallel code, or even user view for the given mod...
Definition: print.c:103
static bool is_user_view
Definition: print.c:93
#define points_to_list_domain
Definition: print.c:370
bool print_parallelized77_code(const string mod_name)
Definition: print.c:294
#define print_points_to_relations(x)
Definition: print.c:385
#define points_to_domain
Definition: print.c:367
bool print_parallelized90_code(const string mod_name)
Definition: print.c:289
#define print_region(x)
Definition: print.c:343
bool make_text_resource(const char *mod_name, const char *res_name, const char *file_ext, text texte)
Main C functions to print code, sequential or parallel.
Definition: print.c:55
#define print_points_to_graph(x)
Definition: print.c:383
#define print_points_to_cells(x)
Definition: print.c:379
#define points_to_graph_domain
Definition: print.c:373
void dprint(expression x)
For debugging: prettyprint many different kinds of newgen objects FC: type should be gen_chunk....
Definition: print.c:392
#define print_points_to_list(x)
Definition: print.c:381
bool print_code(const string mod_name)
Definition: print.c:272
#define all_priv
Definition: print.c:304
bool make_text_resource_and_free(const char *mod_name, const char *res_name, const char *file_ext, text t)
Definition: print.c:82
#define print_effects(e)
Definition: print.c:334
#define dump_transformer(t)
Definition: print.c:355
bool print_parallelizedMPI_code(const string mod_name)
Definition: print.c:314
#define print_points_to_cell(x)
Definition: print.c:377
#define print_points_to(x)
Definition: print.c:375
bool user_view_p()
print_code or print_source
Definition: print.c:95
bool print_parallelizedOMP_code(const string mod_name)
Definition: print.c:306
text text_module(entity, statement)
void print_type(type)
For debugging.
Definition: type.c:111
void print_qualifiers(list)
Definition: type.c:131
void print_qualifier(qualifier)
Definition: type.c:138
void print_statements(list)
Definition: statement.c:103
string basic_to_string(basic)
Definition: type.c:87
void print_types(list)
Very basic and crude debugging function.
Definition: type.c:96
void print_statement(statement)
Print a statement on stderr.
Definition: statement.c:98
void set_string_property(const char *, const char *)
const char * entity_local_name(entity e)
entity_local_name modified so that it does not core when used in vect_fprint, since someone thought t...
Definition: entity.c:453
entity module_name_to_entity(const char *mn)
This is an alias for local_name_to_top_level_entity.
Definition: entity.c:1479
const char * entity_module_name(entity e)
See comments about module_name().
Definition: entity.c:1092
#define value_code_p(x)
Definition: ri.h:3065
#define expression_domain
newgen_execution_domain_defined
Definition: ri.h:154
#define TRANSFORMER(x)
TRANSFORMER.
Definition: ri.h:2841
#define ENTITY(x)
ENTITY.
Definition: ri.h:2755
struct _newgen_struct_dimension_ * dimension
Definition: ri.h:111
#define transformer_domain
newgen_test_domain_defined
Definition: ri.h:426
#define dimension_lower(x)
Definition: ri.h:980
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362
#define EXPRESSION(x)
EXPRESSION.
Definition: ri.h:1217
#define entity_undefined_p(x)
Definition: ri.h:2762
#define reference_domain
newgen_range_domain_defined
Definition: ri.h:338
#define basic_domain
newgen_area_domain_defined
Definition: ri.h:42
#define entity_name(x)
Definition: ri.h:2790
#define dimension_upper(x)
Definition: ri.h:982
#define value_code(x)
Definition: ri.h:3067
#define dimension_domain
newgen_control_domain_defined
Definition: ri.h:106
#define type_domain
newgen_transformer_domain_defined
Definition: ri.h:434
#define expression_undefined_p(x)
Definition: ri.h:1224
struct _newgen_struct_transformer_ * transformer
Definition: ri.h:431
#define qualifier_domain
newgen_preference_domain_defined
Definition: ri.h:314
#define code_language(x)
Definition: ri.h:792
#define language_tag(x)
Definition: ri.h:1590
@ is_language_fortran
Definition: ri.h:1566
@ is_language_fortran95
Definition: ri.h:1568
@ is_language_c
Definition: ri.h:1567
#define entity_domain
newgen_syntax_domain_defined
Definition: ri.h:410
#define entity_initial(x)
Definition: ri.h:2796
#define expression_domain_number(x)
Definition: ri.h:1245
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
char * strdup()
static bool ok
static char * x
Definition: split_file.c:159
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
#define MERGE_TEXTS(r, t)
void print_text(FILE *fd, text t)
Definition: print.c:195
#define text_domain
newgen_sentence_domain_defined
Definition: text.h:18