00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "proj.h"
00034 #include "data.h"
00035 #include "bit.h"
00036 #include "bld.h"
00037 #include "com.h"
00038 #include "expr.h"
00039 #include "global.h"
00040 #include "malloc.h"
00041 #include "st.h"
00042 #include "storag.h"
00043 #include "top.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 #ifndef FFEDATA_sizeTOO_BIG_INIT_
00061 #define FFEDATA_sizeTOO_BIG_INIT_ 75*1024
00062 #endif
00063
00064
00065
00066 typedef struct _ffedata_convert_cache_ *ffedataConvertCache_;
00067 typedef struct _ffedata_impdo_ *ffedataImpdo_;
00068
00069
00070
00071
00072
00073
00074 struct _ffedata_convert_cache_
00075 {
00076 ffebld converted;
00077
00078 ffeinfoBasictype basic_type;
00079 ffeinfoKindtype kind_type;
00080 ffetargetCharacterSize size;
00081 ffeinfoRank rank;
00082 };
00083
00084 struct _ffedata_impdo_
00085 {
00086 ffedataImpdo_ outer;
00087 ffebld outer_list;
00088 ffebld my_list;
00089 ffesymbol itervar;
00090 ffetargetIntegerDefault increment;
00091 ffetargetIntegerDefault final;
00092 };
00093
00094
00095
00096 static ffedataImpdo_ ffedata_stack_ = NULL;
00097 static ffebld ffedata_list_ = NULL;
00098 static bool ffedata_reinit_;
00099 static bool ffedata_reported_error_;
00100 static ffesymbol ffedata_symbol_ = NULL;
00101 static ffeinfoBasictype ffedata_basictype_;
00102 static ffeinfoKindtype ffedata_kindtype_;
00103 static ffestorag ffedata_storage_;
00104 static ffeinfoBasictype ffedata_storage_bt_;
00105 static ffeinfoKindtype ffedata_storage_kt_;
00106 static ffetargetOffset ffedata_storage_size_;
00107 static ffetargetAlign ffedata_storage_units_;
00108 static ffetargetOffset ffedata_arraysize_;
00109
00110 static ffetargetOffset ffedata_expected_;
00111
00112 static ffetargetOffset ffedata_number_;
00113 static ffetargetOffset ffedata_offset_;
00114 static ffetargetOffset ffedata_symbolsize_;
00115 static ffetargetCharacterSize ffedata_size_;
00116 static ffetargetCharacterSize ffedata_charexpected_;
00117 static ffetargetCharacterSize ffedata_charnumber_;
00118 static ffetargetCharacterSize ffedata_charoffset_;
00119 static ffedataConvertCache_ ffedata_convert_cache_;
00120 static int ffedata_convert_cache_max_ = 0;
00121 static int ffedata_convert_cache_use_ = 0;
00122
00123
00124
00125 static bool ffedata_advance_ (void);
00126 static ffebld ffedata_convert_ (ffebld source, ffelexToken source_token,
00127 ffelexToken dest_token, ffeinfoBasictype bt, ffeinfoKindtype kt,
00128 ffeinfoRank rk, ffetargetCharacterSize sz);
00129 static ffetargetInteger1 ffedata_eval_integer1_ (ffebld expr);
00130 static ffetargetOffset ffedata_eval_offset_ (ffebld subscripts,
00131 ffebld dims);
00132 static ffetargetCharacterSize ffedata_eval_substr_begin_ (ffebld expr);
00133 static ffetargetCharacterSize ffedata_eval_substr_end_ (ffebld expr,
00134 ffetargetCharacterSize min, ffetargetCharacterSize max);
00135 static void ffedata_gather_ (ffestorag mst, ffestorag st);
00136 static void ffedata_pop_ (void);
00137 static void ffedata_push_ (void);
00138 static bool ffedata_value_ (ffebld value, ffelexToken token);
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 void
00152 ffedata_begin (ffebld list)
00153 {
00154 assert (ffedata_list_ == NULL);
00155 ffedata_list_ = list;
00156 ffedata_symbol_ = NULL;
00157 ffedata_reported_error_ = FALSE;
00158 ffedata_reinit_ = FALSE;
00159 ffedata_advance_ ();
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169 bool
00170 ffedata_end (bool reported_error, ffelexToken t)
00171 {
00172 reported_error |= ffedata_reported_error_;
00173
00174
00175
00176 if ((ffedata_symbol_ != NULL) && !reported_error)
00177 {
00178 reported_error = TRUE;
00179 ffebad_start (FFEBAD_DATA_TOOFEW);
00180 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
00181 ffebad_string (ffesymbol_text (ffedata_symbol_));
00182 ffebad_finish ();
00183 }
00184
00185
00186
00187 while (ffedata_stack_ != NULL)
00188 ffedata_pop_ ();
00189
00190 if (ffedata_list_ != NULL)
00191 {
00192 assert (reported_error);
00193 ffedata_list_ = NULL;
00194 }
00195
00196 return TRUE;
00197 }
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 void
00212 ffedata_gather (ffestorag st)
00213 {
00214 ffesymbol s;
00215 ffebld b;
00216
00217
00218
00219 ffetarget_aggregate_info (&ffedata_storage_bt_, &ffedata_storage_kt_,
00220 &ffedata_storage_units_, ffestorag_basictype (st),
00221 ffestorag_kindtype (st));
00222 ffedata_storage_size_ = ffestorag_size (st) / ffedata_storage_units_;
00223 assert (ffestorag_size (st) % ffedata_storage_units_ == 0);
00224
00225
00226
00227 if ((ffestorag_type (st) == FFESTORAG_typeCBLOCK)
00228 && (ffestorag_symbol (st) != NULL))
00229 {
00230 s = ffestorag_symbol (st);
00231 for (b = ffesymbol_commonlist (s); b != NULL; b = ffebld_trail (b))
00232 ffedata_gather_ (st,
00233 ffesymbol_storage (ffebld_symter (ffebld_head (b))));
00234 }
00235
00236
00237
00238 ffestorag_drive (ffestorag_list_equivs (st), ffedata_gather_, st);
00239 }
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 bool
00253 ffedata_value (ffetargetIntegerDefault rpt, ffebld value, ffelexToken token)
00254 {
00255 ffetargetIntegerDefault i;
00256
00257
00258
00259
00260 if (!ffe_is_zeros ()
00261 && (value != NULL)
00262 && (ffebld_op (value) == FFEBLD_opCONTER)
00263 && ffebld_constant_is_zero (ffebld_conter (value)))
00264 value = NULL;
00265 else if ((value != NULL)
00266 && (ffebld_op (value) == FFEBLD_opANY))
00267 value = NULL;
00268 else
00269 {
00270
00271 assert (value != NULL);
00272 assert (ffebld_op (value) == FFEBLD_opCONTER);
00273 }
00274
00275
00276
00277
00278 if (rpt == 1)
00279 ffedata_convert_cache_use_ = -1;
00280 else
00281 ffedata_convert_cache_use_ = 0;
00282
00283 for (i = 0; i < rpt; ++i)
00284 {
00285 if ((ffedata_symbol_ != NULL)
00286 && !ffesymbol_is_init (ffedata_symbol_))
00287 {
00288 ffesymbol_signal_change (ffedata_symbol_);
00289 ffesymbol_update_init (ffedata_symbol_);
00290 if (1 || ffe_is_90 ())
00291 ffesymbol_update_save (ffedata_symbol_);
00292 #if FFEGLOBAL_ENABLED
00293 if (ffesymbol_common (ffedata_symbol_) != NULL)
00294 ffeglobal_init_common (ffesymbol_common (ffedata_symbol_),
00295 token);
00296 #endif
00297 ffesymbol_signal_unreported (ffedata_symbol_);
00298 }
00299 if (!ffedata_value_ (value, token))
00300 return FALSE;
00301 }
00302
00303 return TRUE;
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316 static bool
00317 ffedata_advance_ ()
00318 {
00319 ffebld next;
00320
00321
00322
00323 tail_recurse:
00324
00325
00326
00327 ffedata_symbol_ = NULL;
00328
00329
00330
00331 if (ffedata_list_ == NULL)
00332 {
00333 ffetargetIntegerDefault newval;
00334
00335 if (ffedata_stack_ == NULL)
00336 return TRUE;
00337
00338
00339
00340 newval = ffesymbol_value (ffedata_stack_->itervar)
00341 + ffedata_stack_->increment;
00342
00343
00344
00345 if (((ffedata_stack_->increment > 0)
00346 ? newval > ffedata_stack_->final
00347 : newval < ffedata_stack_->final)
00348 || (((ffesymbol_value (ffedata_stack_->itervar) < 0)
00349 == (ffedata_stack_->increment < 0))
00350 && ((ffesymbol_value (ffedata_stack_->itervar) < 0)
00351 != (newval < 0))))
00352 {
00353 ffedata_list_ = ffedata_stack_->outer_list;
00354 ffedata_pop_ ();
00355 }
00356 else
00357 {
00358
00359 ffedata_list_ = ffedata_stack_->my_list;
00360 ffesymbol_set_value (ffedata_stack_->itervar, newval);
00361 }
00362 goto tail_recurse;
00363 }
00364
00365
00366
00367 next = ffebld_head (ffedata_list_);
00368 ffedata_list_ = ffebld_trail (ffedata_list_);
00369
00370
00371
00372 if (next == NULL)
00373 return TRUE;
00374
00375
00376
00377 switch (ffebld_op (next))
00378 {
00379 case FFEBLD_opSYMTER:
00380 ffedata_symbol_ = ffebld_symter (next);
00381 ffedata_storage_ = (ffesymbol_storage (ffedata_symbol_) == NULL) ? NULL
00382 : ffestorag_parent (ffesymbol_storage (ffedata_symbol_));
00383 if (ffedata_storage_ != NULL)
00384 {
00385 ffetarget_aggregate_info (&ffedata_storage_bt_, &ffedata_storage_kt_,
00386 &ffedata_storage_units_,
00387 ffestorag_basictype (ffedata_storage_),
00388 ffestorag_kindtype (ffedata_storage_));
00389 ffedata_storage_size_ = ffestorag_size (ffedata_storage_)
00390 / ffedata_storage_units_;
00391 assert (ffestorag_size (ffedata_storage_) % ffedata_storage_units_ == 0);
00392 }
00393
00394 if ((ffesymbol_init (ffedata_symbol_) != NULL)
00395 || (ffesymbol_accretion (ffedata_symbol_) != NULL)
00396 || ((ffedata_storage_ != NULL)
00397 && (ffestorag_init (ffedata_storage_) != NULL)))
00398 {
00399 #if 0
00400 ffebad_start (FFEBAD_DATA_REINIT);
00401 ffest_ffebad_here_current_stmt (0);
00402 ffebad_string (ffesymbol_text (ffedata_symbol_));
00403 ffebad_finish ();
00404 ffedata_reported_error_ = TRUE;
00405 return FALSE;
00406 #else
00407 ffedata_reinit_ = TRUE;
00408 return TRUE;
00409 #endif
00410 }
00411 ffedata_basictype_ = ffesymbol_basictype (ffedata_symbol_);
00412 ffedata_kindtype_ = ffesymbol_kindtype (ffedata_symbol_);
00413 if (ffesymbol_rank (ffedata_symbol_) == 0)
00414 ffedata_arraysize_ = 1;
00415 else
00416 {
00417 ffebld size = ffesymbol_arraysize (ffedata_symbol_);
00418
00419 assert (size != NULL);
00420 assert (ffebld_op (size) == FFEBLD_opCONTER);
00421 assert (ffeinfo_basictype (ffebld_info (size))
00422 == FFEINFO_basictypeINTEGER);
00423 assert (ffeinfo_kindtype (ffebld_info (size))
00424 == FFEINFO_kindtypeINTEGERDEFAULT);
00425 ffedata_arraysize_ = ffebld_constant_integerdefault (ffebld_conter
00426 (size));
00427 }
00428 ffedata_expected_ = ffedata_arraysize_;
00429 ffedata_number_ = 0;
00430 ffedata_offset_ = 0;
00431 ffedata_size_ = (ffedata_basictype_ == FFEINFO_basictypeCHARACTER)
00432 ? ffesymbol_size (ffedata_symbol_) : 1;
00433 ffedata_symbolsize_ = ffedata_size_ * ffedata_arraysize_;
00434 ffedata_charexpected_ = ffedata_size_;
00435 ffedata_charnumber_ = 0;
00436 ffedata_charoffset_ = 0;
00437 break;
00438
00439 case FFEBLD_opARRAYREF:
00440 ffedata_symbol_ = ffebld_symter (ffebld_left (next));
00441 ffedata_storage_ = (ffesymbol_storage (ffedata_symbol_) == NULL) ? NULL
00442 : ffestorag_parent (ffesymbol_storage (ffedata_symbol_));
00443 if (ffedata_storage_ != NULL)
00444 {
00445 ffetarget_aggregate_info (&ffedata_storage_bt_, &ffedata_storage_kt_,
00446 &ffedata_storage_units_,
00447 ffestorag_basictype (ffedata_storage_),
00448 ffestorag_kindtype (ffedata_storage_));
00449 ffedata_storage_size_ = ffestorag_size (ffedata_storage_)
00450 / ffedata_storage_units_;
00451 assert (ffestorag_size (ffedata_storage_) % ffedata_storage_units_ == 0);
00452 }
00453
00454 if ((ffesymbol_init (ffedata_symbol_) != NULL)
00455 || ((ffedata_storage_ != NULL)
00456 && (ffestorag_init (ffedata_storage_) != NULL)))
00457 {
00458 #if 0
00459 ffebad_start (FFEBAD_DATA_REINIT);
00460 ffest_ffebad_here_current_stmt (0);
00461 ffebad_string (ffesymbol_text (ffedata_symbol_));
00462 ffebad_finish ();
00463 ffedata_reported_error_ = TRUE;
00464 return FALSE;
00465 #else
00466 ffedata_reinit_ = TRUE;
00467 return TRUE;
00468 #endif
00469 }
00470 ffedata_basictype_ = ffesymbol_basictype (ffedata_symbol_);
00471 ffedata_kindtype_ = ffesymbol_kindtype (ffedata_symbol_);
00472 if (ffesymbol_rank (ffedata_symbol_) == 0)
00473 ffedata_arraysize_ = 1;
00474 else
00475 {
00476 ffebld size = ffesymbol_arraysize (ffedata_symbol_);
00477
00478 assert (size != NULL);
00479 assert (ffebld_op (size) == FFEBLD_opCONTER);
00480 assert (ffeinfo_basictype (ffebld_info (size))
00481 == FFEINFO_basictypeINTEGER);
00482 assert (ffeinfo_kindtype (ffebld_info (size))
00483 == FFEINFO_kindtypeINTEGERDEFAULT);
00484 ffedata_arraysize_ = ffebld_constant_integerdefault (ffebld_conter
00485 (size));
00486 }
00487 ffedata_expected_ = 1;
00488 ffedata_number_ = 0;
00489 ffedata_offset_ = ffedata_eval_offset_ (ffebld_right (next),
00490 ffesymbol_dims (ffedata_symbol_));
00491 ffedata_size_ = (ffedata_basictype_ == FFEINFO_basictypeCHARACTER)
00492 ? ffesymbol_size (ffedata_symbol_) : 1;
00493 ffedata_symbolsize_ = ffedata_size_ * ffedata_arraysize_;
00494 ffedata_charexpected_ = ffedata_size_;
00495 ffedata_charnumber_ = 0;
00496 ffedata_charoffset_ = 0;
00497 break;
00498
00499 case FFEBLD_opSUBSTR:
00500
00501 {
00502 bool arrayref = ffebld_op (ffebld_left (next)) == FFEBLD_opARRAYREF;
00503 ffebld colon = ffebld_right (next);
00504
00505 assert (colon != NULL);
00506
00507 ffedata_symbol_ = ffebld_symter (ffebld_left (arrayref
00508 ? ffebld_left (next) : next));
00509 ffedata_storage_ = (ffesymbol_storage (ffedata_symbol_) == NULL) ? NULL
00510 : ffestorag_parent (ffesymbol_storage (ffedata_symbol_));
00511 if (ffedata_storage_ != NULL)
00512 {
00513 ffetarget_aggregate_info (&ffedata_storage_bt_, &ffedata_storage_kt_,
00514 &ffedata_storage_units_,
00515 ffestorag_basictype (ffedata_storage_),
00516 ffestorag_kindtype (ffedata_storage_));
00517 ffedata_storage_size_ = ffestorag_size (ffedata_storage_)
00518 / ffedata_storage_units_;
00519 assert (ffestorag_size (ffedata_storage_) % ffedata_storage_units_ == 0);
00520 }
00521
00522 if ((ffesymbol_init (ffedata_symbol_) != NULL)
00523 || ((ffedata_storage_ != NULL)
00524 && (ffestorag_init (ffedata_storage_) != NULL)))
00525 {
00526 #if 0
00527 ffebad_start (FFEBAD_DATA_REINIT);
00528 ffest_ffebad_here_current_stmt (0);
00529 ffebad_string (ffesymbol_text (ffedata_symbol_));
00530 ffebad_finish ();
00531 ffedata_reported_error_ = TRUE;
00532 return FALSE;
00533 #else
00534 ffedata_reinit_ = TRUE;
00535 return TRUE;
00536 #endif
00537 }
00538 ffedata_basictype_ = ffesymbol_basictype (ffedata_symbol_);
00539 ffedata_kindtype_ = ffesymbol_kindtype (ffedata_symbol_);
00540 if (ffesymbol_rank (ffedata_symbol_) == 0)
00541 ffedata_arraysize_ = 1;
00542 else
00543 {
00544 ffebld size = ffesymbol_arraysize (ffedata_symbol_);
00545
00546 assert (size != NULL);
00547 assert (ffebld_op (size) == FFEBLD_opCONTER);
00548 assert (ffeinfo_basictype (ffebld_info (size))
00549 == FFEINFO_basictypeINTEGER);
00550 assert (ffeinfo_kindtype (ffebld_info (size))
00551 == FFEINFO_kindtypeINTEGERDEFAULT);
00552 ffedata_arraysize_ = ffebld_constant_integerdefault (ffebld_conter
00553 (size));
00554 }
00555 ffedata_expected_ = arrayref ? 1 : ffedata_arraysize_;
00556 ffedata_number_ = 0;
00557 ffedata_offset_ = arrayref ? ffedata_eval_offset_ (ffebld_right
00558 (ffebld_left (next)), ffesymbol_dims (ffedata_symbol_)) : 0;
00559 ffedata_size_ = ffesymbol_size (ffedata_symbol_);
00560 ffedata_symbolsize_ = ffedata_size_ * ffedata_arraysize_;
00561 ffedata_charnumber_ = 0;
00562 ffedata_charoffset_ = ffedata_eval_substr_begin_ (ffebld_head (colon));
00563 ffedata_charexpected_ = ffedata_eval_substr_end_ (ffebld_head
00564 (ffebld_trail (colon)), ffedata_charoffset_,
00565 ffedata_size_) - ffedata_charoffset_ + 1;
00566 }
00567 break;
00568
00569 case FFEBLD_opIMPDO:
00570 {
00571 ffebld itervar;
00572 ffebld start;
00573 ffebld end;
00574 ffebld incr;
00575 ffebld item = ffebld_right (next);
00576
00577 itervar = ffebld_head (item);
00578 item = ffebld_trail (item);
00579 start = ffebld_head (item);
00580 item = ffebld_trail (item);
00581 end = ffebld_head (item);
00582 item = ffebld_trail (item);
00583 incr = ffebld_head (item);
00584
00585 ffedata_push_ ();
00586 ffedata_stack_->outer_list = ffedata_list_;
00587 ffedata_stack_->my_list = ffedata_list_ = ffebld_left (next);
00588
00589 assert (ffeinfo_basictype (ffebld_info (itervar))
00590 == FFEINFO_basictypeINTEGER);
00591 assert (ffeinfo_kindtype (ffebld_info (itervar))
00592 == FFEINFO_kindtypeINTEGERDEFAULT);
00593 ffedata_stack_->itervar = ffebld_symter (itervar);
00594
00595 assert (ffeinfo_basictype (ffebld_info (start))
00596 == FFEINFO_basictypeINTEGER);
00597 assert (ffeinfo_kindtype (ffebld_info (start))
00598 == FFEINFO_kindtypeINTEGERDEFAULT);
00599 ffesymbol_set_value (ffedata_stack_->itervar, ffedata_eval_integer1_ (start));
00600
00601 assert (ffeinfo_basictype (ffebld_info (end))
00602 == FFEINFO_basictypeINTEGER);
00603 assert (ffeinfo_kindtype (ffebld_info (end))
00604 == FFEINFO_kindtypeINTEGERDEFAULT);
00605 ffedata_stack_->final = ffedata_eval_integer1_ (end);
00606
00607 if (incr == NULL)
00608 ffedata_stack_->increment = 1;
00609 else
00610 {
00611 assert (ffeinfo_basictype (ffebld_info (incr))
00612 == FFEINFO_basictypeINTEGER);
00613 assert (ffeinfo_kindtype (ffebld_info (incr))
00614 == FFEINFO_kindtypeINTEGERDEFAULT);
00615 ffedata_stack_->increment = ffedata_eval_integer1_ (incr);
00616 if (ffedata_stack_->increment == 0)
00617 {
00618 ffebad_start (FFEBAD_DATA_ZERO);
00619 ffest_ffebad_here_current_stmt (0);
00620 ffebad_string (ffesymbol_text (ffedata_stack_->itervar));
00621 ffebad_finish ();
00622 ffedata_pop_ ();
00623 ffedata_reported_error_ = TRUE;
00624 return FALSE;
00625 }
00626 }
00627
00628 if ((ffedata_stack_->increment > 0)
00629 ? ffesymbol_value (ffedata_stack_->itervar)
00630 > ffedata_stack_->final
00631 : ffesymbol_value (ffedata_stack_->itervar)
00632 < ffedata_stack_->final)
00633 {
00634 ffedata_reported_error_ = TRUE;
00635 ffebad_start (FFEBAD_DATA_EMPTY);
00636 ffest_ffebad_here_current_stmt (0);
00637 ffebad_string (ffesymbol_text (ffedata_stack_->itervar));
00638 ffebad_finish ();
00639 ffedata_pop_ ();
00640 return FALSE;
00641 }
00642 }
00643 goto tail_recurse;
00644
00645 case FFEBLD_opANY:
00646 ffedata_reported_error_ = TRUE;
00647 return FALSE;
00648
00649 default:
00650 assert ("bad op" == NULL);
00651 break;
00652 }
00653
00654 return TRUE;
00655 }
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671 static ffebld
00672 ffedata_convert_ (ffebld source, ffelexToken source_token,
00673 ffelexToken dest_token, ffeinfoBasictype bt,
00674 ffeinfoKindtype kt, ffeinfoRank rk,
00675 ffetargetCharacterSize sz)
00676 {
00677 ffebld converted;
00678 int i;
00679 int max;
00680 ffedataConvertCache_ cache;
00681
00682 for (i = 0; i < ffedata_convert_cache_use_; ++i)
00683 if ((bt == ffedata_convert_cache_[i].basic_type)
00684 && (kt == ffedata_convert_cache_[i].kind_type)
00685 && (sz == ffedata_convert_cache_[i].size)
00686 && (rk == ffedata_convert_cache_[i].rank))
00687 return ffedata_convert_cache_[i].converted;
00688
00689 converted = ffeexpr_convert (source, source_token, dest_token, bt, kt, rk,
00690 sz, FFEEXPR_contextDATA);
00691
00692 if (ffedata_convert_cache_use_ >= ffedata_convert_cache_max_)
00693 {
00694 if (ffedata_convert_cache_max_ == 0)
00695 max = 4;
00696 else
00697 max = ffedata_convert_cache_max_ << 1;
00698
00699 if (max > ffedata_convert_cache_max_)
00700 {
00701 cache = (ffedataConvertCache_) malloc_new_ks (malloc_pool_image (),
00702 "FFEDATA cache", max * sizeof (*cache));
00703 if (ffedata_convert_cache_max_ != 0)
00704 {
00705 memcpy (cache, ffedata_convert_cache_,
00706 ffedata_convert_cache_max_ * sizeof (*cache));
00707 malloc_kill_ks (malloc_pool_image (), ffedata_convert_cache_,
00708 ffedata_convert_cache_max_ * sizeof (*cache));
00709 }
00710 ffedata_convert_cache_ = cache;
00711 ffedata_convert_cache_max_ = max;
00712 }
00713 else
00714 return converted;
00715 }
00716
00717 i = ffedata_convert_cache_use_++;
00718
00719 ffedata_convert_cache_[i].converted = converted;
00720 ffedata_convert_cache_[i].basic_type = bt;
00721 ffedata_convert_cache_[i].kind_type = kt;
00722 ffedata_convert_cache_[i].size = sz;
00723 ffedata_convert_cache_[i].rank = rk;
00724
00725 return converted;
00726 }
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738 static ffetargetIntegerDefault
00739 ffedata_eval_integer1_ (ffebld expr)
00740 {
00741 ffetargetInteger1 result;
00742 ffebad error;
00743
00744 assert (expr != NULL);
00745
00746 switch (ffebld_op (expr))
00747 {
00748 case FFEBLD_opCONTER:
00749 return ffebld_constant_integer1 (ffebld_conter (expr));
00750
00751 case FFEBLD_opSYMTER:
00752 return ffesymbol_value (ffebld_symter (expr));
00753
00754 case FFEBLD_opUPLUS:
00755 return ffedata_eval_integer1_ (ffebld_left (expr));
00756
00757 case FFEBLD_opUMINUS:
00758 error = ffetarget_uminus_integer1 (&result,
00759 ffedata_eval_integer1_ (ffebld_left (expr)));
00760 break;
00761
00762 case FFEBLD_opADD:
00763 error = ffetarget_add_integer1 (&result,
00764 ffedata_eval_integer1_ (ffebld_left (expr)),
00765 ffedata_eval_integer1_ (ffebld_right (expr)));
00766 break;
00767
00768 case FFEBLD_opSUBTRACT:
00769 error = ffetarget_subtract_integer1 (&result,
00770 ffedata_eval_integer1_ (ffebld_left (expr)),
00771 ffedata_eval_integer1_ (ffebld_right (expr)));
00772 break;
00773
00774 case FFEBLD_opMULTIPLY:
00775 error = ffetarget_multiply_integer1 (&result,
00776 ffedata_eval_integer1_ (ffebld_left (expr)),
00777 ffedata_eval_integer1_ (ffebld_right (expr)));
00778 break;
00779
00780 case FFEBLD_opDIVIDE:
00781 error = ffetarget_divide_integer1 (&result,
00782 ffedata_eval_integer1_ (ffebld_left (expr)),
00783 ffedata_eval_integer1_ (ffebld_right (expr)));
00784 break;
00785
00786 case FFEBLD_opPOWER:
00787 {
00788 ffebld r = ffebld_right (expr);
00789
00790 if ((ffeinfo_basictype (ffebld_info (r)) != FFEINFO_basictypeINTEGER)
00791 || (ffeinfo_kindtype (ffebld_info (r)) != FFEINFO_kindtypeINTEGERDEFAULT))
00792 error = FFEBAD_DATA_EVAL;
00793 else
00794 error = ffetarget_power_integerdefault_integerdefault (&result,
00795 ffedata_eval_integer1_ (ffebld_left (expr)),
00796 ffedata_eval_integer1_ (r));
00797 }
00798 break;
00799
00800 #if 0
00801 case FFEBLD_opCONCATENATE:
00802 error =;
00803 break;
00804 #endif
00805
00806 case FFEBLD_opNOT:
00807 error = ffetarget_not_integer1 (&result,
00808 ffedata_eval_integer1_ (ffebld_left (expr)));
00809 break;
00810
00811 #if 0
00812 case FFEBLD_opLT:
00813 error =;
00814 break;
00815
00816 case FFEBLD_opLE:
00817 error =;
00818 break;
00819
00820 case FFEBLD_opEQ:
00821 error =;
00822 break;
00823
00824 case FFEBLD_opNE:
00825 error =;
00826 break;
00827
00828 case FFEBLD_opGT:
00829 error =;
00830 break;
00831
00832 case FFEBLD_opGE:
00833 error =;
00834 break;
00835 #endif
00836
00837 case FFEBLD_opAND:
00838 error = ffetarget_and_integer1 (&result,
00839 ffedata_eval_integer1_ (ffebld_left (expr)),
00840 ffedata_eval_integer1_ (ffebld_right (expr)));
00841 break;
00842
00843 case FFEBLD_opOR:
00844 error = ffetarget_or_integer1 (&result,
00845 ffedata_eval_integer1_ (ffebld_left (expr)),
00846 ffedata_eval_integer1_ (ffebld_right (expr)));
00847 break;
00848
00849 case FFEBLD_opXOR:
00850 error = ffetarget_xor_integer1 (&result,
00851 ffedata_eval_integer1_ (ffebld_left (expr)),
00852 ffedata_eval_integer1_ (ffebld_right (expr)));
00853 break;
00854
00855 case FFEBLD_opEQV:
00856 error = ffetarget_eqv_integer1 (&result,
00857 ffedata_eval_integer1_ (ffebld_left (expr)),
00858 ffedata_eval_integer1_ (ffebld_right (expr)));
00859 break;
00860
00861 case FFEBLD_opNEQV:
00862 error = ffetarget_neqv_integer1 (&result,
00863 ffedata_eval_integer1_ (ffebld_left (expr)),
00864 ffedata_eval_integer1_ (ffebld_right (expr)));
00865 break;
00866
00867 case FFEBLD_opPAREN:
00868 return ffedata_eval_integer1_ (ffebld_left (expr));
00869
00870 #if 0
00871 case FFEBLD_opPERCENT_LOC:
00872 error =;
00873 break;
00874 #endif
00875
00876 #if 0
00877
00878 case FFEBLD_opCONVERT:
00879 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
00880 {
00881 case FFEINFO_basictypeINTEGER:
00882 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
00883 {
00884 default:
00885 error = FFEBAD_DATA_EVAL;
00886 break;
00887 }
00888 break;
00889
00890 case FFEINFO_basictypeREAL:
00891 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
00892 {
00893 default:
00894 error = FFEBAD_DATA_EVAL;
00895 break;
00896 }
00897 break;
00898 }
00899 break;
00900 #endif
00901
00902 #if 0
00903 case FFEBLD_opREPEAT:
00904 error =;
00905 break;
00906
00907 case FFEBLD_opBOUNDS:
00908 error =;
00909 break;
00910 #endif
00911
00912 #if 0
00913
00914 case FFEBLD_opFUNCREF:
00915 error =;
00916 break;
00917 #endif
00918
00919 #if 0
00920 case FFEBLD_opSUBRREF:
00921 error =;
00922 break;
00923
00924 case FFEBLD_opARRAYREF:
00925 error =;
00926 break;
00927 #endif
00928
00929 #if 0
00930 case FFEBLD_opSUBSTR:
00931 error =;
00932 break;
00933 #endif
00934
00935 default:
00936 error = FFEBAD_DATA_EVAL;
00937 break;
00938 }
00939
00940 if (error != FFEBAD)
00941 {
00942 ffebad_start (error);
00943 ffest_ffebad_here_current_stmt (0);
00944 ffebad_finish ();
00945 result = 0;
00946 }
00947
00948 return result;
00949 }
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962 static ffetargetOffset
00963 ffedata_eval_offset_ (ffebld subscripts, ffebld dims)
00964 {
00965 ffetargetIntegerDefault offset = 0;
00966 ffetargetIntegerDefault width = 1;
00967 ffetargetIntegerDefault value;
00968 ffetargetIntegerDefault lowbound;
00969 ffetargetIntegerDefault highbound;
00970 ffetargetOffset final;
00971 ffebld subscript;
00972 ffebld dim;
00973 ffebld low;
00974 ffebld high;
00975 int rank = 0;
00976 bool ok;
00977
00978 while (subscripts != NULL)
00979 {
00980 ffeinfoKindtype sub_kind, low_kind, hi_kind;
00981 ffebld sub1, low1, hi1;
00982
00983 ++rank;
00984 assert (dims != NULL);
00985
00986 subscript = ffebld_head (subscripts);
00987 dim = ffebld_head (dims);
00988
00989 assert (ffeinfo_basictype (ffebld_info (subscript)) == FFEINFO_basictypeINTEGER);
00990 if (ffebld_op (subscript) == FFEBLD_opCONTER)
00991 {
00992
00993 sub_kind = ffeinfo_kindtype (ffebld_info (subscript));
00994 sub1 = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val (
00995 sub_kind == FFEINFO_kindtypeINTEGER2 ? subscript->u.conter.expr->u.integer2 :
00996 sub_kind == FFEINFO_kindtypeINTEGER3 ? subscript->u.conter.expr->u.integer3 :
00997 sub_kind == FFEINFO_kindtypeINTEGER4 ? subscript->u.conter.expr->u.integer4 :
00998 subscript->u.conter.expr->u.integer1), NULL);
00999 value = ffedata_eval_integer1_ (sub1);
01000 }
01001 else
01002 value = ffedata_eval_integer1_ (subscript);
01003
01004 assert (ffebld_op (dim) == FFEBLD_opBOUNDS);
01005 low = ffebld_left (dim);
01006 high = ffebld_right (dim);
01007
01008 if (low == NULL)
01009 lowbound = 1;
01010 else
01011 {
01012 assert (ffeinfo_basictype (ffebld_info (low)) == FFEINFO_basictypeINTEGER);
01013 if (ffebld_op (low) == FFEBLD_opCONTER)
01014 {
01015
01016 low_kind = ffeinfo_kindtype (ffebld_info (low));
01017 low1 = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val (
01018 low_kind == FFEINFO_kindtypeINTEGER2 ? low->u.conter.expr->u.integer2 :
01019 low_kind == FFEINFO_kindtypeINTEGER3 ? low->u.conter.expr->u.integer3 :
01020 low_kind == FFEINFO_kindtypeINTEGER4 ? low->u.conter.expr->u.integer4 :
01021 low->u.conter.expr->u.integer1), NULL);
01022 lowbound = ffedata_eval_integer1_ (low1);
01023 }
01024 else
01025 lowbound = ffedata_eval_integer1_ (low);
01026 }
01027
01028 assert (ffeinfo_basictype (ffebld_info (high)) == FFEINFO_basictypeINTEGER);
01029 if (ffebld_op (high) == FFEBLD_opCONTER)
01030 {
01031
01032 hi_kind = ffeinfo_kindtype (ffebld_info (high));
01033 hi1 = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val (
01034 hi_kind == FFEINFO_kindtypeINTEGER2 ? high->u.conter.expr->u.integer2 :
01035 hi_kind == FFEINFO_kindtypeINTEGER3 ? high->u.conter.expr->u.integer3 :
01036 hi_kind == FFEINFO_kindtypeINTEGER4 ? high->u.conter.expr->u.integer4 :
01037 high->u.conter.expr->u.integer1), NULL);
01038 highbound = ffedata_eval_integer1_ (hi1);
01039 }
01040 else
01041 highbound = ffedata_eval_integer1_ (high);
01042
01043 if ((value < lowbound) || (value > highbound))
01044 {
01045 char rankstr[10];
01046
01047 sprintf (rankstr, "%d", rank);
01048 value = lowbound;
01049 ffebad_start (FFEBAD_DATA_SUBSCRIPT);
01050 ffebad_string (ffesymbol_text (ffedata_symbol_));
01051 ffebad_string (rankstr);
01052 ffebad_finish ();
01053 }
01054
01055 subscripts = ffebld_trail (subscripts);
01056 dims = ffebld_trail (dims);
01057
01058 offset += width * (value - lowbound);
01059 if (subscripts != NULL)
01060 width *= highbound - lowbound + 1;
01061 }
01062
01063 assert (dims == NULL);
01064
01065 ok = ffetarget_offset (&final, offset);
01066 assert (ok);
01067
01068 return final;
01069 }
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082 static ffetargetCharacterSize
01083 ffedata_eval_substr_begin_ (ffebld expr)
01084 {
01085 ffetargetIntegerDefault val;
01086
01087 if (expr == NULL)
01088 return 0;
01089
01090 assert (ffeinfo_basictype (ffebld_info (expr)) == FFEINFO_basictypeINTEGER);
01091 assert (ffeinfo_kindtype (ffebld_info (expr)) == FFEINFO_kindtypeINTEGERDEFAULT);
01092
01093 val = ffedata_eval_integer1_ (expr);
01094
01095 if (val < 1)
01096 {
01097 val = 1;
01098 ffebad_start (FFEBAD_DATA_RANGE);
01099 ffest_ffebad_here_current_stmt (0);
01100 ffebad_string (ffesymbol_text (ffedata_symbol_));
01101 ffebad_finish ();
01102 ffedata_reported_error_ = TRUE;
01103 }
01104
01105 return val - 1;
01106 }
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121 static ffetargetCharacterSize
01122 ffedata_eval_substr_end_ (ffebld expr, ffetargetCharacterSize min,
01123 ffetargetCharacterSize max)
01124 {
01125 ffetargetIntegerDefault val;
01126
01127 if (expr == NULL)
01128 return max - 1;
01129
01130 assert (ffeinfo_basictype (ffebld_info (expr)) == FFEINFO_basictypeINTEGER);
01131 assert (ffeinfo_kindtype (ffebld_info (expr)) == FFEINFO_kindtypeINTEGER1);
01132
01133 val = ffedata_eval_integer1_ (expr);
01134
01135 if ((val < (ffetargetIntegerDefault) min)
01136 || (val > (ffetargetIntegerDefault) max))
01137 {
01138 val = 1;
01139 ffebad_start (FFEBAD_DATA_RANGE);
01140 ffest_ffebad_here_current_stmt (0);
01141 ffebad_string (ffesymbol_text (ffedata_symbol_));
01142 ffebad_finish ();
01143 ffedata_reported_error_ = TRUE;
01144 }
01145
01146 return val - 1;
01147 }
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158 static void
01159 ffedata_gather_ (ffestorag mst, ffestorag st)
01160 {
01161 ffesymbol s;
01162 ffesymbol s_whine;
01163 ffebld b;
01164 ffetargetOffset offset;
01165 ffetargetOffset units_expected;
01166 ffebitCount actual;
01167 ffebldConstantArray array;
01168 ffebld accter;
01169 ffetargetCopyfunc fn;
01170 void *ptr1;
01171 void *ptr2;
01172 size_t size;
01173 ffeinfoBasictype bt;
01174 ffeinfoKindtype kt;
01175 ffeinfoBasictype ign_bt;
01176 ffeinfoKindtype ign_kt;
01177 ffetargetAlign units;
01178 ffebit bits;
01179 ffetargetOffset source_offset;
01180 bool whine = FALSE;
01181
01182 if (st == NULL)
01183 return;
01184
01185 s = ffestorag_symbol (st);
01186
01187 assert (s != NULL);
01188
01189 assert (ffestorag_init (st) == NULL);
01190 assert (ffestorag_accretion (st) == NULL);
01191
01192 if ((((b = ffesymbol_init (s)) == NULL)
01193 && ((b = ffesymbol_accretion (s)) == NULL))
01194 || (ffebld_op (b) == FFEBLD_opANY)
01195 || ((ffebld_op (b) == FFEBLD_opCONVERT)
01196 && (ffebld_op (ffebld_left (b)) == FFEBLD_opANY)))
01197 return;
01198
01199
01200
01201 ffesymbol_set_init (s, NULL);
01202 ffesymbol_set_accretion (s, NULL);
01203 ffesymbol_set_accretes (s, 0);
01204
01205 s_whine = ffestorag_symbol (mst);
01206 if (s_whine == NULL)
01207 s_whine = s;
01208
01209
01210
01211 if (ffestorag_init (mst) != NULL)
01212 {
01213 ffebad_start (FFEBAD_DATA_MULTIPLE);
01214 ffebad_here (0, ffewhere_line_unknown (), ffewhere_column_unknown ());
01215 ffebad_string (ffesymbol_text (s_whine));
01216 ffebad_finish ();
01217 return;
01218 }
01219
01220 bt = ffeinfo_basictype (ffebld_info (b));
01221 kt = ffeinfo_kindtype (ffebld_info (b));
01222
01223
01224
01225 ffedata_charexpected_ = (bt == FFEINFO_basictypeCHARACTER)
01226 ? ffebld_size (b) : 1;
01227 ffetarget_aggregate_info (&ign_bt, &ign_kt, &units, bt,
01228 kt);
01229 assert (units % ffedata_storage_units_ == 0);
01230 units_expected = ffedata_charexpected_ * units / ffedata_storage_units_;
01231 offset = (ffestorag_offset (st) - ffestorag_offset (mst))
01232 / ffedata_storage_units_;
01233
01234
01235
01236 if (ffestorag_accretion (mst) == NULL)
01237 {
01238 #if FFEDATA_sizeTOO_BIG_INIT_ != 0
01239 if (ffedata_storage_size_ >= FFEDATA_sizeTOO_BIG_INIT_)
01240 {
01241 char bignum[40];
01242
01243 sprintf (&bignum[0], "%ld", (long) ffedata_storage_size_);
01244 ffebad_start (FFEBAD_TOO_BIG_INIT);
01245 ffebad_here (0, ffesymbol_where_line (s_whine),
01246 ffesymbol_where_column (s_whine));
01247 ffebad_string (ffesymbol_text (s_whine));
01248 ffebad_string (bignum);
01249 ffebad_finish ();
01250 }
01251 #endif
01252 array = ffebld_constantarray_new (ffedata_storage_bt_,
01253 ffedata_storage_kt_, ffedata_storage_size_);
01254 accter = ffebld_new_accter (array, ffebit_new (ffe_pool_program_unit (),
01255 ffedata_storage_size_));
01256 ffebld_set_info (accter, ffeinfo_new
01257 (ffedata_storage_bt_,
01258 ffedata_storage_kt_,
01259 1,
01260 FFEINFO_kindENTITY,
01261 FFEINFO_whereCONSTANT,
01262 (ffedata_basictype_ == FFEINFO_basictypeCHARACTER)
01263 ? 1 : FFETARGET_charactersizeNONE));
01264 ffestorag_set_accretion (mst, accter);
01265 ffestorag_set_accretes (mst, ffedata_storage_size_);
01266 }
01267 else
01268 {
01269 accter = ffestorag_accretion (mst);
01270 assert (ffedata_storage_size_ == (ffetargetOffset) ffebld_accter_size (accter));
01271 array = ffebld_accter (accter);
01272 }
01273
01274
01275
01276 fn = ffetarget_aggregate_ptr_memcpy (ffedata_storage_bt_, ffedata_storage_kt_,
01277 bt, kt);
01278
01279 switch (ffebld_op (b))
01280 {
01281 case FFEBLD_opCONTER:
01282 ffebld_constantarray_prepare (&ptr1, &ptr2, &size, array, ffedata_storage_bt_,
01283 ffedata_storage_kt_, offset,
01284 ffebld_constant_ptr_to_union (ffebld_conter (b)),
01285 bt, kt);
01286 (*fn) (ptr1, ptr2, size);
01287
01288 ffebit_count (ffebld_accter_bits (accter),
01289 offset, FALSE, units_expected, &actual);
01290 if (units_expected != (ffetargetOffset) actual)
01291 {
01292 ffebad_start (FFEBAD_DATA_MULTIPLE);
01293 ffebad_here (0, ffewhere_line_unknown (), ffewhere_column_unknown ());
01294 ffebad_string (ffesymbol_text (s));
01295 ffebad_finish ();
01296 }
01297 ffestorag_set_accretes (mst,
01298 ffestorag_accretes (mst)
01299 - actual);
01300
01301 ffebit_set (ffebld_accter_bits (accter), offset, 1, units_expected);
01302
01303
01304
01305 if (ffestorag_accretes (mst) == 0)
01306 {
01307 ffestorag_set_init (mst, accter);
01308 ffestorag_set_accretion (mst, NULL);
01309 ffebit_kill (ffebld_accter_bits (ffestorag_init (mst)));
01310 ffebld_set_op (ffestorag_init (mst), FFEBLD_opARRTER);
01311 ffebld_set_arrter (ffestorag_init (mst),
01312 ffebld_accter (ffestorag_init (mst)));
01313 ffebld_arrter_set_size (ffestorag_init (mst),
01314 ffedata_storage_size_);
01315 ffebld_arrter_set_pad (ffestorag_init (mst), 0);
01316 ffecom_notify_init_storage (mst);
01317 }
01318
01319 return;
01320
01321 case FFEBLD_opARRTER:
01322 ffebld_constantarray_preparray (&ptr1, &ptr2, &size, array, ffedata_storage_bt_,
01323 ffedata_storage_kt_, offset, ffebld_arrter (b),
01324 bt, kt);
01325 size *= ffebld_arrter_size (b);
01326 units_expected *= ffebld_arrter_size (b);
01327 (*fn) (ptr1, ptr2, size);
01328
01329 ffebit_count (ffebld_accter_bits (accter),
01330 offset, FALSE, units_expected, &actual);
01331 if (units_expected != (ffetargetOffset) actual)
01332 {
01333 ffebad_start (FFEBAD_DATA_MULTIPLE);
01334 ffebad_here (0, ffewhere_line_unknown (), ffewhere_column_unknown ());
01335 ffebad_string (ffesymbol_text (s));
01336 ffebad_finish ();
01337 }
01338 ffestorag_set_accretes (mst,
01339 ffestorag_accretes (mst)
01340 - actual);
01341
01342 ffebit_set (ffebld_accter_bits (accter), offset, 1, units_expected);
01343
01344
01345
01346 if (ffestorag_accretes (mst) == 0)
01347 {
01348 ffestorag_set_init (mst, accter);
01349 ffestorag_set_accretion (mst, NULL);
01350 ffebit_kill (ffebld_accter_bits (ffestorag_init (mst)));
01351 ffebld_set_op (ffestorag_init (mst), FFEBLD_opARRTER);
01352 ffebld_set_arrter (ffestorag_init (mst),
01353 ffebld_accter (ffestorag_init (mst)));
01354 ffebld_arrter_set_size (ffestorag_init (mst),
01355 ffedata_storage_size_);
01356 ffebld_arrter_set_pad (ffestorag_init (mst), 0);
01357 ffecom_notify_init_storage (mst);
01358 }
01359
01360 return;
01361
01362 case FFEBLD_opACCTER:
01363 ffebld_constantarray_preparray (&ptr1, &ptr2, &size, array, ffedata_storage_bt_,
01364 ffedata_storage_kt_, offset, ffebld_accter (b),
01365 bt, kt);
01366 bits = ffebld_accter_bits (b);
01367 source_offset = 0;
01368
01369 for (;;)
01370 {
01371 ffetargetOffset unexp;
01372 ffetargetOffset siz;
01373 ffebitCount length;
01374 bool value;
01375
01376 ffebit_test (bits, source_offset, &value, &length);
01377 if (length == 0)
01378 break;
01379 siz = size * length;
01380 unexp = units_expected * length;
01381 if (value)
01382 {
01383 (*fn) (ptr1, ptr2, siz);
01384 ffebit_count (ffebld_accter_bits (accter),
01385 offset, FALSE, unexp, &actual);
01386 if (!whine && (unexp != (ffetargetOffset) actual))
01387 {
01388 whine = TRUE;
01389 ffebad_start (FFEBAD_DATA_MULTIPLE);
01390 ffebad_here (0, ffewhere_line_unknown (), ffewhere_column_unknown ());
01391 ffebad_string (ffesymbol_text (s));
01392 ffebad_finish ();
01393 }
01394 ffestorag_set_accretes (mst,
01395 ffestorag_accretes (mst)
01396 - actual);
01397
01398 ffebit_set (ffebld_accter_bits (accter), offset, 1, unexp);
01399 }
01400 source_offset += length;
01401 offset += unexp;
01402 ptr1 = ((char *) ptr1) + siz;
01403 ptr2 = ((char *) ptr2) + siz;
01404 }
01405
01406
01407
01408 if (ffestorag_accretes (mst) == 0)
01409 {
01410 ffestorag_set_init (mst, accter);
01411 ffestorag_set_accretion (mst, NULL);
01412 ffebit_kill (ffebld_accter_bits (ffestorag_init (mst)));
01413 ffebld_set_op (ffestorag_init (mst), FFEBLD_opARRTER);
01414 ffebld_set_arrter (ffestorag_init (mst),
01415 ffebld_accter (ffestorag_init (mst)));
01416 ffebld_arrter_set_size (ffestorag_init (mst),
01417 ffedata_storage_size_);
01418 ffebld_arrter_set_pad (ffestorag_init (mst), 0);
01419 ffecom_notify_init_storage (mst);
01420 }
01421
01422 return;
01423
01424 default:
01425 assert ("bad init op in gather_" == NULL);
01426 return;
01427 }
01428 }
01429
01430
01431
01432
01433
01434 static void
01435 ffedata_pop_ ()
01436 {
01437 ffedataImpdo_ victim = ffedata_stack_;
01438
01439 assert (victim != NULL);
01440
01441 ffedata_stack_ = ffedata_stack_->outer;
01442
01443 malloc_kill_ks (ffe_pool_program_unit (), victim, sizeof (*victim));
01444 }
01445
01446
01447
01448
01449
01450 static void
01451 ffedata_push_ ()
01452 {
01453 ffedataImpdo_ baby;
01454
01455 baby = malloc_new_ks (ffe_pool_program_unit (), "ffedataImpdo_", sizeof (*baby));
01456
01457 baby->outer = ffedata_stack_;
01458 ffedata_stack_ = baby;
01459 }
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471 static bool
01472 ffedata_value_ (ffebld value, ffelexToken token)
01473 {
01474
01475
01476
01477 if (ffedata_reported_error_)
01478 return FALSE;
01479
01480
01481
01482
01483 if ((value != NULL)
01484 && (ffebld_op (value) == FFEBLD_opANY))
01485 {
01486 ffedata_reported_error_ = TRUE;
01487 return FALSE;
01488 }
01489
01490
01491
01492 if (ffedata_symbol_ == NULL)
01493 {
01494 ffebad_start (FFEBAD_DATA_TOOMANY);
01495 ffebad_here (0, ffelex_token_where_line (token),
01496 ffelex_token_where_column (token));
01497 ffebad_finish ();
01498 ffedata_reported_error_ = TRUE;
01499 return FALSE;
01500 }
01501
01502
01503
01504
01505
01506 if (ffedata_reinit_)
01507 {
01508 ffebad_start (FFEBAD_DATA_REINIT);
01509 ffebad_here (0, ffelex_token_where_line (token),
01510 ffelex_token_where_column (token));
01511 ffebad_string (ffesymbol_text (ffedata_symbol_));
01512 ffebad_finish ();
01513 ffedata_reported_error_ = TRUE;
01514 return FALSE;
01515 }
01516
01517 #if FFEGLOBAL_ENABLED
01518 if (ffesymbol_common (ffedata_symbol_) != NULL)
01519 ffeglobal_init_common (ffesymbol_common (ffedata_symbol_), token);
01520 #endif
01521
01522
01523
01524 if (value != NULL)
01525 {
01526 if (ffedata_convert_cache_use_ == -1)
01527 value = ffeexpr_convert
01528 (value, token, NULL, ffedata_basictype_,
01529 ffedata_kindtype_, 0,
01530 (ffedata_basictype_ == FFEINFO_basictypeCHARACTER)
01531 ? ffedata_charexpected_ : FFETARGET_charactersizeNONE,
01532 FFEEXPR_contextDATA);
01533 else
01534 value = ffedata_convert_
01535 (value, token, NULL, ffedata_basictype_,
01536 ffedata_kindtype_, 0,
01537 (ffedata_basictype_ == FFEINFO_basictypeCHARACTER)
01538 ? ffedata_charexpected_ : FFETARGET_charactersizeNONE);
01539 }
01540
01541
01542
01543 if ((value != NULL) && (ffebld_op (value) == FFEBLD_opANY))
01544 {
01545 ffedata_reported_error_ = TRUE;
01546 return FALSE;
01547 }
01548
01549
01550
01551 if (ffedata_storage_ != NULL)
01552 {
01553 ffetargetOffset offset;
01554 ffetargetOffset units_expected;
01555 ffebitCount actual;
01556 ffebldConstantArray array;
01557 ffebld accter;
01558 ffetargetCopyfunc fn;
01559 void *ptr1;
01560 void *ptr2;
01561 size_t size;
01562 ffeinfoBasictype ign_bt;
01563 ffeinfoKindtype ign_kt;
01564 ffetargetAlign units;
01565
01566
01567
01568 if (ffestorag_init (ffedata_storage_) != NULL)
01569 {
01570 ffebad_start (FFEBAD_DATA_MULTIPLE);
01571 ffebad_here (0, ffelex_token_where_line (token),
01572 ffelex_token_where_column (token));
01573 ffebad_string (ffesymbol_text (ffedata_symbol_));
01574 ffebad_finish ();
01575 ffedata_reported_error_ = TRUE;
01576 return FALSE;
01577 }
01578
01579
01580
01581 offset = ffedata_offset_ * ffedata_size_ + ffedata_charoffset_;
01582
01583
01584
01585 if (offset + ffedata_charexpected_ - 1 > ffedata_symbolsize_)
01586 {
01587 ffebad_start (FFEBAD_DATA_RANGE);
01588 ffest_ffebad_here_current_stmt (0);
01589 ffebad_string (ffesymbol_text (ffedata_symbol_));
01590 ffebad_finish ();
01591 ffedata_reported_error_ = TRUE;
01592 return FALSE;
01593 }
01594
01595
01596
01597 ffetarget_aggregate_info (&ign_bt, &ign_kt, &units, ffedata_basictype_,
01598 ffedata_kindtype_);
01599
01600 assert (units % ffedata_storage_units_ == 0);
01601 units_expected = ffedata_charexpected_ * units / ffedata_storage_units_;
01602 offset *= units / ffedata_storage_units_;
01603 offset += (ffestorag_offset (ffesymbol_storage (ffedata_symbol_))
01604 - ffestorag_offset (ffedata_storage_))
01605 / ffedata_storage_units_;
01606
01607 assert (offset + units_expected - 1 <= ffedata_storage_size_);
01608
01609
01610
01611 if (value != NULL)
01612 {
01613 if (ffestorag_accretion (ffedata_storage_) == NULL)
01614 {
01615 #if FFEDATA_sizeTOO_BIG_INIT_ != 0
01616 if (ffedata_storage_size_ >= FFEDATA_sizeTOO_BIG_INIT_)
01617 {
01618 char bignum[40];
01619
01620 sprintf (&bignum[0], "%ld", (long) ffedata_storage_size_);
01621 ffebad_start (FFEBAD_TOO_BIG_INIT);
01622 ffebad_here (0, ffelex_token_where_line (token),
01623 ffelex_token_where_column (token));
01624 ffebad_string (ffesymbol_text (ffedata_symbol_));
01625 ffebad_string (bignum);
01626 ffebad_finish ();
01627 }
01628 #endif
01629 array = ffebld_constantarray_new
01630 (ffedata_storage_bt_, ffedata_storage_kt_,
01631 ffedata_storage_size_);
01632 accter = ffebld_new_accter (array,
01633 ffebit_new (ffe_pool_program_unit (),
01634 ffedata_storage_size_));
01635 ffebld_set_info (accter, ffeinfo_new
01636 (ffedata_storage_bt_,
01637 ffedata_storage_kt_,
01638 1,
01639 FFEINFO_kindENTITY,
01640 FFEINFO_whereCONSTANT,
01641 (ffedata_basictype_
01642 == FFEINFO_basictypeCHARACTER)
01643 ? 1 : FFETARGET_charactersizeNONE));
01644 ffestorag_set_accretion (ffedata_storage_, accter);
01645 ffestorag_set_accretes (ffedata_storage_, ffedata_storage_size_);
01646 }
01647 else
01648 {
01649 accter = ffestorag_accretion (ffedata_storage_);
01650 assert (ffedata_storage_size_ == (ffetargetOffset) ffebld_accter_size (accter));
01651 array = ffebld_accter (accter);
01652 }
01653
01654
01655
01656 fn = ffetarget_aggregate_ptr_memcpy
01657 (ffedata_storage_bt_, ffedata_storage_kt_,
01658 ffedata_basictype_, ffedata_kindtype_);
01659 ffebld_constantarray_prepare
01660 (&ptr1, &ptr2, &size, array, ffedata_storage_bt_,
01661 ffedata_storage_kt_, offset,
01662 ffebld_constant_ptr_to_union (ffebld_conter (value)),
01663 ffedata_basictype_, ffedata_kindtype_);
01664 (*fn) (ptr1, ptr2, size);
01665
01666 ffebit_count (ffebld_accter_bits (accter),
01667 offset, FALSE, units_expected,
01668 &actual);
01669 if (units_expected != (ffetargetOffset) actual)
01670 {
01671 ffebad_start (FFEBAD_DATA_MULTIPLE);
01672 ffebad_here (0, ffelex_token_where_line (token),
01673 ffelex_token_where_column (token));
01674 ffebad_string (ffesymbol_text (ffedata_symbol_));
01675 ffebad_finish ();
01676 }
01677 ffestorag_set_accretes (ffedata_storage_,
01678 ffestorag_accretes (ffedata_storage_)
01679 - actual);
01680
01681 ffebit_set (ffebld_accter_bits (accter), offset,
01682 1, units_expected);
01683
01684
01685
01686
01687 if (ffestorag_accretes (ffedata_storage_) == 0)
01688 {
01689 ffestorag_set_init (ffedata_storage_, accter);
01690 ffestorag_set_accretion (ffedata_storage_, NULL);
01691 ffebit_kill (ffebld_accter_bits
01692 (ffestorag_init (ffedata_storage_)));
01693 ffebld_set_op (ffestorag_init (ffedata_storage_),
01694 FFEBLD_opARRTER);
01695 ffebld_set_arrter
01696 (ffestorag_init (ffedata_storage_),
01697 ffebld_accter (ffestorag_init (ffedata_storage_)));
01698 ffebld_arrter_set_size (ffestorag_init (ffedata_storage_),
01699 ffedata_storage_size_);
01700 ffebld_arrter_set_pad (ffestorag_init (ffedata_storage_),
01701 0);
01702 ffecom_notify_init_storage (ffedata_storage_);
01703 }
01704 }
01705
01706
01707
01708 if (++ffedata_number_ < ffedata_expected_)
01709 {
01710 ++ffedata_offset_;
01711 return TRUE;
01712 }
01713
01714 return ffedata_advance_ ();
01715 }
01716
01717
01718
01719
01720 if ((ffedata_number_ != 0)
01721 || (ffedata_arraysize_ > 1)
01722 || (ffedata_charnumber_ != 0)
01723 || (ffedata_size_ > ffedata_charexpected_))
01724 {
01725 ffetargetOffset offset;
01726 ffebitCount actual;
01727 ffebldConstantArray array;
01728 ffebld accter = NULL;
01729
01730
01731
01732 offset = ffedata_offset_ * ffedata_size_ + ffedata_charoffset_;
01733
01734
01735
01736 if (offset + ffedata_charexpected_ - 1 > ffedata_symbolsize_)
01737 {
01738 ffebad_start (FFEBAD_DATA_RANGE);
01739 ffest_ffebad_here_current_stmt (0);
01740 ffebad_string (ffesymbol_text (ffedata_symbol_));
01741 ffebad_finish ();
01742 ffedata_reported_error_ = TRUE;
01743 return FALSE;
01744 }
01745
01746
01747
01748 if (value != NULL)
01749 {
01750 if (ffesymbol_accretion (ffedata_symbol_) == NULL)
01751 {
01752 #if FFEDATA_sizeTOO_BIG_INIT_ != 0
01753 if (ffedata_symbolsize_ >= FFEDATA_sizeTOO_BIG_INIT_ )
01754 {
01755 char bignum[40];
01756
01757 sprintf (&bignum[0], "%ld", (long) ffedata_symbolsize_);
01758 ffebad_start (FFEBAD_TOO_BIG_INIT);
01759 ffebad_here (0, ffelex_token_where_line (token),
01760 ffelex_token_where_column (token));
01761 ffebad_string (ffesymbol_text (ffedata_symbol_));
01762 ffebad_string (bignum);
01763 ffebad_finish ();
01764 }
01765 #endif
01766 array = ffebld_constantarray_new
01767 (ffedata_basictype_, ffedata_kindtype_,
01768 ffedata_symbolsize_);
01769 accter = ffebld_new_accter (array,
01770 ffebit_new (ffe_pool_program_unit (),
01771 ffedata_symbolsize_));
01772 ffebld_set_info (accter, ffeinfo_new
01773 (ffedata_basictype_,
01774 ffedata_kindtype_,
01775 1,
01776 FFEINFO_kindENTITY,
01777 FFEINFO_whereCONSTANT,
01778 (ffedata_basictype_
01779 == FFEINFO_basictypeCHARACTER)
01780 ? 1 : FFETARGET_charactersizeNONE));
01781 ffesymbol_set_accretion (ffedata_symbol_, accter);
01782 ffesymbol_set_accretes (ffedata_symbol_, ffedata_symbolsize_);
01783 }
01784 else
01785 {
01786 accter = ffesymbol_accretion (ffedata_symbol_);
01787 assert (ffedata_symbolsize_
01788 == (ffetargetOffset) ffebld_accter_size (accter));
01789 array = ffebld_accter (accter);
01790 }
01791
01792
01793
01794 ffebld_constantarray_put
01795 (array, ffedata_basictype_, ffedata_kindtype_,
01796 offset, ffebld_constant_union (ffebld_conter (value)));
01797 ffebit_count (ffebld_accter_bits (accter), offset, FALSE,
01798 ffedata_charexpected_,
01799 &actual);
01800 if (actual != (unsigned long int) ffedata_charexpected_)
01801 {
01802 ffebad_start (FFEBAD_DATA_MULTIPLE);
01803 ffebad_here (0, ffelex_token_where_line (token),
01804 ffelex_token_where_column (token));
01805 ffebad_string (ffesymbol_text (ffedata_symbol_));
01806 ffebad_finish ();
01807 }
01808 ffesymbol_set_accretes (ffedata_symbol_,
01809 ffesymbol_accretes (ffedata_symbol_)
01810 - actual);
01811
01812 ffebit_set (ffebld_accter_bits (accter), offset,
01813 1, ffedata_charexpected_);
01814 ffesymbol_signal_unreported (ffedata_symbol_);
01815 }
01816
01817
01818
01819 if (++ffedata_number_ < ffedata_expected_)
01820 {
01821 ++ffedata_offset_;
01822 return TRUE;
01823 }
01824
01825
01826
01827 if ((value != NULL)
01828 && (ffesymbol_accretes (ffedata_symbol_) == 0))
01829 {
01830 ffesymbol_set_init (ffedata_symbol_, accter);
01831 ffesymbol_set_accretion (ffedata_symbol_, NULL);
01832 ffebit_kill (ffebld_accter_bits (ffesymbol_init (ffedata_symbol_)));
01833 ffebld_set_op (ffesymbol_init (ffedata_symbol_), FFEBLD_opARRTER);
01834 ffebld_set_arrter (ffesymbol_init (ffedata_symbol_),
01835 ffebld_accter (ffesymbol_init (ffedata_symbol_)));
01836 ffebld_arrter_set_size (ffesymbol_init (ffedata_symbol_),
01837 ffedata_symbolsize_);
01838 ffebld_arrter_set_pad (ffestorag_init (ffedata_symbol_), 0);
01839 ffecom_notify_init_symbol (ffedata_symbol_);
01840 }
01841 }
01842 else if (value != NULL)
01843 {
01844
01845 ffesymbol_set_init (ffedata_symbol_, value);
01846 ffecom_notify_init_symbol (ffedata_symbol_);
01847 }
01848
01849
01850
01851 return ffedata_advance_ ();
01852 }