void read_x (st_parameter_dt *dtp, int n) { if (!is_stream_io (dtp)) { if ((dtp->u.p.current_unit->flags.pad == PAD_NO || is_internal_unit (dtp)) && dtp->u.p.current_unit->bytes_left < n) n = dtp->u.p.current_unit->bytes_left; dtp->u.p.sf_read_comma = 0; if (n > 0) read_sf (dtp, &n, 1); dtp->u.p.sf_read_comma = 1; } else dtp->u.p.current_unit->strm_pos += (gfc_offset) n; }
void write_a_char4 (st_parameter_dt *dtp, const fnode *f, const char *source, int len) { int wlen; gfc_char4_t *q; wlen = f->u.string.length < 0 || (f->format == FMT_G && f->u.string.length == 0) ? len : f->u.string.length; q = (gfc_char4_t *) source; #ifdef HAVE_CRLF /* If this is formatted STREAM IO convert any embedded line feed characters to CR_LF on systems that use that sequence for newlines. See F2003 Standard sections 10.6.3 and 9.9 for further information. */ if (is_stream_io (dtp)) { const char crlf[] = "\r\n"; int i, bytes; gfc_char4_t *qq; bytes = 0; /* Write out any padding if needed. */ if (len < wlen) { char *p; p = write_block (dtp, wlen - len); if (p == NULL) return; memset (p, ' ', wlen - len); } /* Scan the source string looking for '\n' and convert it if found. */ qq = (gfc_char4_t *) source; for (i = 0; i < wlen; i++) { if (qq[i] == '\n') { /* Write out the previously scanned characters in the string. */ if (bytes > 0) { if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8) write_utf8_char4 (dtp, q, bytes, 0); else write_default_char4 (dtp, q, bytes, 0); bytes = 0; } /* Write out the CR_LF sequence. */ write_default_char4 (dtp, crlf, 2, 0); } else bytes++; } /* Write out any remaining bytes if no LF was found. */ if (bytes > 0) { if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8) write_utf8_char4 (dtp, q, bytes, 0); else write_default_char4 (dtp, q, bytes, 0); } } else { #endif if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8) write_utf8_char4 (dtp, q, len, wlen); else write_default_char4 (dtp, q, len, wlen); #ifdef HAVE_CRLF } #endif }
void write_a (st_parameter_dt *dtp, const fnode *f, const char *source, int len) { int wlen; char *p; wlen = f->u.string.length < 0 || (f->format == FMT_G && f->u.string.length == 0) ? len : f->u.string.length; #ifdef HAVE_CRLF /* If this is formatted STREAM IO convert any embedded line feed characters to CR_LF on systems that use that sequence for newlines. See F2003 Standard sections 10.6.3 and 9.9 for further information. */ if (is_stream_io (dtp)) { const char crlf[] = "\r\n"; int i, q, bytes; q = bytes = 0; /* Write out any padding if needed. */ if (len < wlen) { p = write_block (dtp, wlen - len); if (p == NULL) return; memset (p, ' ', wlen - len); } /* Scan the source string looking for '\n' and convert it if found. */ for (i = 0; i < wlen; i++) { if (source[i] == '\n') { /* Write out the previously scanned characters in the string. */ if (bytes > 0) { p = write_block (dtp, bytes); if (p == NULL) return; memcpy (p, &source[q], bytes); q += bytes; bytes = 0; } /* Write out the CR_LF sequence. */ q++; p = write_block (dtp, 2); if (p == NULL) return; memcpy (p, crlf, 2); } else bytes++; } /* Write out any remaining bytes if no LF was found. */ if (bytes > 0) { p = write_block (dtp, bytes); if (p == NULL) return; memcpy (p, &source[q], bytes); } } else { #endif p = write_block (dtp, wlen); if (p == NULL) return; if (wlen < len) memcpy (p, source, wlen); else { memset (p, ' ', wlen - len); memcpy (p + wlen - len, source, len); } #ifdef HAVE_CRLF } #endif }