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.37 2006/05/06 14:42:24 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 //------------------------------------------------------------------------------
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     /* check if number of open files exceeded */
00718     if( __n_files == __NLCC_OS1_MAX_FILES__ ) {
00719         errno = EMFILE;
00720         return NULL;
00721     }
00722     
00723     /* convert mode string into mode bits */
00724     /* return NULL for invalid mode       */
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         // unless we miscounted, fi _is_ now < __NLCC_OS1_MAX_FILES__
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         // check OS1 return code and set errno if necessary
00767         // success: .L==0, fail: .L!=0
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 // The possibilities for the third argument to `fseek'.
01003 // These values should not be changed!
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 // assert.h has to be include here
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         // check return code
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         // check OS1 return code
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 // Non-standard functions
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   // check OS1 return code
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         // check OS return code
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         // output format string
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         // output format string
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         // output format string
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 // OS1 multidata functions
02262 //------------------------------------------------------------------------------
02263 
02264 #include <os1/slice_stdio_os1.h>
02265 
02266 #endif /* _NLIBC_OS1_STDIO_H */

Generated on Fri Jul 14 10:51:32 2006 for nlibc by doxygen 1.3.5