Lines Matching defs:edit

1 //===-- runtime/edit-output.cpp -------------------------------------------===//
9 #include "edit-output.h"
31 const DataEdit &edit, const unsigned char *data0, std::size_t bytes) {
69 int editWidth{edit.width.value_or(0)};
71 if (edit.digits && significant <= *edit.digits) { // Bw.m, Ow.m, Zw.m
72 if (*edit.digits == 0 && bytes == 0) {
75 leadingZeroes = *edit.digits - significant;
111 bool RT_API_ATTRS EditIntegerOutput(IoStatementState &io, const DataEdit &edit,
119 switch (edit.descriptor) {
126 if (isNegative || (edit.modes.editingFlags & signPlus)) {
137 io, edit, reinterpret_cast<const unsigned char *>(&n), KIND);
140 io, edit, reinterpret_cast<const unsigned char *>(&n), KIND);
143 io, edit, reinterpret_cast<const unsigned char *>(&n), KIND);
145 return EditLogicalOutput(io, edit, n != 0 ? true : false);
148 io, edit, reinterpret_cast<char *>(&n), sizeof n);
151 "Data edit descriptor '%c' may not be used with an INTEGER data item",
152 edit.descriptor);
158 int editWidth{edit.width.value_or(0)};
159 if (edit.descriptor == 'I' && edit.digits && digits <= *edit.digits) {
161 if (*edit.digits == 0 && n == 0) {
167 leadingZeroes = *edit.digits - digits;
177 if (edit.IsListDirected()) {
192 int expo, const DataEdit &edit, int &length) {
201 if (edit.expoDigits) {
202 if (int ed{*edit.expoDigits}) { // Ew.dEe with e > 0
210 } else if (edit.variation == 'X') {
221 if (edit.variation == 'X') {
223 } else if (edit.expoDigits || edit.IsListDirected() || exponent + 3 == eEnd) {
224 *--exponent = edit.descriptor == 'D' ? 'D' : 'E'; // not 'G' or 'Q'
231 const DataEdit &edit, std::size_t length, std::size_t width) {
232 if (edit.IsListDirected()) {
233 int prefixLength{edit.descriptor == DataEdit::ListDirectedRealPart ? 2
234 : edit.descriptor == DataEdit::ListDirectedImaginaryPart ? 0
236 int suffixLength{edit.descriptor == DataEdit::ListDirectedRealPart ||
237 edit.descriptor == DataEdit::ListDirectedImaginaryPart
251 RT_API_ATTRS bool RealOutputEditingBase::EmitSuffix(const DataEdit &edit) {
252 if (edit.descriptor == DataEdit::ListDirectedRealPart) {
254 io_, edit.modes.editingFlags & decimalComma ? ";" : ",", 1);
255 } else if (edit.descriptor == DataEdit::ListDirectedImaginaryPart) {
293 const DataEdit &edit) {
295 int editDigits{edit.digits.value_or(0)}; // 'd' field
296 int editWidth{edit.width.value_or(0)}; // 'w' field
299 if (edit.modes.editingFlags & signPlus) {
302 int scale{edit.modes.scale}; // 'kP' value
303 bool isEN{edit.variation == 'N'};
304 bool isES{edit.variation == 'S'};
306 if (edit.digits.has_value()) { // E0.d
341 } else if (edit.digits.value_or(1) == 0 && !edit.variation) {
344 "Output edit descriptor %cw.d must have d>0", edit.descriptor);
350 ConvertToDecimal(significantDigits, edit.modes.round, flags)};
356 : EmitPrefix(edit, converted.length, editWidth) &&
358 EmitRepeated(io_, ' ', trailingBlanks_) && EmitSuffix(edit);
390 FormatExponent(converted.decimalExponent, edit, expoLength)};
415 return EmitPrefix(edit, totalLength, width) &&
418 EmitAscii(io_, edit.modes.editingFlags & decimalComma ? "," : ".", 1) &&
423 EmitAscii(io_, exponent, expoLength) && EmitSuffix(edit);
429 RT_API_ATTRS bool RealOutputEditing<KIND>::EditFOutput(const DataEdit &edit) {
431 int fracDigits{edit.digits.value_or(0)}; // 'd' field
432 const int editWidth{edit.width.value_or(0)}; // 'w' field
433 enum decimal::FortranRounding rounding{edit.modes.round};
435 if (edit.modes.editingFlags & signPlus) {
439 if (!edit.digits.has_value()) { // F0
456 : EmitPrefix(edit, converted.length, editWidth) &&
458 EmitSuffix(edit);
460 int expo{converted.decimalExponent + edit.modes.scale /*kP*/};
471 if (!edit.digits.has_value()) { // F0
481 switch (edit.modes.round) {
553 return EmitPrefix(edit, totalLength, width) &&
556 EmitAscii(io_, edit.modes.editingFlags & decimalComma ? "," : ".", 1) &&
561 EmitRepeated(io_, ' ', trailingBlanks_) && EmitSuffix(edit);
567 RT_API_ATTRS DataEdit RealOutputEditing<KIND>::EditForGOutput(DataEdit edit) {
568 edit.descriptor = 'E';
569 edit.variation = 'G'; // to suppress error for Ew.0
570 int editWidth{edit.width.value_or(0)};
571 int significantDigits{edit.digits.value_or(
574 return edit; // Gw.0Ee -> Ew.0Ee for w > 0
577 if (edit.modes.editingFlags & signPlus) {
581 ConvertToDecimal(significantDigits, edit.modes.round, flags)};
583 return edit; // Inf/Nan -> Ew.d (same as Fw.d)
587 if (editWidth == 0 && !edit.expoDigits) { // G0.d -> G0.dE0
588 edit.expoDigits = 0;
590 return edit; // Ew.dEe
592 edit.descriptor = 'F';
593 edit.modes.scale = 0; // kP is ignored for G when no exponent field
596 int expoDigits{edit.expoDigits.value_or(0)};
603 if (edit.digits.has_value()) {
604 *edit.digits = std::max(0, *edit.digits - expo);
606 return edit;
612 const DataEdit &edit) {
614 ConvertToDecimal(1, edit.modes.round)};
616 DataEdit copy{edit};
627 DataEdit copy{edit};
632 return EditFOutput(edit);
704 RT_API_ATTRS bool RealOutputEditing<KIND>::EditEXOutput(const DataEdit &edit) {
706 int editDigits{edit.digits.value_or(0)}; // 'd' field
709 if (edit.modes.editingFlags & signPlus) {
712 int editWidth{edit.width.value_or(0)}; // 'w' field
713 if ((editWidth == 0 && !edit.digits) || editDigits == 0) {
721 ConvertToHexadecimal(significantDigits, edit.modes.round, flags)};
735 const char *exponent{FormatExponent(converted.exponent, edit, expoLength)};
748 io_, edit.modes.editingFlags & decimalComma ? "," : ".", 1) &&
756 RT_API_ATTRS bool RealOutputEditing<KIND>::Edit(const DataEdit &edit) {
757 const DataEdit *editPtr{&edit};
760 // Avoid recursive call as in Edit(EditForGOutput(edit)).
799 "Data edit descriptor '%c' may not be used with a REAL data item",
813 IoStatementState &io, const DataEdit &edit, bool truth) {
814 switch (edit.descriptor) {
817 return EmitRepeated(io, ' ', std::max(0, edit.width.value_or(1) - 1)) &&
820 return EditBOZOutput<1>(io, edit,
823 return EditBOZOutput<3>(io, edit,
826 return EditBOZOutput<4>(io, edit,
831 int width{edit.width.value_or(len)};
838 "Data edit descriptor '%c' may not be used with a LOGICAL data item",
839 edit.descriptor);
903 const DataEdit &edit, const CHAR *x, std::size_t length) {
905 int width{edit.width.value_or(len)};
906 switch (edit.descriptor) {
915 return EditBOZOutput<1>(io, edit,
918 return EditBOZOutput<3>(io, edit,
921 return EditBOZOutput<4>(io, edit,
924 return EditLogicalOutput(io, edit, *reinterpret_cast<const char *>(x));
927 "Data edit descriptor '%c' may not be used with a CHARACTER data item",
928 edit.descriptor);