00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _NLIBC_OS1_STDIO_H
00009 #define _NLIBC_OS1_STDIO_H
00010
00011 #include <nlibc.h>
00012
00013 #include <os1/defs_os1.h>
00014 #include <errno.h>
00015 #include <stddef.h>
00016 #include <string.h>
00017 #include <stdarg.h>
00018 #include <typecodes.h>
00019
00020
00021
00022
00023
00024
00025
00042
00043 #if !defined(__cflow_processed) || defined(_uses_write_int_stdio_os1_h)
00044 inline void write_int(int i)
00045 {
00046 asm("\t$io_start\n"
00047 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00048 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00049 "\t\\equl $fmt $SYS_IOFMT_INT\n"
00050 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_NL>\n"
00051 "\t\\equl $dev $SYS_IODEV_MEM\n"
00052 "\t\\equl $l 1\n"
00053 "\t\\equl $bs $SYS_IOBS_L\n"
00054 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00055 "\t\\equl $addr 0x0.%0\n"
00056 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, $addr)\n"
00057 "\t$io_end\n" : : "r" (&i));
00058 }
00059 #endif
00060
00061
00062
00079
00080
00081 #if !defined(__cflow_processed) || defined(_uses_write_int_array_stdio_os1_h)
00082 inline void write_int_array(int *ip, int size)
00083 {
00084 asm("\t$io_start\n"
00085 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00086 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00087 "\t\\equl $fmt $SYS_IOFMT_INT\n"
00088 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE>\n"
00089 "\t\\equl $dev $SYS_IODEV_MEM\n"
00090 "\t\\equl $l 0.%1\n"
00091 "\t\\equl $bs $SYS_IOBS_L\n"
00092 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00093 "\t$io_packet($cmd, <$fmt .or. $sep>, 0, $dev, $l, $bs, 0.%0)\n"
00094 "\t$io_end\n" : : "r" (ip), "r" (size) );
00095 }
00096 #endif
00097
00098
00099
00117
00118
00119 #if !defined(__cflow_processed) || defined(_uses_write_float_stdio_os1_h)
00120 inline void write_float(float f)
00121 {
00122 asm("\t$io_start\n"
00123 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00124 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00125 "\t\\equl $fmt $SYS_IOFMT_DBL\n"
00126 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_NL>\n"
00127 "\t\\equl $dev $SYS_IODEV_MEM\n"
00128 "\t\\equl $l 1\n"
00129 "\t\\equl $bs $SYS_IOBS_L\n"
00130 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00131 "\t\\equl $addr 0x0.%0\n"
00132 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, $addr)\n"
00133 "\t$io_end\n" : : "r" (&f));
00134 }
00135 #endif
00136
00137 #define write_double write_float
00138
00139
00140
00158
00159
00160 #if !defined(__cflow_processed) || defined(_uses_write_float_array_stdio_os1_h)
00161 inline void write_float_array(float *fp, int size)
00162 {
00163 asm("\t$io_start\n"
00164 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00165 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00166 "\t\\equl $fmt $SYS_IOFMT_DBL\n"
00167 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE>\n"
00168 "\t\\equl $dev $SYS_IODEV_MEM\n"
00169 "\t\\equl $l 0.%1\n"
00170 "\t\\equl $bs $SYS_IOBS_L\n"
00171 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00172 "\t$io_packet($cmd, <$fmt .or. $sep>, 0, $dev, $l, $bs, 0.%0)\n"
00173 "\t$io_end\n" : : "r" (fp), "r" (size) );
00174 }
00175 #endif
00176
00177
00178
00196
00197
00198 #if !defined(__cflow_processed) || defined(_uses_write_double_array_stdio_os1_h)
00199 inline void write_double_array(double *fp, int size)
00200 {
00201 asm("\t$io_start\n"
00202 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00203 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00204 "\t\\equl $fmt $SYS_IOFMT_DBL\n"
00205 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE>\n"
00206 "\t\\equl $dev $SYS_IODEV_MEM\n"
00207 "\t\\equl $l 0.%1\n"
00208 "\t\\equl $bs $SYS_IOBS_L\n"
00209 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00210 "\t$io_packet($cmd, <$fmt .or. $sep>, 0, $dev, $l, $bs, 0.%0)\n"
00211 "\t$io_end\n" : : "r" (fp), "r" (size) );
00212 }
00213 #endif
00214
00215
00216
00233
00234
00235 #if !defined(__cflow_processed) || defined(_uses_write_complex_stdio_os1_h)
00236 inline void write_complex(complex c)
00237 {
00238 asm("\t$io_start\n"
00239 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00240 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00241 "\t\\equl $fmt $SYS_IOFMT_DBL\n"
00242 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE .or. $SYS_IOBSEP_RBRACKET>\n"
00243 "\t\\equl $dev $SYS_IODEV_MEM\n"
00244 "\t\\equl $l 1\n"
00245 "\t\\equl $bs $SYS_IOBS_V\n"
00246 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00247 "\t\\equl $addr 0x0.%0\n"
00248 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, $addr)\n"
00249 "\t$io_end\n" : : "r" (&c));
00250 }
00251 #endif
00252
00253
00254
00272
00273
00274 #if !defined(__cflow_processed) || defined(_uses_write_complex_array_stdio_os1_h)
00275 inline void write_complex_array(complex *cp, int size)
00276 {
00277 asm("\t$io_start\n"
00278 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00279 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00280 "\t\\equl $fmt $SYS_IOFMT_DBL\n"
00281 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE .or. $SYS_IOBSEP_RBRACKET>\n"
00282 "\t\\equl $dev $SYS_IODEV_MEM\n"
00283 "\t\\equl $l 0.%1\n"
00284 "\t\\equl $bs $SYS_IOBS_V\n"
00285 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00286 "\t$io_packet($cmd, <$fmt .or. $sep>, 0, $dev, $l, $bs, 0.%0)\n"
00287 "\t$io_end\n" : : "r" (cp), "r" (size) );
00288 }
00289 #endif
00290
00291
00292
00309
00310
00311 #if !defined(__cflow_processed) || defined(_uses_write_vector_stdio_os1_h)
00312 inline void write_vector(vector v)
00313 {
00314 asm("\t$io_start\n"
00315 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00316 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00317 "\t\\equl $fmt $SYS_IOFMT_DBL\n"
00318 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE .or. $SYS_IOBSEP_RBRACKET>\n"
00319 "\t\\equl $dev $SYS_IODEV_MEM\n"
00320 "\t\\equl $l 1\n"
00321 "\t\\equl $bs $SYS_IOBS_V\n"
00322 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00323 "\t\\equl $addr 0x0.%0\n"
00324 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, $addr)\n"
00325 "\t$io_end\n" : : "r" (&v));
00326 }
00327 #endif
00328
00329
00330
00348
00349
00350 #if !defined(__cflow_processed) || defined(_uses_write_vector_array_stdio_os1_h)
00351 inline void write_vector_array(vector *vp, int size)
00352 {
00353 asm("\t$io_start\n"
00354 "\t$io_fd($SYS_IOFD_STDOUT)\n"
00355 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
00356 "\t\\equl $fmt $SYS_IOFMT_DBL\n"
00357 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE .or. $SYS_IOBSEP_RBRACKET>\n"
00358 "\t\\equl $dev $SYS_IODEV_MEM\n"
00359 "\t\\equl $l 0.%1\n"
00360 "\t\\equl $bs $SYS_IOBS_V\n"
00361 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
00362 "\t$io_packet($cmd, <$fmt .or. $sep>, 0, $dev, $l, $bs, 0.%0)\n"
00363 "\t$io_end\n" : : "r" (vp), "r" (size) );
00364 }
00365 #endif
00366
00367 #define write_string(STR) fputs((STR),stdout)
00368
00369
00370
00376 #define EOF (-1)
00377
00378
00384 #ifndef _FPOS_T
00385 #define _FPOS_T
00386 typedef int fpos_t;
00387 #endif
00388
00389
00398 #ifndef _FILE_T
00399 #define _FILE_T
00400 typedef __nlcc_file_struct FILE;
00401 #endif
00402
00403
00408 #define _IOFBF 0
00409
00410
00415 #define _IOLBF 1
00416
00417
00422 #define _IONBF 2
00423
00424
00429 #define BUFSIZ 0
00430
00431
00436 #define FOPEN_MAX __NLCC_OS1_MAX_FILES__
00437
00438
00445 #define FILENAME_MAX 4095
00446
00447
00452 #define L_tmpnam 20
00453
00454
00459 #define TMP_MAX 238328
00460
00461
00462
00483
00484
00485 #if !defined(__cflow_processed) || defined(_uses_remove_stdio_os1_h)
00486 inline int remove(const char *filename)
00487 {
00488 #ifdef __cflow_processed
00489 # error "Not implemented yet"
00490 #endif
00491 }
00492 #endif // remove
00493
00494
00495
00517
00518
00519 #if !defined(__cflow_processed) || defined(_uses_rename_stdio_os1_h)
00520 inline int rename(const char *old, const char *new)
00521 {
00522 #ifdef __cflow_processed
00523 # error "Not implemented yet"
00524 #endif
00525 }
00526 #endif // rename()
00527
00528
00529
00556
00557
00558 #if !defined(__cflow_processed) || defined(_uses_tmpfile_stdio_os1_h)
00559 inline FILE *tmpfile(void)
00560 {
00561 #ifdef __cflow_processed
00562 # error "Not implemented yet"
00563 #endif
00564 }
00565 #endif
00566
00567
00568
00594 #if !defined(__cflow_processed) || defined(_uses_tmpnam_stdio_os1_h)
00595 char *tmpnam(char *s)
00596 {
00597 #ifdef __cflow_processed
00598 # error "Not implemented yet"
00599 #endif
00600 }
00601 #endif // tmpnam()
00602
00603
00604
00625
00626
00627 #if !defined(__cflow_processed) || defined(_uses_fflush_stdio_os1_h)
00628 int fflush(FILE *stream)
00629 {
00630 #ifdef __cflow_processed
00631 # warning "fflush(): dummy implementation"
00632 return 0;
00633 #endif
00634 }
00635 #endif // fflush()
00636
00637
00638
00691
00692
00693 #ifndef __HAS_MAIN
00694 extern FILE *fopen (const char *path, const char *mode);
00695 #else
00696 #if !defined(__cflow_processed) || defined(_uses_fopen_stdio_os1_h)
00697 FILE *fopen (const char *path, const char *mode)
00698 {
00699 int modebits = 0;
00700 FILE* stream;
00701 #pragma localmem
00702
00703 asm("\t!! start fopen()\n");
00704
00705
00706 if( __n_files == __NLCC_OS1_MAX_FILES__ ) {
00707 errno = EMFILE;
00708 return NULL;
00709 }
00710
00711
00712
00713 {
00714 int modevalue = *(unsigned *)mode;
00715
00716 modebits = modevalue & 0xff;
00717 where( modebits == 'r' )
00718 asm("\t$io_setmode(%0, $SYS_IOMODE_R)\n" : "=r" (modebits) );
00719 where( modebits == 'w' )
00720 asm("\t$io_setmode(%0, $SYS_IOMODE_W)\n" : "=r" (modebits) );
00721 where( modebits == 'a' )
00722 asm("\t$io_setmode(%0, $SYS_IOMODE_A)\n" : "=r" (modebits) );
00723 where( ((modevalue & 0xff00)>>8) == '+' )
00724 modebits++;
00725
00726 if( ! modebits ) {
00727 errno = EINVAL;
00728 return NULL;
00729 }
00730 }
00731 { int fileno, fi;
00732 vector int sys_rval;
00733
00734 for( fi=0; fi<__NLCC_OS1_MAX_FILES__; fi++ ) {
00735 if( __files[fi].fd == 0 ) {
00736 fileno = __NLCC_BASE_FD + fi;
00737 break;
00738 }
00739 }
00740
00741
00742 asm("\t$io_start\n"
00743 "\t$io_fopenp( 0.%1, %2, 0.%3, $SYS_IODEV_MEM, \"\")\n"
00744 "\t$io_end\n"
00745 "\tlmtr %0 $MEM_SYS_RVAL\n"
00746 : "=r" (sys_rval)
00747 : "r" (fileno), "r" (modebits), "r" (path) );
00748
00749 stream = &__files[fi];
00750 stream->fd = fileno;
00751 stream->mode = modebits;
00752 stream->err = 0;
00753
00754
00755
00756 where (sys_rval.lo) {
00757 errno = sys_rval.hi;
00758 stream = NULL;
00759 } else {
00760 __n_files++;
00761 }
00762 }
00763 asm("\t!! end fopen()\n");
00764
00765 return stream;
00766 }
00767 #endif // fopen()
00768 #endif // Has Main
00769
00770
00771
00794
00795
00796 #ifndef __HAS_MAIN
00797 extern int fclose(FILE *stream);
00798 #else
00799 #if !defined(__cflow_processed) || defined(_uses_fclose_stdio_os1_h)
00800 int fclose(FILE *stream)
00801 {
00802 vector int sys_rval;
00803 int result;
00804
00805 if( ! stream || ! stream->fd ) {
00806 errno = EBADF;
00807 return EOF;
00808 }
00809
00810 asm("\t$io_start\n"
00811 "\t$io_fclose(0.%1)"
00812 "\t$io_end\n"
00813 "\tlmtr %0 $MEM_SYS_RVAL\n"
00814 : "=r" (sys_rval) : "r" (stream->fd));
00815
00816 *stream = (__nlcc_file_struct){0,_SYS_IOMODE_CLOSED};
00817 __n_files--;
00818
00819 result = 0;
00820 where (sys_rval.lo) {
00821 errno = sys_rval.hi;
00822 result = EOF;
00823 stream->err = 1;
00824 }
00825
00826 return result;
00827 }
00828 #endif // fclose()
00829 #endif // Has Main
00830
00831
00832
00856
00857
00858 #ifndef __HAS_MAIN
00859 extern FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);
00860 #else
00861 #if !defined(__cflow_processed) || defined(_uses_freopen_stdio_os1_h)
00862 FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream)
00863 {
00864 #ifdef __cflow_processed
00865 #error "Not implemented yet"
00866 #endif
00867 }
00868 #endif
00869 #endif // Has Main
00870
00871
00894
00895
00896 #if !defined(__cflow_processed) || defined(_uses_setbuf_stdio_os1_h)
00897 inline void setbuf(FILE * restrict stream, char * restrict buf)
00898 {
00899 #ifdef __cflow_processed
00900 #error "Not implemented yet"
00901 #endif
00902 }
00903 #endif
00904
00905
00906
00940
00941
00942 #if !defined(__cflow_processed) || defined(_uses_setvbuf_stdio_os1_h)
00943 inline int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size)
00944 {
00945 #ifdef __cflow_processed
00946 # error "Not implemented yet"
00947 #endif
00948 }
00949 #endif
00950
00951
00952
00988
00989
00990
00991
00992 #define SEEK_SET 0
00993 #define SEEK_CUR 1
00994 #define SEEK_END 2
00995
00996
00997 #if !defined(__cflow_processed) || defined(_uses__fsetpos_stdio_os1_h)
00998 inline long _fsetpos(FILE *stream, fpos_t *pos, int whence)
00999 {
01000 int sys_whence, retval;
01001 vector int sys_rval;
01002
01003 asm("\n\t!! begin _fsetpos()");
01004
01005 if( ! stream || ! stream->fd ) {
01006 errno = EBADF;
01007 return -1;
01008 }
01009
01010 sys_whence = -1;
01011 where (whence == SEEK_SET)
01012 asm("$sys_setwhence(%0, $SYS_FSE_SET)\n" : "=r" (sys_whence));
01013 where (whence == SEEK_CUR)
01014 asm("$sys_setwhence(%0, $SYS_FSE_CUR)\n" : "=r" (sys_whence));
01015 where (whence == SEEK_END)
01016 asm("$sys_setwhence(%0, $SYS_FSE_END)\n" : "=r" (sys_whence));
01017 if (sys_whence < 0) {
01018 errno = EINVAL;
01019 return -1;
01020 }
01021
01022 asm("\t$sys_fseek( 0.%0, 0.%1, %2 )\n"
01023 : : "r" (stream->fd), "r" (*pos), "r" (sys_whence));
01024 asm("\tlmtr %0 $MEM_SYS_RVAL\n" : "=r" (sys_rval));
01025 asm("\t!! end _fsetpos()\n");
01026
01027 *pos = sys_rval.hi;
01028 retval = 0;
01029 where (sys_rval.lo) {
01030 stream->err = 1;
01031 errno = sys_rval.hi;
01032 retval = -1;
01033 }
01034
01035 return retval;
01036 }
01037 #endif // fseek()
01038
01039
01040 #if !defined(__cflow_processed) || defined(_uses_fseek_stdio_os1_h)
01041 inline int fseek(FILE *stream, long offset, int whence)
01042 {
01043 fpos_t pos = offset;
01044 return _fsetpos(stream, &pos, whence);
01045 }
01046 #endif // fseek()
01047
01048
01049 #if !defined(__cflow_processed) || defined(_uses_rewind_stdio_os1_h)
01050 inline void rewind(FILE *stream)
01051 {
01052 fpos_t pos = 0;
01053 _fsetpos(stream, &pos, SEEK_SET);
01054 }
01055 #endif // rewind()
01056
01057
01058 #if !defined(__cflow_processed) || defined(_uses_fsetpos_stdio_os1_h)
01059 inline int fsetpos(FILE *stream, fpos_t *pos)
01060 {
01061 return _fsetpos(stream, pos, SEEK_SET);
01062 }
01063 #endif // fsetpos()
01064
01065
01066 #ifndef __HAS_MAIN
01067 extern int fgetpos(FILE *stream, fpos_t *pos);
01068 #else
01069 #if !defined(__cflow_processed) || defined(_uses_fgetpos_stdio_os1_h)
01070 int fgetpos(FILE *stream, fpos_t *pos)
01071 {
01072 *pos = 0;
01073 return _fsetpos(stream, pos, SEEK_CUR);
01074 }
01075 #endif // fgetpos()
01076 #endif // Has Main
01077
01078
01079 #ifndef __HAS_MAIN
01080 extern long ftell(FILE *stream);
01081 #else
01082 #if !defined(__cflow_processed) || defined(_uses_ftell_stdio_os1_h)
01083 long ftell(FILE *stream) {
01084 fpos_t *pos = 0;
01085 long result;
01086
01087 result = _fsetpos(stream, pos, SEEK_CUR);
01088
01089 where (result == 0)
01090 result = *pos;
01091
01092 return result;
01093 }
01094 #endif // ftell()
01095 #endif // Has Main
01096
01097
01098
01137
01138
01139 #define _fputs(str, stream, sep) \
01140 int retval; \
01141 vector int sys_rval; \
01142 \
01143 if(! stream->fd) { \
01144 return EOF; \
01145 } \
01146 \
01147 asm("\t$io_start\n" \
01148 "\t$io_fd( 0.%1 )\n" \
01149 "\t\\equl $cmd $SYS_IOCMD_GWR\n" \
01150 "\t\\equl $fmtsep <$SYS_IOFMT_VARSTR .or. %2>\n" \
01151 "\t\\equl $dev $SYS_IODEV_MEM\n" \
01152 "\t\\equl $l 0\n" \
01153 "\t\\equl $bs $SYS_IOBS_V\n" \
01154 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n" \
01155 "\t$io_packet($cmd, $fmtsep, $rdflg, $dev, $l, $bs, 0.%3)\n" \
01156 "\t$io_end\n" \
01157 "\tlmtr %0 $MEM_SYS_RVAL\n" \
01158 : "=r" (sys_rval) : "r" (stream->fd), "I" (sep), "r" (str)); \
01159 \
01160 retval = 0; \
01161 where (sys_rval.lo) { \
01162 retval = EOF; \
01163 stream->err = 1; \
01164 errno = sys_rval.hi; \
01165 } \
01166 \
01167 return retval;
01168
01169 #if !defined(__cflow_processed) || defined(_uses_fputs_stdio_os1_h)
01170 inline int fputs(const char *str, FILE *stream)
01171 {
01172 _fputs(str, stream, _SYS_IOPSEP_NOP)
01173 }
01174 #endif // fputs()
01175
01176 #if !defined(__cflow_processed) || defined(_uses_puts_stdio_os1_h)
01177 inline int puts(const char *str)
01178 {
01179 _fputs(str, stdout, _SYS_IOPSEP_NL)
01180 }
01181 #endif
01182
01183 #undef _fputs
01184
01185 #if !defined(__cflow_processed) || defined(_uses_fputc_stdio_os1_h)
01186 inline int fputc(int c, FILE *stream)
01187 {
01188 int buf[2], retval;
01189
01190 buf[0] = c;
01191 buf[1] = 0;
01192
01193 retval = fputs((char *) buf, stream);
01194
01195 where (retval != EOF)
01196 retval = c;
01197
01198 return retval;
01199 }
01200 #endif // fputc()
01201
01202
01203 #define putc(C, STR) fputc(C, STR)
01204
01205
01206 #if !defined(__cflow_processed) || defined(_uses_putchar_stdio_os1_h)
01207 inline int putchar(int c)
01208 {
01209 return putc(c,stdout);
01210 }
01211 #endif
01212
01213
01214
01215 #include <assert.h>
01216
01217
01218
01258
01259
01260 #ifndef __HAS_MAIN
01261 extern size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
01262 #else
01263 #if !defined(__cflow_processed) || defined(_uses_fread_stdio_os1_h)
01264 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
01265 {
01266 int retval, nbytes;
01267 vector int sys_rval;
01268
01269 nbytes = size * nmemb;
01270 assert( (nbytes%16)==0 );
01271
01272 asm("\t$io_start\n"
01273 "\t\\equl $cmd $SYS_IOCMD_BRD\n"
01274 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01275 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01276 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01277 "\t\\equl $dev $SYS_IODEV_MEM\n"
01278 "\t\\equl $l %1>>4\n"
01279 "\t\\equl $bs $SYS_IOBS_V\n"
01280 "\t$io_fd( 0.%2 )\n"
01281 "\t$io_slice_all\n"
01282 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01283 "\t$io_end\n"
01284 "\tlmtr %0 $MEM_SYS_RVAL\n"
01285 : "=r" (sys_rval) : "r" (nbytes), "r" (stream->fd), "r" (ptr) );
01286
01287
01288 retval = nmemb;
01289 where (sys_rval.lo) {
01290 stream->err = 1;
01291 retval = 0;
01292 }
01293
01294 return retval;
01295 }
01296 #endif // fread
01297 #endif // Has Main
01298
01299
01300 #ifndef __HAS_MAIN
01301 extern size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
01302 #else
01303 #if !defined(__cflow_processed) || defined(_uses_fwrite_stdio_os1_h)
01304 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
01305 {
01306 int retval, nbytes, nword;
01307 vector int sys_rval;
01308
01309 nbytes = size * nmemb;
01310 assert( (nbytes%16)==0 );
01311
01312 asm("\t$io_start\n"
01313 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
01314 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01315 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01316 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01317 "\t\\equl $dev $SYS_IODEV_MEM\n"
01318 "\t\\equl $l %1>>4\n"
01319 "\t\\equl $bs $SYS_IOBS_V\n"
01320 "\t$io_fd( 0.%2 )\n"
01321 "\t$io_slice_all\n"
01322 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01323 "\t$io_end\n"
01324 "\tlmtr %0 $MEM_SYS_RVAL\n"
01325 : "=r" (sys_rval) : "r" (nbytes), "r" (stream->fd), "r" (ptr) );
01326
01327
01328 retval = nmemb;
01329 where (sys_rval.lo) {
01330 stream->err = 1;
01331 retval = 0;
01332 }
01333
01334 return retval;
01335 }
01336 #endif // fwrite()
01337 #endif // Has Main
01338
01339
01340
01341
01342
01383
01384
01385 #define tfread(PTR,NMEMB,STREAM) __tfread(__typecode(*PTR),PTR,NMEMB,STREAM)
01386
01387
01388 #ifndef __HAS_MAIN
01389 extern size_t __tfread(int tcode, const void *ptr, size_t nmemb, FILE *stream);
01390 #else
01391 #if !defined(__cflow_processed) || defined(_uses___tfread_stdio_os1_h)
01392 size_t __tfread(int tcode, const void *ptr, size_t nmemb, FILE *stream)
01393 {
01394 int retval;
01395 vector int sys_rval;
01396
01397 if( (tcode==NLCC_FLOAT) || (tcode==NLCC_DOUBLE) || (tcode==NLCC_INT) || (tcode==NLCC_UNSIGNED) )
01398 {
01399 asm("\t$io_start\n"
01400 "\t\\equl $cmd $SYS_IOCMD_BRD\n"
01401 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01402 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01403 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01404 "\t\\equl $dev $SYS_IODEV_MEM\n"
01405 "\t\\equl $l 0.%1\n"
01406 "\t\\equl $bs $SYS_IOBS_L\n"
01407 "\t$io_fd( 0.%2 )\n"
01408 "\t$io_slice_all\n"
01409 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01410 "\t$io_end\n"
01411 "\tlmtr %0 $MEM_SYS_RVAL\n"
01412 : : "r" (sys_rval), "r" (nmemb), "r" (stream->fd), "r" (ptr) );
01413 }
01414 else
01415 if( (tcode==NLCC_COMPLEX) || (tcode==NLCC_VECTOR) || (tcode==NLCC_VFLOAT)
01416 || (tcode==NLCC_VINT) || (tcode==NLCC_VUINT) )
01417 {
01418 asm("\t$io_start\n"
01419 "\t\\equl $cmd $SYS_IOCMD_BRD\n"
01420 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01421 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01422 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01423 "\t\\equl $dev $SYS_IODEV_MEM\n"
01424 "\t\\equl $l 0.%1\n"
01425 "\t\\equl $bs $SYS_IOBS_V\n"
01426 "\t$io_fd( 0.%2 )\n"
01427 "\t$io_slice_all\n"
01428 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01429 "\t$io_end\n"
01430 "\tlmtr %0 $MEM_SYS_RVAL\n"
01431 : : "r" (sys_rval), "r" (nmemb), "r" (stream->fd), "r" (ptr) );
01432 }
01433 else
01434 {
01435 assert(0);
01436 }
01437
01438
01439 retval = nmemb;
01440 where (sys_rval.lo) {
01441 stream->err = 1;
01442 retval = 0;
01443 }
01444
01445 return retval;
01446 }
01447 #endif // tfread
01448 #endif // Has Main
01449
01450
01451 #define tfwrite(PTR,NMEMB,STREAM) __tfwrite(__typecode(*PTR),PTR,NMEMB,STREAM)
01452
01453
01454 #ifndef __HAS_MAIN
01455 extern size_t __tfwrite(int tcode, const void *ptr, size_t nmemb, FILE *stream);
01456 #else
01457 #if !defined(__cflow_processed) || defined(_uses___tfwrite_stdio_os1_h)
01458 size_t __tfwrite(int tcode, const void *ptr, size_t nmemb, FILE *stream)
01459 {
01460 int retval;
01461 vector int sys_rval;
01462
01463 if( (tcode==NLCC_FLOAT) || (tcode==NLCC_DOUBLE) || (tcode==NLCC_INT) || (tcode==NLCC_UNSIGNED) )
01464 {
01465 asm("\t$io_start\n"
01466 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
01467 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01468 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01469 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01470 "\t\\equl $dev $SYS_IODEV_MEM\n"
01471 "\t\\equl $l 0.%1\n"
01472 "\t\\equl $bs $SYS_IOBS_L\n"
01473 "\t$io_fd( 0.%2 )\n"
01474 "\t$io_slice_all\n"
01475 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01476 "\t$io_end\n"
01477 "\tlmtr %0 $MEM_SYS_RVAL\n"
01478 : "=r" (sys_rval) : "r" (nmemb), "r" (stream->fd), "r" (ptr) );
01479 }
01480 else
01481 if( (tcode==NLCC_COMPLEX) || (tcode==NLCC_VECTOR) || (tcode==NLCC_VFLOAT)
01482 || (tcode==NLCC_VINT) || (tcode==NLCC_VUINT) )
01483 {
01484 asm("\t$io_start\n"
01485 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
01486 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01487 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01488 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01489 "\t\\equl $dev $SYS_IODEV_MEM\n"
01490 "\t\\equl $l 0.%1\n"
01491 "\t\\equl $bs $SYS_IOBS_V\n"
01492 "\t$io_fd( 0.%2 )\n"
01493 "\t$io_slice_all\n"
01494 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01495 "\t$io_end\n"
01496 "\tlmtr %0 $MEM_SYS_RVAL\n"
01497 : "=r" (sys_rval) : "r" (nmemb), "r" (stream->fd), "r" (ptr) );
01498 }
01499 else
01500 {
01501 assert(0);
01502 }
01503
01504
01505 retval = nmemb;
01506 where (sys_rval.lo) {
01507 stream->err = 1;
01508 retval = 0;
01509 }
01510
01511 return retval;
01512 }
01513 #endif // tfwrite
01514 #endif // Has Main
01515
01516
01517
01551
01552
01553 #define __IOPUT_INIT \
01554 int retval;\
01555 vector int sys_rval;\
01556 \
01557 _Pragma("localmem");\
01558 \
01559
01560 #define __IOPUT(ITYPE,CTYPE) \
01561 asm("\n\t!! begin fput"#CTYPE"()");\
01562 asm("\t$io_start\n"\
01563 "\t$io_fd( 0.%1 )\n"\
01564 "\t$io_put"#ITYPE"( 0x0.%2 )\n"\
01565 "\t$io_end\n"\
01566 "\tlmtr %0 $MEM_SYS_RVAL\n"\
01567 : "=r" (sys_rval) : "r" (stream->fd), "r" (&val) );\
01568 \
01569 retval = 0;\
01570 where (sys_rval.lo) {\
01571 stream->err = 1;\
01572 retval = -1;\
01573 }\
01574 asm("\t!! end fput"#CTYPE"()\n");\
01575 return retval
01576
01577 #define fputf(VAL,STREAM) fputd(VAL, STREAM)
01578 #define putf(VAL,STREAM) putd(VAL, STREAM)
01579
01580 #if !defined(__cflow_processed) || defined(_uses_fputd_stdio_os1_h)
01581 inline int fputd(const double val, FILE *stream) { __IOPUT_INIT
01582 __IOPUT(e,d); }
01583 #endif // fputd()
01584
01585 #if !defined(__cflow_processed) || defined(_uses_putd_stdio_os1_h)
01586 inline int putd(const double val) { return fputd( val, stdout ); }
01587 #endif
01588
01589 #if !defined(__cflow_processed) || defined(_uses_fputx_stdio_os1_h)
01590 inline int fputx(const complex val, FILE *stream) { __IOPUT_INIT
01591 __IOPUT(z,x); }
01592 #endif // fputx()
01593
01594 #if !defined(__cflow_processed) || defined(_uses_putx_stdio_os1_h)
01595 inline int putx(const complex val) { return fputx( val, stdout ); }
01596 #endif
01597
01598 #if !defined(__cflow_processed) || defined(_uses_fputv_stdio_os1_h)
01599 inline int fputv(const vector val, FILE *stream) { __IOPUT_INIT
01600 __IOPUT(z,x); }
01601 #endif // fputv()
01602
01603 #if !defined(__cflow_processed) || defined(_uses_putv_stdio_os1_h)
01604 inline int putv(const vector val ) { return fputv( val, stdout ); }
01605 #endif
01606
01607 #if !defined(__cflow_processed) || defined(_uses_fputi_stdio_os1_h)
01608 inline int fputi(const int val, FILE *stream) { __IOPUT_INIT
01609 __IOPUT(d,i); }
01610 #endif // fputi()
01611
01612 #if !defined(__cflow_processed) || defined(_uses_puti_stdio_os1_h)
01613 inline int puti(const int val) { return fputi( val, stdout ); }
01614 #endif
01615
01616 #if !defined(__cflow_processed) || defined(_uses_fputiv_stdio_os1_h)
01617 inline int fputiv(const vector int val, FILE *stream) { __IOPUT_INIT
01618 __IOPUT(dv,iv); }
01619 #endif // fputiv()
01620
01621 #if !defined(__cflow_processed) || defined(_uses_putiv_stdio_os1_h)
01622 inline int putiv(const vector int val) { return fputiv( val, stdout ); }
01623 #endif
01624
01625 #if !defined(__cflow_processed) || defined(_uses_fputh_stdio_os1_h)
01626 inline int fputh( const int val, FILE *stream) { __IOPUT_INIT
01627 __IOPUT(x,h); }
01628 #endif // fputh()
01629
01630 #if !defined(__cflow_processed) || defined(_uses_fputhv_stdio_os1_h)
01631 inline int fputhv(const int val, FILE *stream) { __IOPUT_INIT
01632 __IOPUT(xv,hv); }
01633 #endif // fputhv()
01634
01635 #if !defined(__cflow_processed) || defined(_uses_puth_stdio_os1_h)
01636 inline int puth(const int val ) { return fputh( val, stdout ); }
01637 #endif
01638
01639 #if !defined(__cflow_processed) || defined(_uses_puthv_stdio_os1_h)
01640 inline int puthv(const int val ) { return fputhv( val, stdout ); }
01641 #endif
01642
01643 #define __IOPUTA(CTS,ITYPE,BS) \
01644 asm("\n\t!! begin fput"#CTS"a()");\
01645 asm("\t$io_start\n"\
01646 "\t$io_fd( 0.%1 )\n"\
01647 "\t\\equl $cmd $SYS_IOCMD_GWR\n"\
01648 "\t\\equl $fmt <$SYS_IOFMT_"#ITYPE">\n"\
01649 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE>\n"\
01650 "\t\\equl $dev $SYS_IODEV_MEM\n"\
01651 "\t\\equl $bs "#BS"\n"\
01652 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"\
01653 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0.%2, $bs, 0.%3)\n"\
01654 "\t$io_end\n"\
01655 "\tlmtr %0 $MEM_SYS_RVAL\n"\
01656 : "=r" (sys_rval)\
01657 : "r" (stream->fd), "r" (len), "r" (ptr) );\
01658 \
01659 retval = 0;\
01660 where (sys_rval.lo) {\
01661 stream->err = 1;\
01662 retval = -1;\
01663 }\
01664 asm("\t!! end fput"#CTS"a()\n");\
01665 return retval
01666
01667 #if !defined(__cflow_processed) || defined(_uses_fputia_stdio_os1_h)
01668 inline int fputia(const int *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(i,INT,$SYS_IOBS_L); }
01669 #endif // fputia()
01670
01671 #if !defined(__cflow_processed) || defined(_uses_fputiva_stdio_os1_h)
01672 inline int fputiva(const int *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(i,INT.or.$SYS_IOBSEP_SBRACKET,$SYS_IOBS_V); }
01673 #endif // fputiva()
01674
01675 #if !defined(__cflow_processed) || defined(_uses_fputxa_stdio_os1_h)
01676 inline int fputxa(const complex *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(x,DBL.or.$SYS_IOBSEP_RBRACKET,$SYS_IOBS_V); }
01677 #endif // fputxa()
01678
01679 #if !defined(__cflow_processed) || defined(_uses_fputva_stdio_os1_h)
01680 inline int fputva(const vector *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(x,DBL.or.$SYS_IOBSEP_RBRACKET,$SYS_IOBS_V); }
01681 #endif // fputva()
01682
01683 #if !defined(__cflow_processed) || defined(_uses_fputda_stdio_os1_h)
01684 inline int fputda( const double *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(d,DBL,$SYS_IOBS_L); }
01685 #endif // fputda()
01686
01687 #if !defined(__cflow_processed) || defined(_uses_fputua_stdio_os1_h)
01688 inline int fputua( const unsigned *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(u,UINT,$SYS_IOBS_L); }
01689 #endif // fputua()
01690
01691 #if !defined(__cflow_processed) || defined(_uses_fputha_stdio_os1_h)
01692 inline int fputha( const int *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(h,HEX,$SYS_IOBS_L); }
01693 #endif // fputha()
01694
01695 #if !defined(__cflow_processed) || defined(_uses_fputhva_stdio_os1_h)
01696 inline int fputhva( const int *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(h,HEX.or.$SYS_IOBSEP_SBRACKET,$SYS_IOBS_V); }
01697 #endif // fputhva()
01698
01699 #if !defined(__cflow_processed) || defined(_uses_putia_stdio_os1_h)
01700 inline int putia( const int *ptr, int len ) { return fputia( ptr, len, stdout ); }
01701 #endif // putia()
01702
01703 #if !defined(__cflow_processed) || defined(_uses_putiva_stdio_os1_h)
01704 inline int putiva( const int *ptr, int len ) { return fputiva( ptr, len, stdout ); }
01705 #endif // putiva()
01706
01707 #if !defined(__cflow_processed) || defined(_uses_putxa_stdio_os1_h)
01708 inline int putxa( const complex *ptr, int len ) { return fputxa( ptr, len, stdout ); }
01709 #endif // putxa()
01710
01711 #if !defined(__cflow_processed) || defined(_uses_putva_stdio_os1_h)
01712 inline int putva( const vector *ptr, int len ) { return fputva( ptr, len, stdout ); }
01713 #endif // putva()
01714
01715 #if !defined(__cflow_processed) || defined(_uses_putda_stdio_os1_h)
01716 inline int putda( const double *ptr, int len ) { return fputda( ptr, len, stdout ); }
01717 #endif // putda()
01718
01719 #if !defined(__cflow_processed) || defined(_uses_putua_stdio_os1_h)
01720 inline int putua( const unsigned *ptr, int len ) { return fputua( ptr, len, stdout ); }
01721 #endif // putua()
01722
01723 #if !defined(__cflow_processed) || defined(_uses_putha_stdio_os1_h)
01724 inline int putha( const int *ptr, int len ) { return fputha( ptr, len, stdout ); }
01725 #endif // putha()
01726
01727 #if !defined(__cflow_processed) || defined(_uses_puthva_stdio_os1_h)
01728 inline int puthva( const int *ptr, int len ) { return fputha( ptr, len, stdout ); }
01729 #endif // puthva()
01730
01731
01732
01754
01755
01756 #ifndef __HAS_MAIN
01757
01758 extern int fgetd( double *ptr, FILE *stream);
01759 extern int getd( double *ptr );
01760 extern int fgetx( complex *ptr, FILE *stream);
01761 extern int getx( complex *ptr ) ;
01762 extern int fgetv( vector *ptr, FILE *stream) ;
01763 extern int getv( vector *ptr ) ;
01764 extern int fgeti( int *ptr, FILE *stream) ;
01765 extern int geti( int *ptr ) ;
01766
01767 #else
01768 #define __IOGET(ITYPE,CTYPE) \
01769 asm("\n\t!! begin fget"#CTYPE"()");\
01770 asm("\t$io_start\n"\
01771 "\t$io_fd( 0.%1 )\n"\
01772 "\t$io_slice_all\n"\
01773 "\t$io_get"#ITYPE"( 0.%2 )\n"\
01774 "\t$io_end\n"\
01775 "\tlmtr %0 $MEM_SYS_RVAL\n"\
01776 : "=r" (sys_rval) : "r" (stream->fd), "r" (ptr) );\
01777 \
01778 retval = 0;\
01779 where (sys_rval.lo) {\
01780 stream->err = 1;\
01781 retval = -1;\
01782 }\
01783 asm("\t!! end fget"#CTYPE"()");\
01784 return retval
01785
01786 #if !defined(__cflow_processed) || defined(_uses_fgetd_stdio_os1_h)
01787 int fgetd( double *ptr, FILE *stream) { __IOPUT_INIT
01788 __IOGET(e,d); }
01789 #endif // fgetd()
01790
01791 #if !defined(__cflow_processed) || defined(_uses_getd_stdio_os1_h)
01792 int getd( double *ptr ) { return fgetd( ptr, stdin ); }
01793 #endif // fgetd()
01794
01795 #if !defined(__cflow_processed) || defined(_uses_fgetx_stdio_os1_h)
01796 int fgetx( complex *ptr, FILE *stream) { __IOPUT_INIT
01797 __IOGET(z,x); }
01798 #endif // fgetx()
01799
01800 #if !defined(__cflow_processed) || defined(_uses_getx_stdio_os1_h)
01801 int getx( complex *ptr ) { return fgetx( ptr, stdin ); }
01802 #endif // fgetx()
01803
01804 #if !defined(__cflow_processed) || defined(_uses_fgetv_stdio_os1_h)
01805 int fgetv( vector *ptr, FILE *stream) { __IOPUT_INIT
01806 __IOGET(z,x); }
01807 #endif // fgetv()
01808
01809 #if !defined(__cflow_processed) || defined(_uses_getv_stdio_os1_h)
01810 int getv( vector *ptr ) { return fgetv( ptr, stdin ); }
01811 #endif // fgetv()
01812
01813 #if !defined(__cflow_processed) || defined(_uses_fgeti_stdio_os1_h)
01814 int fgeti( int *ptr, FILE *stream) { __IOPUT_INIT
01815 __IOGET(d,i); }
01816 #endif // fgeti()
01817
01818 #if !defined(__cflow_processed) || defined(_uses_geti_stdio_os1_h)
01819 int geti( int *ptr ) { return fgeti( ptr, stdin ); }
01820 #endif // fgeti()
01821
01822 #endif // __HAS_MAIN
01823
01824
01852
01853
01854 #define printf(ARGS...) fprintf(stdout, ##ARGS)
01855 #define vprintf(FMT, ARG) vfprintf(stdout, (FMT), (ARG))
01856
01857 #ifndef __HAS_MAIN
01858 extern int fprintf(FILE *stream, const char *format, ...);
01859 #else
01860 #if !defined(__cflow_processed) || defined(_uses_fprintf_stdio_os1_h)
01861 int fprintf(FILE *stream, const char *format, ...) {
01862 int iocnt;
01863 vector int argcnt, sys_rval;
01864 va_list ap;
01865
01866 asm("\t!! begin fprintf()");
01867
01868 if( ! stream->fd ) {
01869 errno = EBADF;
01870 return 0;
01871 }
01872
01873 #pragma localmem
01874 argcnt = __builtin_argcount();
01875 iocnt = argcnt.lo - 2;
01876
01877
01878 asm("\t$io_start\n"
01879 "\t$io_fd( 0.%0 )\n"
01880 "\t$io_cnt_set( %2 )\n"
01881 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01882 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
01883 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_SPACE>\n"
01884 "\t\\equl $dev $SYS_IODEV_MEM\n"
01885 "\t\\equl $bs $SYS_IOBS_V\n"
01886 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01887 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%1)\n"
01888 : : "r" (stream->fd), "r" (format), "r" (iocnt) );
01889
01890 asm("\t$io_setloopflg\n");
01891
01892 va_start(ap, format);
01893 for( ; iocnt > 0; iocnt-- ) {
01894 vector int arginfo = _va_info(ap);
01895 void *ptr = _va_ptr(ap);
01896 _va_skip( ap, arginfo.lo );
01897 if( arginfo.hi == NLCC_STRING ) {
01898 char *str = *(char **)ptr;
01899 asm("\t$io_cnt_decr\n"
01900 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01901 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
01902 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
01903 "\t\\equl $dev $SYS_IODEV_MEM\n"
01904 "\t\\equl $bs $SYS_IOBS_V\n"
01905 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01906 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%0)\n"
01907 : : "r" (str) );
01908 } else {
01909 asm("\t$io_cnt_decr\n"
01910 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01911 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01912 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
01913 "\t\\equl $dev $SYS_IODEV_MEM\n"
01914 "\t\\equl $l 0.%1\n"
01915 "\t\\equl $bs $SYS_IOBS_V\n"
01916 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01917 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%0)\n"
01918 : : "r" (ptr), "r" (arginfo.lo) );
01919 }
01920 }
01921 va_end(ap);
01922
01923 asm("\t$io_cnt_clear\n"
01924 "\t$io_end\n"
01925 "\tlmtr %0 $MEM_SYS_RVAL\n"
01926 "\t!! end fprintf()\n"
01927 : "=r" (sys_rval));
01928
01929 where (sys_rval.lo)
01930 stream->err = 1;
01931
01932 return (int) (sys_rval.hi);
01933 }
01934 #endif // fprintf()
01935 #endif // Has Main
01936
01937
01938 #ifndef __HAS_MAIN
01939 extern int vfprintf(FILE * restrict stream, const char * restrict format, va_list ap);
01940 #else
01941 #if !defined(__cflow_processed) || defined(_uses_vfprintf_stdio_os1_h)
01942 int vfprintf(FILE * restrict stream, const char * restrict format, va_list ap) {
01943 int n_args, argc;
01944 vector int sys_rval;
01945
01946 asm("\t!! begin vfprintf()");
01947 #pragma localmem
01948 n_args = _va_args(ap);
01949
01950 if( ! stream->fd ) {
01951 errno = EBADF;
01952 return 0;
01953 }
01954
01955
01956 asm("\t$io_start\n"
01957 "\t$io_fd( 0.%0 )\n"
01958 "\t$io_cnt_set( %2 )\n"
01959 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01960 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
01961 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_SPACE>\n"
01962 "\t\\equl $dev $SYS_IODEV_MEM\n"
01963 "\t\\equl $bs $SYS_IOBS_V\n"
01964 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01965 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%1)"
01966 : : "r" (stream->fd), "r" (format), "r" (n_args) );
01967
01968 for( ; n_args > 0; n_args -- ) {
01969 vector int arginfo = _va_info(ap);
01970 void *ptr = _va_ptr(ap);
01971 _va_skip( ap, arginfo.lo );
01972 if( arginfo.hi == NLCC_STRING ) {
01973 char *str = *(char **)ptr;
01974 asm("\t$io_cnt_decr\n"
01975 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01976 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
01977 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
01978 "\t\\equl $dev $SYS_IODEV_MEM\n"
01979 "\t\\equl $bs $SYS_IOBS_V\n"
01980 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01981 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%0)\n"
01982 : : "r" (str) );
01983 } else {
01984 asm("\t$io_cnt_decr\n"
01985 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01986 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01987 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
01988 "\t\\equl $dev $SYS_IODEV_MEM\n"
01989 "\t\\equl $l 0.%1\n"
01990 "\t\\equl $bs $SYS_IOBS_V\n"
01991 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01992 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%0)\n"
01993 : : "r" (ptr), "r" (arginfo.lo) );
01994 }
01995 }
01996 asm("\t$io_cnt_clear\n"
01997 "\t$io_end\n"
01998 "\t!! end vfprintf()\n"
01999 "\tlmtr %0 $MEM_SYS_RVAL\n"
02000 : "=r" (sys_rval));
02001
02002 where (sys_rval.lo)
02003 stream->err = 1;
02004
02005 return (int) (sys_rval.hi);
02006 }
02007 #endif // vfprintf()
02008 #endif // Has Main
02009
02010
02011
02032
02033
02034 #define scanf(ARGS...) fscanf(stdin, ##ARGS)
02035
02036 #ifndef __HAS_MAIN
02037 extern int fscanf(FILE * restrict stream, const char * restrict format, ...);
02038 #else
02039 #if !defined(__cflow_processed) || defined(_uses_fscanf_stdio_os1_h)
02040 int fscanf(FILE * restrict stream, const char * restrict format, ...)
02041 {
02042 int iocnt;
02043 int n_args, argc;
02044 vector int argcnt, sys_rval;
02045 va_list ap;
02046
02047 if( ! stream || stream->mode == _SYS_IOMODE_CLOSED ) {
02048 errno = EBADF;
02049 return 0;
02050 }
02051
02052 asm("\t!! begin fscanf()");
02053 #pragma localmem
02054 argcnt = __builtin_argcount();
02055 iocnt = argcnt.lo - 2;
02056
02057
02058 asm("\t$io_start\n"
02059 "\t$io_fd( 0.%0 )\n"
02060 "\t$io_cnt_set( %2 )\n"
02061 "\t\\equl $cmd $SYS_IOCMD_SCF\n"
02062 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
02063 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_SPACE>\n"
02064 "\t\\equl $dev $SYS_IODEV_MEM\n"
02065 "\t\\equl $bs $SYS_IOBS_V\n"
02066 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
02067 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%1)"
02068 : : "r" (stream->fd), "r" (format), "r" (iocnt) );
02069
02070 va_start(ap, format);
02071 for( ; iocnt > 0; iocnt -- ) {
02072 int size = _va_info(ap);
02073 void *ptr = *(void**) (_va_ptr(ap));
02074 _va_skip( ap, size );
02075 asm("\t$io_cnt_decr\n"
02076 "\t\\equl $cmd $SYS_IOCMD_SCF\n"
02077 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
02078 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
02079 "\t\\equl $dev $SYS_IODEV_MEM\n"
02080 "\t\\equl $l 1\n"
02081 "\t\\equl $bs $SYS_IOBS_V\n"
02082 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
02083 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%0)"
02084 : : "r" (ptr) );
02085 }
02086 va_end(ap);
02087 asm("\t$io_cnt_clear\n"
02088 "\t$io_end\n"
02089 "\t!! end fscanf()\n"
02090 "\tlmtr %0 $MEM_SYS_RVAL\n"
02091 : "=r" (sys_rval));
02092
02093 where (sys_rval.lo)
02094 stream->err = 1;
02095
02096 return (int) (sys_rval.hi);
02097 }
02098 #endif
02099 #endif // Has Main
02100
02101
02102
02131
02132
02133 #ifndef __HAS_MAIN
02134 extern void clearerr(FILE *stream);
02135 #else
02136 #if !defined(__cflow_processed) || defined(_uses_clearerr_stdio_os1_h)
02137 void clearerr(FILE *stream)
02138 {
02139 stream->err = 0;
02140 }
02141 #endif
02142 #endif // Has Main
02143
02144
02145 #ifndef __HAS_MAIN
02146 extern int feof(FILE *stream);
02147 #else
02148 #if !defined(__cflow_processed) || defined(_uses_feof_stdio_os1_h)
02149 int feof(FILE *stream)
02150 {
02151 #ifdef __cflow_processed
02152 # warning "feof(): dummy implementation (returns always false)"
02153 #endif
02154 return 0;
02155 }
02156 #endif
02157 #endif // Has Main
02158
02159
02160 #ifndef __HAS_MAIN
02161 extern inline int ferror(FILE *stream);
02162 #else
02163 #if !defined(__cflow_processed) || defined(_uses_ferror_stdio_os1_h)
02164 inline int ferror(FILE *stream)
02165 {
02166 return stream->err;
02167 }
02168 #endif
02169 #endif // Has Main
02170
02171
02172
02197
02198
02199 #ifndef __HAS_MAIN
02200 extern void perror(const char *s);
02201 #else
02202 #if !defined(__cflow_processed) || defined(_uses_perror_stdio_os1_h)
02203 void perror(const char *s)
02204 {
02205 if( s && s[0] ) {
02206 fputs(s,stderr);
02207 fputs(": ",stderr);
02208 }
02209 fputs(strerror(errno),stderr);
02210 fputs("\n",stderr);
02211 }
02212 #endif // perror()
02213 #endif // Has Main
02214
02215
02216
02228
02229
02230 #if !defined(__cflow_processed) || defined(_uses_fileno_stdio_os1_h)
02231 inline int fileno(FILE *stream)
02232 {
02233 return stream->fd;
02234 }
02235 #endif // fileno()
02236
02237
02238
02239
02240
02241
02242 #include <os1/slice_stdio_os1.h>
02243
02244 #endif