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
00482
00483
00484 #if !defined(__cflow_processed) || defined(_uses_remove_stdio_os1_h)
00485 inline int remove(const char *filename)
00486 {
00487 int ret;
00488 vector int sys_rval;
00489
00490 asm("\t$sys_sh($SYS_SHCMD_REMOVE, %1)\n"
00491 "\tlmtr %0 $MEM_SYS_RVAL\n"
00492 : "=r" (sys_rval) : "r" (filename));
00493
00494 ret = 0;
00495 where (sys_rval.lo) {
00496 ret = -1;
00497 }
00498 where (sys_rval.lo == 1) {
00499 errno = sys_rval.hi;
00500 }
00501
00502 return ret;
00503 }
00504 #endif // remove
00505
00506
00507
00529
00530
00531 #if !defined(__cflow_processed) || defined(_uses_rename_stdio_os1_h)
00532 inline int rename(const char *old, const char *new)
00533 {
00534 #ifdef __cflow_processed
00535 # error "Not implemented yet"
00536 #endif
00537 }
00538 #endif // rename()
00539
00540
00541
00568
00569
00570 #if !defined(__cflow_processed) || defined(_uses_tmpfile_stdio_os1_h)
00571 inline FILE *tmpfile(void)
00572 {
00573 #ifdef __cflow_processed
00574 # error "Not implemented yet"
00575 #endif
00576 }
00577 #endif
00578
00579
00580
00606 #if !defined(__cflow_processed) || defined(_uses_tmpnam_stdio_os1_h)
00607 char *tmpnam(char *s)
00608 {
00609 #ifdef __cflow_processed
00610 # error "Not implemented yet"
00611 #endif
00612 }
00613 #endif // tmpnam()
00614
00615
00616
00637
00638
00639 #if !defined(__cflow_processed) || defined(_uses_fflush_stdio_os1_h)
00640 int fflush(FILE *stream)
00641 {
00642 #ifdef __cflow_processed
00643 # warning "fflush(): dummy implementation"
00644 return 0;
00645 #endif
00646 }
00647 #endif // fflush()
00648
00649
00650
00703
00704
00705 #ifndef __HAS_MAIN
00706 extern FILE *fopen (const char *path, const char *mode);
00707 #else
00708 #if !defined(__cflow_processed) || defined(_uses_fopen_stdio_os1_h)
00709 FILE *fopen (const char *path, const char *mode)
00710 {
00711 int modebits = 0;
00712 FILE* stream;
00713 #pragma localmem
00714
00715 asm("\t!! start fopen()\n");
00716
00717
00718 if( __n_files == __NLCC_OS1_MAX_FILES__ ) {
00719 errno = EMFILE;
00720 return NULL;
00721 }
00722
00723
00724
00725 {
00726 int modevalue = *(unsigned *)mode;
00727
00728 modebits = modevalue & 0xff;
00729 where( modebits == 'r' )
00730 asm("\t$io_setmode(%0, $SYS_IOMODE_R)\n" : "=r" (modebits) );
00731 where( modebits == 'w' )
00732 asm("\t$io_setmode(%0, $SYS_IOMODE_W)\n" : "=r" (modebits) );
00733 where( modebits == 'a' )
00734 asm("\t$io_setmode(%0, $SYS_IOMODE_A)\n" : "=r" (modebits) );
00735 where( ((modevalue & 0xff00)>>8) == '+' )
00736 modebits++;
00737
00738 if( ! modebits ) {
00739 errno = EINVAL;
00740 return NULL;
00741 }
00742 }
00743 { int fileno, fi;
00744 vector int sys_rval;
00745
00746 for( fi=0; fi<__NLCC_OS1_MAX_FILES__; fi++ ) {
00747 if( __files[fi].fd == 0 ) {
00748 fileno = __NLCC_BASE_FD + fi;
00749 break;
00750 }
00751 }
00752
00753
00754 asm("\t$io_start\n"
00755 "\t$io_fopenp( 0.%1, %2, 0.%3, $SYS_IODEV_MEM, \"\")\n"
00756 "\t$io_end\n"
00757 "\tlmtr %0 $MEM_SYS_RVAL\n"
00758 : "=r" (sys_rval)
00759 : "r" (fileno), "r" (modebits), "r" (path) );
00760
00761 stream = &__files[fi];
00762 stream->fd = fileno;
00763 stream->mode = modebits;
00764 stream->err = 0;
00765
00766
00767
00768 where (sys_rval.lo) {
00769 errno = sys_rval.hi;
00770 stream = NULL;
00771 } else {
00772 __n_files++;
00773 }
00774 }
00775 asm("\t!! end fopen()\n");
00776
00777 return stream;
00778 }
00779 #endif // fopen()
00780 #endif // Has Main
00781
00782
00783
00806
00807
00808 #ifndef __HAS_MAIN
00809 extern int fclose(FILE *stream);
00810 #else
00811 #if !defined(__cflow_processed) || defined(_uses_fclose_stdio_os1_h)
00812 int fclose(FILE *stream)
00813 {
00814 vector int sys_rval;
00815 int result;
00816
00817 if( ! stream || ! stream->fd ) {
00818 errno = EBADF;
00819 return EOF;
00820 }
00821
00822 asm("\t$io_start\n"
00823 "\t$io_fclose(0.%1)"
00824 "\t$io_end\n"
00825 "\tlmtr %0 $MEM_SYS_RVAL\n"
00826 : "=r" (sys_rval) : "r" (stream->fd));
00827
00828 *stream = (__nlcc_file_struct){0,_SYS_IOMODE_CLOSED};
00829 __n_files--;
00830
00831 result = 0;
00832 where (sys_rval.lo) {
00833 errno = sys_rval.hi;
00834 result = EOF;
00835 stream->err = 1;
00836 }
00837
00838 return result;
00839 }
00840 #endif // fclose()
00841 #endif // Has Main
00842
00843
00844
00868
00869
00870 #ifndef __HAS_MAIN
00871 extern FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);
00872 #else
00873 #if !defined(__cflow_processed) || defined(_uses_freopen_stdio_os1_h)
00874 FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream)
00875 {
00876 #ifdef __cflow_processed
00877 #error "Not implemented yet"
00878 #endif
00879 }
00880 #endif
00881 #endif // Has Main
00882
00883
00906
00907
00908 #if !defined(__cflow_processed) || defined(_uses_setbuf_stdio_os1_h)
00909 inline void setbuf(FILE * restrict stream, char * restrict buf)
00910 {
00911 #ifdef __cflow_processed
00912 #error "Not implemented yet"
00913 #endif
00914 }
00915 #endif
00916
00917
00918
00952
00953
00954 #if !defined(__cflow_processed) || defined(_uses_setvbuf_stdio_os1_h)
00955 inline int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size)
00956 {
00957 #ifdef __cflow_processed
00958 # error "Not implemented yet"
00959 #endif
00960 }
00961 #endif
00962
00963
00964
01000
01001
01002
01003
01004 #define SEEK_SET 0
01005 #define SEEK_CUR 1
01006 #define SEEK_END 2
01007
01008
01009 #if !defined(__cflow_processed) || defined(_uses__fsetpos_stdio_os1_h)
01010 inline long _fsetpos(FILE *stream, fpos_t *pos, int whence)
01011 {
01012 int sys_whence, retval;
01013 vector int sys_rval;
01014
01015 asm("\n\t!! begin _fsetpos()");
01016
01017 if( ! stream || ! stream->fd ) {
01018 errno = EBADF;
01019 return -1;
01020 }
01021
01022 sys_whence = -1;
01023 where (whence == SEEK_SET)
01024 asm("$sys_setwhence(%0, $SYS_FSE_SET)\n" : "=r" (sys_whence));
01025 where (whence == SEEK_CUR)
01026 asm("$sys_setwhence(%0, $SYS_FSE_CUR)\n" : "=r" (sys_whence));
01027 where (whence == SEEK_END)
01028 asm("$sys_setwhence(%0, $SYS_FSE_END)\n" : "=r" (sys_whence));
01029 if (sys_whence < 0) {
01030 errno = EINVAL;
01031 return -1;
01032 }
01033
01034 asm("\t$sys_fseek( 0.%0, 0.%1, %2 )\n"
01035 : : "r" (stream->fd), "r" (*pos), "r" (sys_whence));
01036 asm("\tlmtr %0 $MEM_SYS_RVAL\n" : "=r" (sys_rval));
01037 asm("\t!! end _fsetpos()\n");
01038
01039 *pos = sys_rval.hi;
01040 retval = 0;
01041 where (sys_rval.lo) {
01042 stream->err = 1;
01043 errno = sys_rval.hi;
01044 retval = -1;
01045 }
01046
01047 return retval;
01048 }
01049 #endif // fseek()
01050
01051
01052 #if !defined(__cflow_processed) || defined(_uses_fseek_stdio_os1_h)
01053 inline int fseek(FILE *stream, long offset, int whence)
01054 {
01055 fpos_t pos = offset;
01056 return _fsetpos(stream, &pos, whence);
01057 }
01058 #endif // fseek()
01059
01060
01061 #if !defined(__cflow_processed) || defined(_uses_rewind_stdio_os1_h)
01062 inline void rewind(FILE *stream)
01063 {
01064 fpos_t pos = 0;
01065 _fsetpos(stream, &pos, SEEK_SET);
01066 }
01067 #endif // rewind()
01068
01069
01070 #if !defined(__cflow_processed) || defined(_uses_fsetpos_stdio_os1_h)
01071 inline int fsetpos(FILE *stream, fpos_t *pos)
01072 {
01073 return _fsetpos(stream, pos, SEEK_SET);
01074 }
01075 #endif // fsetpos()
01076
01077
01078 #ifndef __HAS_MAIN
01079 extern int fgetpos(FILE *stream, fpos_t *pos);
01080 #else
01081 #if !defined(__cflow_processed) || defined(_uses_fgetpos_stdio_os1_h)
01082 int fgetpos(FILE *stream, fpos_t *pos)
01083 {
01084 *pos = 0;
01085 return _fsetpos(stream, pos, SEEK_CUR);
01086 }
01087 #endif // fgetpos()
01088 #endif // Has Main
01089
01090
01091 #ifndef __HAS_MAIN
01092 extern long ftell(FILE *stream);
01093 #else
01094 #if !defined(__cflow_processed) || defined(_uses_ftell_stdio_os1_h)
01095 long ftell(FILE *stream) {
01096 fpos_t *pos = 0;
01097 long result;
01098
01099 result = _fsetpos(stream, pos, SEEK_CUR);
01100
01101 where (result == 0)
01102 result = *pos;
01103
01104 return result;
01105 }
01106 #endif // ftell()
01107 #endif // Has Main
01108
01109
01110
01149
01150
01151 #define _fputs(str, stream, sep) \
01152 int retval; \
01153 vector int sys_rval; \
01154 \
01155 if(! stream->fd) { \
01156 return EOF; \
01157 } \
01158 \
01159 asm("\t$io_start\n" \
01160 "\t$io_fd( 0.%1 )\n" \
01161 "\t\\equl $cmd $SYS_IOCMD_GWR\n" \
01162 "\t\\equl $fmtsep <$SYS_IOFMT_VARSTR .or. %2>\n" \
01163 "\t\\equl $dev $SYS_IODEV_MEM\n" \
01164 "\t\\equl $l 0\n" \
01165 "\t\\equl $bs $SYS_IOBS_V\n" \
01166 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n" \
01167 "\t$io_packet($cmd, $fmtsep, $rdflg, $dev, $l, $bs, 0.%3)\n" \
01168 "\t$io_end\n" \
01169 "\tlmtr %0 $MEM_SYS_RVAL\n" \
01170 : "=r" (sys_rval) : "r" (stream->fd), "I" (sep), "r" (str)); \
01171 \
01172 retval = 0; \
01173 where (sys_rval.lo) { \
01174 retval = EOF; \
01175 stream->err = 1; \
01176 errno = sys_rval.hi; \
01177 } \
01178 \
01179 return retval;
01180
01181 #if !defined(__cflow_processed) || defined(_uses_fputs_stdio_os1_h)
01182 inline int fputs(const char *str, FILE *stream)
01183 {
01184 _fputs(str, stream, _SYS_IOPSEP_NOP)
01185 }
01186 #endif // fputs()
01187
01188 #if !defined(__cflow_processed) || defined(_uses_puts_stdio_os1_h)
01189 inline int puts(const char *str)
01190 {
01191 _fputs(str, stdout, _SYS_IOPSEP_NL)
01192 }
01193 #endif
01194
01195 #undef _fputs
01196
01197 #if !defined(__cflow_processed) || defined(_uses_fputc_stdio_os1_h)
01198 inline int fputc(int c, FILE *stream)
01199 {
01200 int buf[2], retval;
01201
01202 buf[0] = c;
01203 buf[1] = 0;
01204
01205 retval = fputs((char *) buf, stream);
01206
01207 where (retval != EOF)
01208 retval = c;
01209
01210 return retval;
01211 }
01212 #endif // fputc()
01213
01214
01215 #define putc(C, STR) fputc(C, STR)
01216
01217
01218 #if !defined(__cflow_processed) || defined(_uses_putchar_stdio_os1_h)
01219 inline int putchar(int c)
01220 {
01221 return putc(c,stdout);
01222 }
01223 #endif
01224
01225
01226
01227 #include <assert.h>
01228
01229
01230
01270
01271
01272 #ifndef __HAS_MAIN
01273 extern size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
01274 #else
01275 #if !defined(__cflow_processed) || defined(_uses_fread_stdio_os1_h)
01276 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
01277 {
01278 int retval, nbytes, nwords;
01279 vector int sys_rval;
01280
01281 nbytes = size * nmemb;
01282 nwords = (nbytes >> 4);
01283 assert((nwords*16) == nbytes);
01284
01285 asm("\t$io_start\n"
01286 "\t\\equl $cmd $SYS_IOCMD_BRD\n"
01287 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01288 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01289 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01290 "\t\\equl $dev $SYS_IODEV_MEM\n"
01291 "\t\\equl $bs $SYS_IOBS_V\n"
01292 "\t$io_fd( 0.%2 )\n"
01293 "\t$io_slice_all\n"
01294 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0.%1, $bs, 0.%3)\n"
01295 "\t$io_end\n"
01296 "\tlmtr %0 $MEM_SYS_RVAL\n"
01297 : "=r" (sys_rval) : "r" (nwords), "r" (stream->fd), "r" (ptr) );
01298
01299
01300 retval = nmemb;
01301 where (sys_rval.lo) {
01302 stream->err = 1;
01303 retval = 0;
01304 }
01305
01306 return retval;
01307 }
01308 #endif // fread
01309 #endif // Has Main
01310
01311
01312 #ifndef __HAS_MAIN
01313 extern size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
01314 #else
01315 #if !defined(__cflow_processed) || defined(_uses_fwrite_stdio_os1_h)
01316 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
01317 {
01318 int retval, nbytes, nword;
01319 vector int sys_rval;
01320
01321 nbytes = size * nmemb;
01322 assert( (nbytes%16)==0 );
01323
01324 asm("\t$io_start\n"
01325 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
01326 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01327 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01328 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01329 "\t\\equl $dev $SYS_IODEV_MEM\n"
01330 "\t\\equl $l %1>>4\n"
01331 "\t\\equl $bs $SYS_IOBS_V\n"
01332 "\t$io_fd( 0.%2 )\n"
01333 "\t$io_slice_all\n"
01334 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01335 "\t$io_end\n"
01336 "\tlmtr %0 $MEM_SYS_RVAL\n"
01337 : "=r" (sys_rval) : "r" (nbytes), "r" (stream->fd), "r" (ptr) );
01338
01339
01340 retval = nmemb;
01341 where (sys_rval.lo) {
01342 stream->err = 1;
01343 retval = 0;
01344 }
01345
01346 return retval;
01347 }
01348 #endif // fwrite()
01349 #endif // Has Main
01350
01351
01352
01353
01354
01395
01396
01397 #define tfread(PTR,NMEMB,STREAM) __tfread(__typecode(*PTR),PTR,NMEMB,STREAM)
01398
01399 #ifndef __HAS_MAIN
01400 extern size_t __tfread(int tcode, const void *ptr, size_t nmemb, FILE *stream);
01401 #else
01402 #if !defined(__cflow_processed) || defined(_uses___tfread_stdio_os1_h)
01403 size_t __tfread(int tcode, const void *ptr, size_t nmemb, FILE *stream)
01404 {
01405 int retval;
01406 vector int sys_rval;
01407
01408
01409 #define __iopacket(rdflg) \
01410 asm("\t$io_start\n" \
01411 "\t\\equl $cmd $SYS_IOCMD_BRD\n" \
01412 "\t\\equl $fmt $SYS_IOFMT_BIN\n" \
01413 "\t\\equl $sep $SYS_IOPSEP_NOP\n" \
01414 "\t\\equl $rdflg %1\n" \
01415 "\t\\equl $dev $SYS_IODEV_MEM\n" \
01416 "\t\\equl $l 0.%2\n" \
01417 "\t\\equl $bs $SYS_IOBS_V\n" \
01418 "\t$io_fd( 0.%3 )\n" \
01419 "\t$io_slice_all\n" \
01420 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%4)\n" \
01421 "\t$io_end\n" \
01422 "\tlmtr %0 $MEM_SYS_RVAL\n" \
01423 : "=r" (sys_rval) : "I" (rdflg), "r" (nmemb), "r" (stream->fd), "r" (ptr))
01424
01425 if ((tcode==NLCC_FLOAT) || (tcode==NLCC_DOUBLE)) {
01426 __iopacket(_SYS_IORDFLG_HZERO);
01427 }
01428 else if ((tcode==NLCC_INT) || (tcode==NLCC_UNSIGNED)) {
01429 __iopacket(_SYS_IORDFLG_HMIRROR);
01430 }
01431 else if ((tcode==NLCC_COMPLEX) || (tcode==NLCC_VECTOR) || (tcode==NLCC_VFLOAT) ||
01432 (tcode==NLCC_VINT) || (tcode==NLCC_VUINT)) {
01433 __iopacket(_SYS_IORDFLG_NOP);
01434 }
01435 else {
01436 assert(0);
01437 }
01438
01439 #undef __iopacket
01440
01441
01442 retval = nmemb;
01443 where (sys_rval.lo) {
01444 stream->err = 1;
01445 retval = 0;
01446 }
01447
01448 return retval;
01449 }
01450 #endif // tfread
01451 #endif // Has Main
01452
01453
01454 #define tfwrite(PTR,NMEMB,STREAM) __tfwrite(__typecode(*PTR),PTR,NMEMB,STREAM)
01455
01456
01457 #ifndef __HAS_MAIN
01458 extern size_t __tfwrite(int tcode, const void *ptr, size_t nmemb, FILE *stream);
01459 #else
01460 #if !defined(__cflow_processed) || defined(_uses___tfwrite_stdio_os1_h)
01461 size_t __tfwrite(int tcode, const void *ptr, size_t nmemb, FILE *stream)
01462 {
01463 int retval;
01464 vector int sys_rval;
01465
01466 if( (tcode==NLCC_FLOAT) || (tcode==NLCC_DOUBLE) || (tcode==NLCC_INT) || (tcode==NLCC_UNSIGNED) )
01467 {
01468 asm("\t$io_start\n"
01469 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
01470 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01471 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01472 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01473 "\t\\equl $dev $SYS_IODEV_MEM\n"
01474 "\t\\equl $l 0.%1\n"
01475 "\t\\equl $bs $SYS_IOBS_L\n"
01476 "\t$io_fd( 0.%2 )\n"
01477 "\t$io_slice_all\n"
01478 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01479 "\t$io_end\n"
01480 "\tlmtr %0 $MEM_SYS_RVAL\n"
01481 : "=r" (sys_rval) : "r" (nmemb), "r" (stream->fd), "r" (ptr) );
01482 }
01483 else
01484 if( (tcode==NLCC_COMPLEX) || (tcode==NLCC_VECTOR) || (tcode==NLCC_VFLOAT)
01485 || (tcode==NLCC_VINT) || (tcode==NLCC_VUINT) )
01486 {
01487 asm("\t$io_start\n"
01488 "\t\\equl $cmd $SYS_IOCMD_GWR\n"
01489 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01490 "\t\\equl $sep $SYS_IOPSEP_NOP\n"
01491 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01492 "\t\\equl $dev $SYS_IODEV_MEM\n"
01493 "\t\\equl $l 0.%1\n"
01494 "\t\\equl $bs $SYS_IOBS_V\n"
01495 "\t$io_fd( 0.%2 )\n"
01496 "\t$io_slice_all\n"
01497 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%3)\n"
01498 "\t$io_end\n"
01499 "\tlmtr %0 $MEM_SYS_RVAL\n"
01500 : "=r" (sys_rval) : "r" (nmemb), "r" (stream->fd), "r" (ptr) );
01501 }
01502 else
01503 {
01504 assert(0);
01505 }
01506
01507
01508 retval = nmemb;
01509 where (sys_rval.lo) {
01510 stream->err = 1;
01511 retval = 0;
01512 }
01513
01514 return retval;
01515 }
01516 #endif // tfwrite
01517 #endif // Has Main
01518
01519
01520
01554
01555
01556 #define __IOPUT_INIT \
01557 int retval;\
01558 vector int sys_rval;\
01559 \
01560 _Pragma("localmem");\
01561 \
01562
01563 #define __IOPUT(ITYPE,CTYPE) \
01564 asm("\n\t!! begin fput"#CTYPE"()");\
01565 asm("\t$io_start\n"\
01566 "\t$io_fd( 0.%1 )\n"\
01567 "\t$io_put"#ITYPE"( 0x0.%2 )\n"\
01568 "\t$io_end\n"\
01569 "\tlmtr %0 $MEM_SYS_RVAL\n"\
01570 : "=r" (sys_rval) : "r" (stream->fd), "r" (&val) );\
01571 \
01572 retval = 0;\
01573 where (sys_rval.lo) {\
01574 stream->err = 1;\
01575 retval = -1;\
01576 }\
01577 asm("\t!! end fput"#CTYPE"()\n");\
01578 return retval
01579
01580 #define fputf(VAL,STREAM) fputd(VAL, STREAM)
01581 #define putf(VAL,STREAM) putd(VAL, STREAM)
01582
01583 #if !defined(__cflow_processed) || defined(_uses_fputd_stdio_os1_h)
01584 inline int fputd(const double val, FILE *stream) { __IOPUT_INIT
01585 __IOPUT(e,d); }
01586 #endif // fputd()
01587
01588 #if !defined(__cflow_processed) || defined(_uses_putd_stdio_os1_h)
01589 inline int putd(const double val) { return fputd( val, stdout ); }
01590 #endif
01591
01592 #if !defined(__cflow_processed) || defined(_uses_fputx_stdio_os1_h)
01593 inline int fputx(const complex val, FILE *stream) { __IOPUT_INIT
01594 __IOPUT(z,x); }
01595 #endif // fputx()
01596
01597 #if !defined(__cflow_processed) || defined(_uses_putx_stdio_os1_h)
01598 inline int putx(const complex val) { return fputx( val, stdout ); }
01599 #endif
01600
01601 #if !defined(__cflow_processed) || defined(_uses_fputv_stdio_os1_h)
01602 inline int fputv(const vector val, FILE *stream) { __IOPUT_INIT
01603 __IOPUT(z,x); }
01604 #endif // fputv()
01605
01606 #if !defined(__cflow_processed) || defined(_uses_putv_stdio_os1_h)
01607 inline int putv(const vector val ) { return fputv( val, stdout ); }
01608 #endif
01609
01610 #if !defined(__cflow_processed) || defined(_uses_fputi_stdio_os1_h)
01611 inline int fputi(const int val, FILE *stream) { __IOPUT_INIT
01612 __IOPUT(d,i); }
01613 #endif // fputi()
01614
01615 #if !defined(__cflow_processed) || defined(_uses_puti_stdio_os1_h)
01616 inline int puti(const int val) { return fputi( val, stdout ); }
01617 #endif
01618
01619 #if !defined(__cflow_processed) || defined(_uses_fputiv_stdio_os1_h)
01620 inline int fputiv(const vector int val, FILE *stream) { __IOPUT_INIT
01621 __IOPUT(dv,iv); }
01622 #endif // fputiv()
01623
01624 #if !defined(__cflow_processed) || defined(_uses_putiv_stdio_os1_h)
01625 inline int putiv(const vector int val) { return fputiv( val, stdout ); }
01626 #endif
01627
01628 #if !defined(__cflow_processed) || defined(_uses_fputh_stdio_os1_h)
01629 inline int fputh( const int val, FILE *stream) { __IOPUT_INIT
01630 __IOPUT(x,h); }
01631 #endif // fputh()
01632
01633 #if !defined(__cflow_processed) || defined(_uses_fputhv_stdio_os1_h)
01634 inline int fputhv(const int val, FILE *stream) { __IOPUT_INIT
01635 __IOPUT(xv,hv); }
01636 #endif // fputhv()
01637
01638 #if !defined(__cflow_processed) || defined(_uses_puth_stdio_os1_h)
01639 inline int puth(const int val ) { return fputh( val, stdout ); }
01640 #endif
01641
01642 #if !defined(__cflow_processed) || defined(_uses_puthv_stdio_os1_h)
01643 inline int puthv(const int val ) { return fputhv( val, stdout ); }
01644 #endif
01645
01646 #define __IOPUTA(CTS,ITYPE,BS) \
01647 asm("\n\t!! begin fput"#CTS"a()");\
01648 asm("\t$io_start\n"\
01649 "\t$io_fd( 0.%1 )\n"\
01650 "\t\\equl $cmd $SYS_IOCMD_GWR\n"\
01651 "\t\\equl $fmt <$SYS_IOFMT_"#ITYPE">\n"\
01652 "\t\\equl $sep <$SYS_IOPSEP_NL .or. $SYS_IOWSEP_SPACE>\n"\
01653 "\t\\equl $dev $SYS_IODEV_MEM\n"\
01654 "\t\\equl $bs "#BS"\n"\
01655 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"\
01656 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0.%2, $bs, 0.%3)\n"\
01657 "\t$io_end\n"\
01658 "\tlmtr %0 $MEM_SYS_RVAL\n"\
01659 : "=r" (sys_rval)\
01660 : "r" (stream->fd), "r" (len), "r" (ptr) );\
01661 \
01662 retval = 0;\
01663 where (sys_rval.lo) {\
01664 stream->err = 1;\
01665 retval = -1;\
01666 }\
01667 asm("\t!! end fput"#CTS"a()\n");\
01668 return retval
01669
01670 #if !defined(__cflow_processed) || defined(_uses_fputia_stdio_os1_h)
01671 inline int fputia(const int *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(i,INT,$SYS_IOBS_L); }
01672 #endif // fputia()
01673
01674 #if !defined(__cflow_processed) || defined(_uses_fputiva_stdio_os1_h)
01675 inline int fputiva(const int *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(i,INT.or.$SYS_IOBSEP_SBRACKET,$SYS_IOBS_V); }
01676 #endif // fputiva()
01677
01678 #if !defined(__cflow_processed) || defined(_uses_fputxa_stdio_os1_h)
01679 inline int fputxa(const complex *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(x,DBL.or.$SYS_IOBSEP_RBRACKET,$SYS_IOBS_V); }
01680 #endif // fputxa()
01681
01682 #if !defined(__cflow_processed) || defined(_uses_fputva_stdio_os1_h)
01683 inline int fputva(const vector *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(x,DBL.or.$SYS_IOBSEP_RBRACKET,$SYS_IOBS_V); }
01684 #endif // fputva()
01685
01686 #if !defined(__cflow_processed) || defined(_uses_fputda_stdio_os1_h)
01687 inline int fputda( const double *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(d,DBL,$SYS_IOBS_L); }
01688 #endif // fputda()
01689
01690 #if !defined(__cflow_processed) || defined(_uses_fputua_stdio_os1_h)
01691 inline int fputua( const unsigned *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(u,UINT,$SYS_IOBS_L); }
01692 #endif // fputua()
01693
01694 #if !defined(__cflow_processed) || defined(_uses_fputha_stdio_os1_h)
01695 inline int fputha( const int *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(h,HEX,$SYS_IOBS_L); }
01696 #endif // fputha()
01697
01698 #if !defined(__cflow_processed) || defined(_uses_fputhva_stdio_os1_h)
01699 inline int fputhva( const int *ptr, int len, FILE *stream) { __IOPUT_INIT __IOPUTA(h,HEX.or.$SYS_IOBSEP_SBRACKET,$SYS_IOBS_V); }
01700 #endif // fputhva()
01701
01702 #if !defined(__cflow_processed) || defined(_uses_putia_stdio_os1_h)
01703 inline int putia( const int *ptr, int len ) { return fputia( ptr, len, stdout ); }
01704 #endif // putia()
01705
01706 #if !defined(__cflow_processed) || defined(_uses_putiva_stdio_os1_h)
01707 inline int putiva( const int *ptr, int len ) { return fputiva( ptr, len, stdout ); }
01708 #endif // putiva()
01709
01710 #if !defined(__cflow_processed) || defined(_uses_putxa_stdio_os1_h)
01711 inline int putxa( const complex *ptr, int len ) { return fputxa( ptr, len, stdout ); }
01712 #endif // putxa()
01713
01714 #if !defined(__cflow_processed) || defined(_uses_putva_stdio_os1_h)
01715 inline int putva( const vector *ptr, int len ) { return fputva( ptr, len, stdout ); }
01716 #endif // putva()
01717
01718 #if !defined(__cflow_processed) || defined(_uses_putda_stdio_os1_h)
01719 inline int putda( const double *ptr, int len ) { return fputda( ptr, len, stdout ); }
01720 #endif // putda()
01721
01722 #if !defined(__cflow_processed) || defined(_uses_putua_stdio_os1_h)
01723 inline int putua( const unsigned *ptr, int len ) { return fputua( ptr, len, stdout ); }
01724 #endif // putua()
01725
01726 #if !defined(__cflow_processed) || defined(_uses_putha_stdio_os1_h)
01727 inline int putha( const int *ptr, int len ) { return fputha( ptr, len, stdout ); }
01728 #endif // putha()
01729
01730 #if !defined(__cflow_processed) || defined(_uses_puthva_stdio_os1_h)
01731 inline int puthva( const int *ptr, int len ) { return fputha( ptr, len, stdout ); }
01732 #endif // puthva()
01733
01734
01735
01757
01758
01759 #ifndef __HAS_MAIN
01760
01761 extern int fgetd( double *ptr, FILE *stream);
01762 extern int getd( double *ptr );
01763 extern int fgetx( complex *ptr, FILE *stream);
01764 extern int getx( complex *ptr ) ;
01765 extern int fgetv( vector *ptr, FILE *stream) ;
01766 extern int getv( vector *ptr ) ;
01767 extern int fgeti( int *ptr, FILE *stream) ;
01768 extern int geti( int *ptr ) ;
01769
01770 #else
01771 #define __IOGET(ITYPE,CTYPE) \
01772 asm("\n\t!! begin fget"#CTYPE"()");\
01773 asm("\t$io_start\n"\
01774 "\t$io_fd( 0.%1 )\n"\
01775 "\t$io_slice_all\n"\
01776 "\t$io_get"#ITYPE"( 0.%2 )\n"\
01777 "\t$io_end\n"\
01778 "\tlmtr %0 $MEM_SYS_RVAL\n"\
01779 : "=r" (sys_rval) : "r" (stream->fd), "r" (ptr) );\
01780 \
01781 retval = 0;\
01782 where (sys_rval.lo) {\
01783 stream->err = 1;\
01784 retval = -1;\
01785 }\
01786 asm("\t!! end fget"#CTYPE"()");\
01787 return retval
01788
01789 #if !defined(__cflow_processed) || defined(_uses_fgetd_stdio_os1_h)
01790 int fgetd( double *ptr, FILE *stream) { __IOPUT_INIT
01791 __IOGET(e,d); }
01792 #endif // fgetd()
01793
01794 #if !defined(__cflow_processed) || defined(_uses_getd_stdio_os1_h)
01795 int getd( double *ptr ) { return fgetd( ptr, stdin ); }
01796 #endif // fgetd()
01797
01798 #if !defined(__cflow_processed) || defined(_uses_fgetx_stdio_os1_h)
01799 int fgetx( complex *ptr, FILE *stream) { __IOPUT_INIT
01800 __IOGET(z,x); }
01801 #endif // fgetx()
01802
01803 #if !defined(__cflow_processed) || defined(_uses_getx_stdio_os1_h)
01804 int getx( complex *ptr ) { return fgetx( ptr, stdin ); }
01805 #endif // fgetx()
01806
01807 #if !defined(__cflow_processed) || defined(_uses_fgetv_stdio_os1_h)
01808 int fgetv( vector *ptr, FILE *stream) { __IOPUT_INIT
01809 __IOGET(z,x); }
01810 #endif // fgetv()
01811
01812 #if !defined(__cflow_processed) || defined(_uses_getv_stdio_os1_h)
01813 int getv( vector *ptr ) { return fgetv( ptr, stdin ); }
01814 #endif // fgetv()
01815
01816 #if !defined(__cflow_processed) || defined(_uses_fgeti_stdio_os1_h)
01817 int fgeti( int *ptr, FILE *stream) { __IOPUT_INIT
01818 __IOGET(d,i); }
01819 #endif // fgeti()
01820
01821 #if !defined(__cflow_processed) || defined(_uses_geti_stdio_os1_h)
01822 int geti( int *ptr ) { return fgeti( ptr, stdin ); }
01823 #endif // fgeti()
01824
01825 #endif // __HAS_MAIN
01826
01827
01855
01856
01857 #define printf(ARGS...) fprintf(stdout, ##ARGS)
01858 #define vprintf(FMT, ARG) vfprintf(stdout, (FMT), (ARG))
01859
01860 #ifndef __HAS_MAIN
01861 extern int fprintf(FILE *stream, const char *format, ...);
01862 #else
01863 #if !defined(__cflow_processed) || defined(_uses_fprintf_stdio_os1_h)
01864 int fprintf(FILE *stream, const char *format, ...)
01865 {
01866 #pragma localmem
01867
01868 int iocnt;
01869 vector int argcnt, sys_rval;
01870 va_list ap;
01871
01872 asm("\t!! begin fprintf()");
01873
01874 if (!stream || !stream->fd) {
01875 errno = EBADF;
01876 return 0;
01877 }
01878
01879 argcnt = __builtin_argcount();
01880 iocnt = argcnt.lo - 2;
01881
01882
01883 asm("\t$io_start\n"
01884 "\t$io_fd( 0.%0 )\n"
01885 "\t$io_cnt_set( %2 )\n"
01886 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01887 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
01888 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_SPACE>\n"
01889 "\t\\equl $dev $SYS_IODEV_MEM\n"
01890 "\t\\equl $bs $SYS_IOBS_V\n"
01891 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01892 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%1)\n"
01893 : : "r" (stream->fd), "r" (format), "r" (iocnt) );
01894
01895 asm("\t$io_setloopflg\n");
01896
01897 va_start(ap, format);
01898 for( ; iocnt > 0; iocnt-- ) {
01899 vector int arginfo = _va_info(ap);
01900 void *ptr = _va_ptr(ap);
01901 _va_skip( ap, arginfo.lo );
01902 if( arginfo.hi == NLCC_STRING ) {
01903 char *str = *(char **)ptr;
01904 asm("\t$io_cnt_decr\n"
01905 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01906 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
01907 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
01908 "\t\\equl $dev $SYS_IODEV_MEM\n"
01909 "\t\\equl $bs $SYS_IOBS_V\n"
01910 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01911 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%0)\n"
01912 : : "r" (str) );
01913 } else {
01914 asm("\t$io_cnt_decr\n"
01915 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01916 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01917 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
01918 "\t\\equl $dev $SYS_IODEV_MEM\n"
01919 "\t\\equl $l 0.%1\n"
01920 "\t\\equl $bs $SYS_IOBS_V\n"
01921 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01922 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%0)\n"
01923 : : "r" (ptr), "r" (arginfo.lo) );
01924 }
01925 }
01926 va_end(ap);
01927
01928 asm("\t$io_cnt_clear\n"
01929 "\t$io_end\n"
01930 "\tlmtr %0 $MEM_SYS_RVAL\n"
01931 "\t!! end fprintf()\n"
01932 : "=r" (sys_rval));
01933
01934 where (sys_rval.lo)
01935 stream->err = 1;
01936
01937 asm("\t!! end fprintf()");
01938
01939 return (int) (sys_rval.hi);
01940 }
01941 #endif // fprintf()
01942 #endif // Has Main
01943
01944
01945 #ifndef __HAS_MAIN
01946 extern int vfprintf(FILE * restrict stream, const char * restrict format, va_list ap);
01947 #else
01948 #if !defined(__cflow_processed) || defined(_uses_vfprintf_stdio_os1_h)
01949 int vfprintf(FILE * restrict stream, const char * restrict format, va_list ap) {
01950 int n_args, argc;
01951 vector int sys_rval;
01952
01953 asm("\t!! begin vfprintf()");
01954 #pragma localmem
01955 n_args = _va_args(ap);
01956
01957 if( ! stream->fd ) {
01958 errno = EBADF;
01959 return 0;
01960 }
01961
01962
01963 asm("\t$io_start\n"
01964 "\t$io_fd( 0.%0 )\n"
01965 "\t$io_cnt_set( %2 )\n"
01966 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01967 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
01968 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_SPACE>\n"
01969 "\t\\equl $dev $SYS_IODEV_MEM\n"
01970 "\t\\equl $bs $SYS_IOBS_V\n"
01971 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01972 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%1)"
01973 : : "r" (stream->fd), "r" (format), "r" (n_args) );
01974
01975 for( ; n_args > 0; n_args -- ) {
01976 vector int arginfo = _va_info(ap);
01977 void *ptr = _va_ptr(ap);
01978 _va_skip( ap, arginfo.lo );
01979 if( arginfo.hi == NLCC_STRING ) {
01980 char *str = *(char **)ptr;
01981 asm("\t$io_cnt_decr\n"
01982 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01983 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
01984 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
01985 "\t\\equl $dev $SYS_IODEV_MEM\n"
01986 "\t\\equl $bs $SYS_IOBS_V\n"
01987 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01988 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, 0, $bs, 0.%0)\n"
01989 : : "r" (str) );
01990 } else {
01991 asm("\t$io_cnt_decr\n"
01992 "\t\\equl $cmd $SYS_IOCMD_PRF\n"
01993 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
01994 "\t\\equl $sep <$SYS_IOPSEP_NOP .or. $SYS_IOWSEP_NOP>\n"
01995 "\t\\equl $dev $SYS_IODEV_MEM\n"
01996 "\t\\equl $l 0.%1\n"
01997 "\t\\equl $bs $SYS_IOBS_V\n"
01998 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
01999 "\t$io_packet($cmd, <$fmt .or. $sep>, $rdflg, $dev, $l, $bs, 0.%0)\n"
02000 : : "r" (ptr), "r" (arginfo.lo) );
02001 }
02002 }
02003 asm("\t$io_cnt_clear\n"
02004 "\t$io_end\n"
02005 "\t!! end vfprintf()\n"
02006 "\tlmtr %0 $MEM_SYS_RVAL\n"
02007 : "=r" (sys_rval));
02008
02009 where (sys_rval.lo)
02010 stream->err = 1;
02011
02012 asm("\t!! end vfprintf()");
02013
02014 return (int) (sys_rval.hi);
02015 }
02016 #endif // vfprintf()
02017 #endif // Has Main
02018
02019
02020
02041
02042
02043 #define scanf(ARGS...) fscanf(stdin, ##ARGS)
02044
02045 #ifndef __HAS_MAIN
02046 extern int fscanf(FILE * restrict stream, const char * restrict format, ...);
02047 #else
02048 #if !defined(__cflow_processed) || defined(_uses_fscanf_stdio_os1_h)
02049 int fscanf(FILE * restrict stream, const char * restrict format, ...)
02050 {
02051 int iocnt;
02052 int n_args, argc;
02053 vector int argcnt, sys_rval;
02054 va_list ap;
02055
02056 if(! stream || stream->mode == _SYS_IOMODE_CLOSED) {
02057 errno = EBADF;
02058 return 0;
02059 }
02060
02061 asm("\t!! begin fscanf()");
02062 #pragma localmem
02063 argcnt = __builtin_argcount();
02064 iocnt = argcnt.lo - 2;
02065
02066
02067 asm("\t$io_start\n"
02068 "\t$io_fd( 0.%0 )\n"
02069 "\t$io_cnt_set( %2 )\n"
02070 "\t\\equl $cmd $SYS_IOCMD_SCF\n"
02071 "\t\\equl $fmt $SYS_IOFMT_VARSTR\n"
02072 "\t\\equl $dev $SYS_IODEV_MEM\n"
02073 "\t\\equl $bs $SYS_IOBS_V\n"
02074 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
02075 "\t$io_packet($cmd, $fmt, $rdflg, $dev, 0, $bs, 0.%1)"
02076 : : "r" (stream->fd), "r" (format), "r" (iocnt) );
02077
02078 va_start(ap, format);
02079 for( ; iocnt > 0; iocnt -- ) {
02080 int size = _va_info(ap);
02081 void *ptr = *(void**) (_va_ptr(ap));
02082 _va_skip( ap, size );
02083 asm("\t$io_cnt_decr\n"
02084 "\t\\equl $cmd $SYS_IOCMD_SCF\n"
02085 "\t\\equl $fmt $SYS_IOFMT_BIN\n"
02086 "\t\\equl $dev $SYS_IODEV_MEM\n"
02087 "\t\\equl $l 1\n"
02088 "\t\\equl $bs $SYS_IOBS_V\n"
02089 "\t\\equl $rdflg $SYS_IORDFLG_NOP\n"
02090 "\t$io_packet($cmd, $fmt, $rdflg, $dev, $l, $bs, 0.%0)"
02091 : : "r" (ptr) );
02092 }
02093 va_end(ap);
02094 asm("\t$io_cnt_clear\n"
02095 "\t$io_end\n"
02096 "\t!! end fscanf()\n"
02097 "\tlmtr %0 $MEM_SYS_RVAL\n"
02098 : "=r" (sys_rval));
02099
02100 where (sys_rval.lo)
02101 stream->err = 1;
02102
02103 return (int) (sys_rval.hi);
02104 }
02105 #endif
02106 #endif // Has Main
02107
02108
02109
02138
02139
02140 #ifndef __HAS_MAIN
02141 extern void clearerr(FILE *stream);
02142 #else
02143 #if !defined(__cflow_processed) || defined(_uses_clearerr_stdio_os1_h)
02144 void clearerr(FILE *stream)
02145 {
02146 stream->err = 0;
02147 }
02148 #endif
02149 #endif // Has Main
02150
02151
02152 #ifndef __HAS_MAIN
02153 extern int feof(FILE *stream);
02154 #else
02155 #if !defined(__cflow_processed) || defined(_uses_feof_stdio_os1_h)
02156 int feof(FILE *stream)
02157 {
02158 vector int sys_rval;
02159 int ret;
02160
02161 if( ! stream || ! stream->fd ) {
02162 errno = EBADF;
02163 return EOF;
02164 }
02165
02166 asm("\t$io_start\n"
02167 "\t$io_fd(0.%1)"
02168 "\t$io_feof($SYS_IODEV_MEM, 0.%2)"
02169 "\t$io_end\n"
02170 "\tlmtr %0 $MEM_SYS_RVAL\n"
02171 : "=r" (sys_rval) : "r" (stream->fd), "r" (&ret));
02172
02173 where (ret != 0 || sys_rval.hi != 0)
02174 ret = EOF;
02175
02176 return ret;
02177 }
02178 #endif
02179 #endif // Has Main
02180
02181
02182 #ifndef __HAS_MAIN
02183 extern inline int ferror(FILE *stream);
02184 #else
02185 #if !defined(__cflow_processed) || defined(_uses_ferror_stdio_os1_h)
02186 inline int ferror(FILE *stream)
02187 {
02188 return stream->err;
02189 }
02190 #endif
02191 #endif // Has Main
02192
02193
02194
02219
02220
02221 #ifndef __HAS_MAIN
02222 extern void perror(const char *s);
02223 #else
02224 #if !defined(__cflow_processed) || defined(_uses_perror_stdio_os1_h)
02225 void perror(const char *s)
02226 {
02227 if( s && s[0] ) {
02228 fputs(s,stderr);
02229 fputs(": ",stderr);
02230 }
02231 fputs(strerror(errno),stderr);
02232 fputs("\n",stderr);
02233 }
02234 #endif // perror()
02235 #endif // Has Main
02236
02237
02238
02250
02251
02252 #if !defined(__cflow_processed) || defined(_uses_fileno_stdio_os1_h)
02253 inline int fileno(FILE *stream)
02254 {
02255 return stream->fd;
02256 }
02257 #endif // fileno()
02258
02259
02260
02261
02262
02263
02264 #include <os1/slice_stdio_os1.h>
02265
02266 #endif