Main Page | Alphabetical List | Class List | File List | Class Members | File Members

stdio_os1.h

Go to the documentation of this file.
00001 /* =============
00002  * apeNEXT/nlibc
00003  * =============
00004  *
00005  * $Id: stdio_os1.h,v 1.32 2005/12/22 21:49:45 pleiter Exp $
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>             // for strerror etc.
00017 #include <stdarg.h>             // for va_list etc.
00018 #include <typecodes.h>          // nlcc type codes
00019 
00020 
00021 //------------------------------------------------------------------------------
00022 // OS0 compatibility routines
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     /* check if number of open files exceeded */
00706     if( __n_files == __NLCC_OS1_MAX_FILES__ ) {
00707         errno = EMFILE;
00708         return NULL;
00709     }
00710     
00711     /* convert mode string into mode bits */
00712     /* return NULL for invalid mode       */
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         // unless we miscounted, fi _is_ now < __NLCC_OS1_MAX_FILES__
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         // check OS1 return code and set errno if necessary
00755         // success: .L==0, fail: .L!=0
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 // The possibilities for the third argument to `fseek'.
00991 // These values should not be changed!
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 // assert.h has to be include here
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         // check return code
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         // check OS1 return code
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 // Non-standard functions
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         // check OS1 return code
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         // check OS return code
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         // output format string
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         // output format string
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         // output format string
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 // OS1 multidata functions
02240 //------------------------------------------------------------------------------
02241 
02242 #include <os1/slice_stdio_os1.h>
02243 
02244 #endif /* _NLIBC_OS1_STDIO_H */

Generated on Tue Jan 10 12:43:39 2006 for nlibc by doxygen 1.3.5