Lines Matching defs:edit
1 //===-- runtime/edit-input.cpp --------------------------------------------===//
9 #include "edit-input.h"
25 const DataEdit &edit, char32_t ch) {
27 edit.modes.editingFlags & decimalComma ? char32_t{';'} : char32_t{','}};
29 (edit.IsNamelist() && (ch == '&' || ch == '$'));
33 IoStatementState &io, const DataEdit &edit) {
34 if (edit.IsListDirected()) {
37 if (IsCharValueSeparator(edit, *ch)) {
57 static inline RT_API_ATTRS char32_t GetSeparatorChar(const DataEdit &edit) {
58 return edit.modes.editingFlags & decimalComma ? char32_t{';'} : char32_t{','};
63 IoStatementState &io, const DataEdit &edit, void *n, std::size_t bytes) {
65 Fortran::common::optional<int> remaining{io.CueUpInput(edit)};
67 Fortran::common::optional<char32_t> next{io.NextInField(remaining, edit)};
71 next = io.NextInField(remaining, edit);
77 const char32_t comma{GetSeparatorChar(edit)};
78 for (; next; next = io.NextInField(remaining, edit)) {
81 if (edit.modes.editingFlags & blankZero) {
133 char32_t ch{io.NextInField(remaining, edit).value_or(' ')};
136 if (edit.modes.editingFlags & blankZero) {
162 return CheckCompleteListDirectedField(io, edit);
165 static inline RT_API_ATTRS char32_t GetRadixPointChar(const DataEdit &edit) {
166 return edit.modes.editingFlags & decimalComma ? char32_t{','} : char32_t{'.'};
171 const DataEdit &edit, Fortran::common::optional<char32_t> &next,
173 remaining = io.CueUpInput(edit);
174 next = io.NextInField(remaining, edit);
179 if (!edit.IsListDirected()) {
182 next = io.NextInField(remaining, edit);
188 RT_API_ATTRS bool EditIntegerInput(IoStatementState &io, const DataEdit &edit,
191 switch (edit.descriptor) {
201 return EditBOZInput<1>(io, edit, n, kind);
203 return EditBOZInput<3>(io, edit, n, kind);
205 return EditBOZInput<4>(io, edit, n, kind);
207 return EditCharacterInput(io, edit, reinterpret_cast<char *>(n), kind);
210 "Data edit descriptor '%c' may not be used with an INTEGER data item",
211 edit.descriptor);
216 char sign{ScanNumericPrefix(io, edit, next, remaining)};
224 const char32_t comma{GetSeparatorChar(edit)};
226 for (; next; next = io.NextInField(remaining, edit)) {
229 if (edit.modes.editingFlags & blankZero) {
241 if (edit.modes.inNamelist && ch == GetRadixPointChar(edit)) {
246 while ((next = io.NextInField(remaining, edit))) {
318 char *buffer, int bufferSize, IoStatementState &io, const DataEdit &edit) {
331 char sign{ScanNumericPrefix(io, edit, next, remaining)};
335 bool bzMode{(edit.modes.editingFlags & blankZero) != 0};
338 (!(edit.modes.editingFlags & decimalComma) && *next == ',')) {
339 if (!edit.IsListDirected() && !io.GetConnectionState().IsAtEOF()) {
348 char32_t radixPointChar{GetRadixPointChar(edit)};
356 next = io.NextInField(remaining, edit)) {
367 next = io.NextInField(remaining, edit);
384 next = io.NextInField(remaining, edit);
387 next = io.NextInField(remaining, edit);
397 for (; next; next = io.NextInField(remaining, edit)) {
436 next = io.NextInField(remaining, edit);
446 next = io.NextInField(remaining, edit);
454 next = io.NextInField(remaining, edit);
456 for (; next; next = io.NextInField(remaining, edit)) {
486 exponent = -edit.modes.scale;
496 // part of the edit descriptor must be interpreted as the number of
499 exponent += got - start - edit.digits.value_or(0);
504 if (edit.descriptor == DataEdit::ListDirectedImaginaryPart) {
507 next = io.NextInField(remaining, edit);
518 next = io.NextInField(remaining, edit);
520 if (next && (*next != ',' || (edit.modes.editingFlags & decimalComma))) {
574 IoStatementState &io, const DataEdit &edit, void *n) {
575 if (edit.modes.editingFlags & (blankZero | decimalComma)) {
578 if (edit.modes.scale != 0) {
592 std::min<std::int64_t>(got, edit.width.value_or(got))};
595 decimal::ConvertToBinary<PRECISION>(p, edit.modes.round, limit)};
599 if (edit.digits.value_or(0) != 0) {
613 if (edit.descriptor == DataEdit::ListDirectedImaginaryPart) {
622 } else if (edit.IsListDirected()) {
623 if (p < limit && !IsCharValueSeparator(edit, *p)) {
629 if (edit.width && p < str + *edit.width) {
763 IoStatementState &io, const DataEdit &edit, void *n) {
765 if (TryFastPathRealDecimalInput<binaryPrecision>(io, edit, n)) {
766 return CheckCompleteListDirectedField(io, edit);
773 auto scanned{ScanRealInput(buffer, maxDigits + 2, io, edit)};
792 p, edit.modes.round, scanned.exponent);
831 converted = decimal::ConvertToBinary<binaryPrecision>(p, edit.modes.round);
855 return CheckCompleteListDirectedField(io, edit);
860 IoStatementState &io, const DataEdit &edit, void *n) {
861 switch (edit.descriptor) {
866 return EditCommonRealInput<KIND>(io, edit, n);
873 return EditCommonRealInput<KIND>(io, edit, n);
875 return EditBOZInput<1>(io, edit, n,
878 return EditBOZInput<3>(io, edit, n,
881 return EditBOZInput<4>(io, edit, n,
884 return EditCharacterInput(io, edit, reinterpret_cast<char *>(n), KIND);
887 "Data edit descriptor '%c' may not be used for REAL input",
888 edit.descriptor);
895 IoStatementState &io, const DataEdit &edit, bool &x) {
896 switch (edit.descriptor) {
907 "Data edit descriptor '%c' may not be used for LOGICAL input",
908 edit.descriptor);
911 Fortran::common::optional<int> remaining{io.CueUpInput(edit)};
912 Fortran::common::optional<char32_t> next{io.NextInField(remaining, edit)};
914 next = io.NextInField(remaining, edit);
936 } else if (edit.descriptor == DataEdit::ListDirected) {
937 while (io.NextInField(remaining, edit)) { // discard rest of field
940 return CheckCompleteListDirectedField(io, edit);
980 IoStatementState &io, CHAR *x, std::size_t length, const DataEdit &edit) {
1002 isSep = edit.IsNamelist();
1005 isSep = !(edit.modes.editingFlags & decimalComma);
1008 isSep = !!(edit.modes.editingFlags & decimalComma);
1019 } else if (edit.IsNamelist()) {
1031 RT_API_ATTRS bool EditCharacterInput(IoStatementState &io, const DataEdit &edit,
1033 switch (edit.descriptor) {
1035 return EditListDirectedCharacterInput(io, x, lengthChars, edit);
1040 return EditBOZInput<1>(io, edit, x, lengthChars * sizeof *x);
1042 return EditBOZInput<3>(io, edit, x, lengthChars * sizeof *x);
1044 return EditBOZInput<4>(io, edit, x, lengthChars * sizeof *x);
1047 "Data edit descriptor '%c' may not be used with a CHARACTER data item",
1048 edit.descriptor);
1056 if (edit.width && *edit.width > 0) {
1057 remainingChars = *edit.width;
1072 (readyBytes < remainingChars && edit.modes.nonAdvancing)) {
1154 return CheckCompleteListDirectedField(io, edit);