home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / crt / src / internal.h < prev    next >
C/C++ Source or Header  |  1998-06-17  |  17KB  |  609 lines

  1. /***
  2. *internal.h - contains declarations of internal routines and variables
  3. *
  4. *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
  5. *
  6. *Purpose:
  7. *       Declares routines and variables used internally by the C run-time.
  8. *
  9. *       [Internal]
  10. *
  11. ****/
  12.  
  13. #if _MSC_VER > 1000
  14. #pragma once
  15. #endif  /* _MSC_VER > 1000 */
  16.  
  17. #ifndef _INC_INTERNAL
  18. #define _INC_INTERNAL
  19.  
  20. #ifndef _CRTBLD
  21. /*
  22.  * This is an internal C runtime header file. It is used when building
  23.  * the C runtimes only. It is not to be used as a public header file.
  24.  */
  25. #error ERROR: Use of C runtime library internal header file.
  26. #endif  /* _CRTBLD */
  27.  
  28. #ifdef __cplusplus
  29. extern "C" {
  30. #endif  /* __cplusplus */
  31.  
  32. #include <cruntime.h>
  33.  
  34. /*
  35.  * Conditionally include windows.h to pick up the definition of
  36.  * CRITICAL_SECTION.
  37.  */
  38. #ifdef _MT
  39. #include <windows.h>
  40. #endif  /* _MT */
  41.  
  42.  
  43. /* Define _CRTIMP */
  44.  
  45. #ifndef _CRTIMP
  46. #ifdef CRTDLL
  47. #define _CRTIMP __declspec(dllexport)
  48. #else  /* CRTDLL */
  49. #ifdef _DLL
  50. #define _CRTIMP __declspec(dllimport)
  51. #else  /* _DLL */
  52. #define _CRTIMP
  53. #endif  /* _DLL */
  54. #endif  /* CRTDLL */
  55. #endif  /* _CRTIMP */
  56.  
  57.  
  58. /* Define _CRTIMP1 */
  59.  
  60. #ifndef _CRTIMP1
  61. #ifdef CRTDLL1
  62. #define _CRTIMP1 __declspec(dllexport)
  63. #else  /* CRTDLL1 */
  64. #define _CRTIMP1 _CRTIMP
  65. #endif  /* CRTDLL1 */
  66. #endif  /* _CRTIMP1 */
  67.  
  68.  
  69. /* Define _CRTIMP2 */
  70. #ifndef _CRTIMP2
  71. #ifdef CRTDLL2
  72. #define _CRTIMP2 __declspec(dllexport)
  73. #else  /* CRTDLL2 */
  74. #ifdef _DLL
  75. #define _CRTIMP2 __declspec(dllimport)
  76. #else  /* _DLL */
  77. #define _CRTIMP2
  78. #endif  /* _DLL */
  79. #endif  /* CRTDLL2 */
  80. #endif  /* _CRTIMP2 */
  81.  
  82.  
  83. /* Define __cdecl for non-Microsoft compilers */
  84.  
  85. #if (!defined (_MSC_VER) && !defined (__cdecl))
  86. #define __cdecl
  87. #endif  /* (!defined (_MSC_VER) && !defined (__cdecl)) */
  88.  
  89. #ifndef _WCHAR_T_DEFINED
  90. typedef unsigned short wchar_t;
  91. #define _WCHAR_T_DEFINED
  92. #endif  /* _WCHAR_T_DEFINED */
  93.  
  94. /* Define function type used in several startup sources */
  95.  
  96. typedef void (__cdecl *_PVFV)(void);
  97.  
  98.  
  99. #if defined (_DLL) && defined (_M_IX86)
  100. /* Retained for compatibility with VC++ 5.0 and earlier versions */
  101. _CRTIMP int * __p__commode(void);
  102. #endif  /* defined (_DLL) && defined (_M_IX86) */
  103. #if defined (SPECIAL_CRTEXE) && defined (_DLL)
  104.         extern int _commode;
  105. #else  /* defined (SPECIAL_CRTEXE) && defined (_DLL) */
  106. _CRTIMP extern int _commode;
  107. #endif  /* defined (SPECIAL_CRTEXE) && defined (_DLL) */
  108.  
  109.  
  110. #ifdef _WIN32
  111.  
  112. /*
  113.  * Control structure for lowio file handles
  114.  */
  115. typedef struct {
  116.         long osfhnd;    /* underlying OS file HANDLE */
  117.         char osfile;    /* attributes of file (e.g., open in text mode?) */
  118.         char pipech;    /* one char buffer for handles opened on pipes */
  119. #ifdef _MT
  120.         int lockinitflag;
  121.         CRITICAL_SECTION lock;
  122. #endif  /* _MT */
  123.     }   ioinfo;
  124.  
  125. /*
  126.  * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
  127.  * array of ioinfo structs.
  128.  */
  129. #define IOINFO_L2E          5
  130.  
  131. /*
  132.  * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
  133.  */
  134. #define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
  135.  
  136. /*
  137.  * Definition of IOINFO_ARRAYS, maximum number of supported ioinfo arrays.
  138.  */
  139. #define IOINFO_ARRAYS       64
  140.  
  141. #define _NHANDLE_           (IOINFO_ARRAYS * IOINFO_ARRAY_ELTS)
  142.  
  143. /*
  144.  * Access macros for getting at an ioinfo struct and its fields from a
  145.  * file handle
  146.  */
  147. #define _pioinfo(i) ( __pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - \
  148.                               1)) )
  149. #define _osfhnd(i)  ( _pioinfo(i)->osfhnd )
  150.  
  151. #define _osfile(i)  ( _pioinfo(i)->osfile )
  152.  
  153. #define _pipech(i)  ( _pioinfo(i)->pipech )
  154.  
  155. /*
  156.  * Safer versions of the above macros. Currently, only _osfile_safe is
  157.  * used.
  158.  */
  159. #define _pioinfo_safe(i)    ( ((i) != -1) ? _pioinfo(i) : &__badioinfo )
  160.  
  161. #define _osfhnd_safe(i)     ( _pioinfo_safe(i)->osfhnd )
  162.  
  163. #define _osfile_safe(i)     ( _pioinfo_safe(i)->osfile )
  164.  
  165. #define _pipech_safe(i)     ( _pioinfo_safe(i)->pipech )
  166.  
  167. /*
  168.  * Special, static ioinfo structure used only for more graceful handling
  169.  * of a C file handle value of -1 (results from common errors at the stdio
  170.  * level).
  171.  */
  172. extern _CRTIMP ioinfo __badioinfo;
  173.  
  174. /*
  175.  * Array of arrays of control structures for lowio files.
  176.  */
  177. extern _CRTIMP ioinfo * __pioinfo[];
  178.  
  179. /*
  180.  * Current number of allocated ioinfo structures (_NHANDLE_ is the upper
  181.  * limit).
  182.  */
  183. extern int _nhandle;
  184.  
  185. #else  /* _WIN32 */
  186.  
  187. /*
  188.  * Define the number of supported handles. This definition must exactly match
  189.  * the one in mtdll.h.
  190.  */
  191. #ifdef CRTDLL
  192. #define _NHANDLE_   512     /* *MUST* match the value under ifdef _DLL! */
  193. #else  /* CRTDLL */
  194. #ifdef _DLL
  195. #define _NHANDLE_   512
  196. #else  /* _DLL */
  197. #ifdef _MT
  198. #define _NHANDLE_   256
  199. #else  /* _MT */
  200. #define _NHANDLE_   64
  201. #endif  /* _MT */
  202. #endif  /* _DLL */
  203. #endif  /* CRTDLL */
  204.  
  205. extern int _nhandle;        /* == _NHANDLE_, set in ioinit.c */
  206.  
  207. extern char _osfile[];
  208.  
  209. extern  int _osfhnd[];
  210.  
  211. #ifdef _MAC
  212.  
  213. extern unsigned char _osperm[];
  214. extern short _osVRefNum[];
  215. extern int _nfile;                /*old -- check sources */
  216. extern unsigned int _tmpoff;      /*old -- check source */
  217.  
  218. extern unsigned char _osfileflags[];
  219. #define FTEMP           0x01
  220.  
  221. #endif  /* _MAC */
  222.  
  223. #endif  /* _WIN32 */
  224.  
  225. int __cdecl _alloc_osfhnd(void);
  226. int __cdecl _free_osfhnd(int);
  227. int __cdecl _set_osfhnd(int,long);
  228.  
  229.  
  230. extern const char __dnames[];
  231. extern const char __mnames[];
  232.  
  233. extern int _days[];
  234. extern int _lpdays[];
  235.  
  236. #ifndef _TIME_T_DEFINED
  237. typedef long time_t;        /* time value */
  238. #define _TIME_T_DEFINED     /* avoid multiple def's of time_t */
  239. #endif  /* _TIME_T_DEFINED */
  240.  
  241. #ifdef _MAC
  242. extern time_t __cdecl  _gmtotime_t (int, int, int, int, int, int);
  243. #endif  /* _MAC */
  244.  
  245. extern time_t __cdecl __loctotime_t(int, int, int, int, int, int, int);
  246.  
  247. #ifdef _TM_DEFINED
  248. extern int __cdecl _isindst(struct tm *);
  249. #endif  /* _TM_DEFINED */
  250.  
  251. extern void __cdecl __tzset(void);
  252.  
  253. extern int __cdecl _validdrive(unsigned);
  254.  
  255.  
  256. /*
  257.  * This variable is in the C start-up; the length must be kept synchronized
  258.  * It is used by the *cenvarg.c modules
  259.  */
  260.  
  261. extern char _acfinfo[]; /* "_C_FILE_INFO=" */
  262.  
  263. #define CFI_LENGTH  12  /* "_C_FILE_INFO" is 12 bytes long */
  264.  
  265.  
  266. /* typedefs needed for subsequent prototypes */
  267.  
  268. #ifndef _SIZE_T_DEFINED
  269. typedef unsigned int size_t;
  270. #define _SIZE_T_DEFINED
  271. #endif  /* _SIZE_T_DEFINED */
  272.  
  273. #ifndef _VA_LIST_DEFINED
  274. #ifdef _M_ALPHA
  275. typedef struct {
  276.         char *a0;   /* pointer to first homed integer argument */
  277.         int offset; /* byte offset of next parameter */
  278. } va_list;
  279. #else  /* _M_ALPHA */
  280. typedef char *  va_list;
  281. #endif  /* _M_ALPHA */
  282. #define _VA_LIST_DEFINED
  283. #endif  /* _VA_LIST_DEFINED */
  284.  
  285. /*
  286.  * stdio internals
  287.  */
  288. #ifndef _FILE_DEFINED
  289. struct _iobuf {
  290.         char *_ptr;
  291.         int   _cnt;
  292.         char *_base;
  293.         int   _flag;
  294.         int   _file;
  295.         int   _charbuf;
  296.         int   _bufsiz;
  297.         char *_tmpfname;
  298.         };
  299. typedef struct _iobuf FILE;
  300. #define _FILE_DEFINED
  301. #endif  /* _FILE_DEFINED */
  302.  
  303. #ifndef _MAC
  304.  
  305. #if !defined (_FILEX_DEFINED) && defined (_WINDOWS_)
  306.  
  307. /*
  308.  * Variation of FILE type used for the dynamically allocated portion of
  309.  * __piob[]. For single thread, _FILEX is the same as FILE. For multithread
  310.  * models, _FILEX has two fields: the FILE struct and the CRITICAL_SECTION
  311.  * struct used to serialize access to the FILE.
  312.  */
  313. #ifdef _MT
  314.  
  315. typedef struct {
  316.         FILE f;
  317.         CRITICAL_SECTION lock;
  318.         }   _FILEX;
  319.  
  320. #else  /* _MT */
  321.  
  322. typedef FILE    _FILEX;
  323.  
  324. #endif  /* _MT */
  325.  
  326. #define _FILEX_DEFINED
  327. #endif  /* !defined (_FILEX_DEFINED) && defined (_WINDOWS_) */
  328.  
  329. /*
  330.  * Number of entries supported in the array pointed to by __piob[]. That is,
  331.  * the number of stdio-level files which may be open simultaneously. This
  332.  * is normally set to _NSTREAM_ by the stdio initialization code.
  333.  */
  334. extern int _nstream;
  335.  
  336. /*
  337.  * Pointer to the array of pointers to FILE/_FILEX structures that are used
  338.  * to manage stdio-level files.
  339.  */
  340. extern void **__piob;
  341.  
  342. #endif  /* _MAC */
  343.  
  344. #ifdef _MAC
  345. extern FILE * _lastiob;
  346. #endif  /* _MAC */
  347.  
  348. FILE * __cdecl _getstream(void);
  349. FILE * __cdecl _openfile(const char *, const char *, int, FILE *);
  350. #ifdef _WIN32
  351. FILE * __cdecl _wopenfile(const wchar_t *, const wchar_t *, int, FILE *);
  352. #endif  /* _WIN32 */
  353. void __cdecl _getbuf(FILE *);
  354. int __cdecl _filwbuf (FILE *);
  355. int __cdecl _flswbuf(int, FILE *);
  356. void __cdecl _freebuf(FILE *);
  357. int __cdecl _stbuf(FILE *);
  358. void __cdecl _ftbuf(int, FILE *);
  359. int __cdecl _output(FILE *, const char *, va_list);
  360. #ifdef _WIN32
  361. int __cdecl _woutput(FILE *, const wchar_t *, va_list);
  362. #endif  /* _WIN32 */
  363. int __cdecl _input(FILE *, const unsigned char *, va_list);
  364. #ifdef _WIN32
  365. int __cdecl _winput(FILE *, const wchar_t *, va_list);
  366. #endif  /* _WIN32 */
  367. int __cdecl _flush(FILE *);
  368. void __cdecl _endstdio(void);
  369.  
  370. #ifdef _WIN32
  371. int __cdecl _fseeki64(FILE *, __int64, int);
  372. int __cdecl _fseeki64_lk(FILE *, __int64, int);
  373. __int64 __cdecl _ftelli64(FILE *);
  374. #ifdef _MT
  375. __int64 __cdecl _ftelli64_lk(FILE *);
  376. #else  /* _MT */
  377. #define _ftelli64_lk    _ftelli64
  378. #endif  /* _MT */
  379. #endif  /* _WIN32 */
  380.  
  381. #ifndef CRTDLL
  382. extern int _cflush;
  383. #endif  /* CRTDLL */
  384.  
  385. extern unsigned int _tempoff;
  386.  
  387. extern unsigned int _old_pfxlen;
  388.  
  389. extern int _umaskval;       /* the umask value */
  390.  
  391. extern char _pipech[];      /* pipe lookahead */
  392.  
  393. extern char _exitflag;      /* callable termination flag */
  394.  
  395. extern int _C_Termination_Done; /* termination done flag */
  396.  
  397. char * __cdecl _getpath(const char *, char *, unsigned);
  398. #ifdef _WIN32
  399. wchar_t * __cdecl _wgetpath(const wchar_t *, wchar_t *, unsigned);
  400. #endif  /* _WIN32 */
  401.  
  402. extern int _dowildcard;     /* flag to enable argv[] wildcard expansion */
  403.  
  404. #ifndef _PNH_DEFINED
  405. typedef int (__cdecl * _PNH)( size_t );
  406. #define _PNH_DEFINED
  407. #endif  /* _PNH_DEFINED */
  408.  
  409.  
  410. /* calls the currently installed new handler */
  411. int _callnewh(size_t);
  412.  
  413. extern int _newmode;    /* malloc new() handler mode */
  414.  
  415. #if defined (_DLL) && defined (_M_IX86)
  416. /* pointer to initial environment block that is passed to [w]main */
  417. #define __winitenv  (*__p___winitenv())
  418. _CRTIMP wchar_t *** __cdecl __p___winitenv(void);
  419. #define __initenv  (*__p___initenv())
  420. _CRTIMP char *** __cdecl __p___initenv(void);
  421. #endif  /* defined (_DLL) && defined (_M_IX86) */
  422.  
  423. /* pointer to initial environment block that is passed to [w]main */
  424. #ifdef _WIN32
  425. extern _CRTIMP wchar_t **__winitenv;
  426. #endif  /* _WIN32 */
  427. extern _CRTIMP char **__initenv;
  428.  
  429. /* startup set values */
  430. extern char *_aenvptr;      /* environment ptr */
  431. #ifdef _WIN32
  432. extern wchar_t *_wenvptr;   /* wide environment ptr */
  433. #endif  /* _WIN32 */
  434.  
  435. /* command line */
  436.  
  437. #if defined (_DLL) && defined (_M_IX86)
  438. /* Retained for compatibility with VC++ 5.0 and earlier versions */
  439. _CRTIMP char ** __cdecl __p__acmdln(void);
  440. _CRTIMP wchar_t ** __cdecl __p__wcmdln(void);
  441. #endif  /* defined (_DLL) && defined (_M_IX86) */
  442. _CRTIMP extern char *_acmdln;
  443. #ifdef _WIN32
  444. _CRTIMP extern wchar_t *_wcmdln;
  445. #endif  /* _WIN32 */
  446.  
  447.  
  448. /*
  449.  * prototypes for internal startup functions
  450.  */
  451. int __cdecl _cwild(void);           /* wild.c */
  452. #ifdef _WIN32
  453. int __cdecl _wcwild(void);          /* wwild.c */
  454. #endif  /* _WIN32 */
  455. #ifdef _MT
  456. int __cdecl _mtinit(void);          /* tidtable.asm */
  457. void __cdecl _mtterm(void);         /* tidtable.asm */
  458. void __cdecl _mtinitlocks(void);        /* mlock.asm */
  459. void __cdecl _mtdeletelocks(void);      /* mlock.asm */
  460. #endif  /* _MT */
  461.  
  462. /*
  463.  * C source build only!!!!
  464.  *
  465.  * more prototypes for internal startup functions
  466.  */
  467. void __cdecl _amsg_exit(int);           /* crt0.c */
  468. #ifdef _MAC
  469. int __cdecl __cinit(void);              /* crt0dat.c */
  470. #else  /* _MAC */
  471. void __cdecl _cinit(void);              /* crt0dat.c */
  472. #endif  /* _MAC */
  473. void __cdecl __doinits(void);           /* astart.asm */
  474. void __cdecl __doterms(void);           /* astart.asm */
  475. void __cdecl __dopreterms(void);        /* astart.asm */
  476. void __cdecl _FF_MSGBANNER(void);
  477. void __cdecl _fptrap(void);             /* crt0fp.c */
  478. #ifdef _MAC
  479. void __cdecl _heap_init(void);
  480. #else  /* _MAC */
  481. int __cdecl _heap_init(int);
  482. #endif  /* _MAC */
  483. void __cdecl _heap_term(void);
  484. void __cdecl _heap_abort(void);
  485. #ifdef _WIN32
  486. void __cdecl __initconin(void);         /* initcon.c */
  487. void __cdecl __initconout(void);        /* initcon.c */
  488. #endif  /* _WIN32 */
  489. void __cdecl _ioinit(void);             /* crt0.c, crtlib.c */
  490. void __cdecl _ioterm(void);             /* crt0.c, crtlib.c */
  491. char * __cdecl _GET_RTERRMSG(int);
  492. void __cdecl _NMSG_WRITE(int);
  493. void __cdecl _setargv(void);            /* setargv.c, stdargv.c */
  494. void __cdecl __setargv(void);           /* stdargv.c */
  495. #ifdef _WIN32
  496. void __cdecl _wsetargv(void);           /* wsetargv.c, wstdargv.c */
  497. void __cdecl __wsetargv(void);          /* wstdargv.c */
  498. #endif  /* _WIN32 */
  499. void __cdecl _setenvp(void);            /* stdenvp.c */
  500. #ifdef _WIN32
  501. void __cdecl _wsetenvp(void);           /* wstdenvp.c */
  502. #endif  /* _WIN32 */
  503. void __cdecl __setmbctable(unsigned int);   /* mbctype.c */
  504.  
  505. #ifdef _MAC
  506. void __cdecl _envinit(void);            /* intcon.c */
  507. int __cdecl __dupx(int, int);           /* dupx.c */
  508. #define SystemSevenOrLater  1
  509. #include <macos\types.h>
  510. void _ShellReturn(void);                /* astart.a */
  511. extern int _shellStack;                 /* astart.a */
  512. int __GestaltAvailable(void);           /* gestalt.c */
  513. int __TrapFromGestalt(OSType selector, long bitNum); /* gestalt.c */
  514. int SzPathNameFromDirID(long lDirID, char * szPath, int cbLen);
  515. void __cdecl _endlowio(void);           /* endlow.c */
  516. void __cdecl _initcon(void);            /* intcon.c */
  517. void __cdecl _inittime(void);           /* clock.c */
  518. void __cdecl _onexitinit (void);        /* onexit.c */
  519. #endif  /* _MAC */
  520.  
  521. #ifdef _MBCS
  522. void __cdecl __initmbctable(void);      /* mbctype.c */
  523. #endif  /* _MBCS */
  524.  
  525. int __cdecl main(int, char **, char **);
  526. #ifdef _WIN32
  527. int __cdecl wmain(int, wchar_t **, wchar_t **);
  528. #endif  /* _WIN32 */
  529.  
  530. #ifdef _WIN32
  531. /* helper functions for wide/multibyte environment conversion */
  532. int __cdecl __mbtow_environ (void);
  533. int __cdecl __wtomb_environ (void);
  534. int __cdecl __crtsetenv (const char *, const int);
  535. int __cdecl __crtwsetenv (const wchar_t *, const int);
  536. #endif  /* _WIN32 */
  537.  
  538. _CRTIMP extern void (__cdecl * _aexit_rtn)(int);
  539.  
  540. #if defined (_DLL) || defined (CRTDLL)
  541.  
  542. #ifndef _STARTUP_INFO_DEFINED
  543. typedef struct
  544. {
  545.         int newmode;
  546. } _startupinfo;
  547. #define _STARTUP_INFO_DEFINED
  548. #endif  /* _STARTUP_INFO_DEFINED */
  549.  
  550. _CRTIMP void __cdecl __getmainargs(int *, char ***, char ***, int, _startupinfo *);
  551.  
  552. #ifdef _WIN32
  553. _CRTIMP void __cdecl __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, _startupinfo *);
  554. #endif  /* _WIN32 */
  555.  
  556. #endif  /* defined (_DLL) || defined (CRTDLL) */
  557.  
  558. /*
  559.  * Prototype, variables and constants which determine how error messages are
  560.  * written out.
  561.  */
  562. #define _UNKNOWN_APP    0
  563. #define _CONSOLE_APP    1
  564. #define _GUI_APP        2
  565.  
  566. extern int __app_type;
  567.  
  568. extern int __error_mode;
  569.  
  570. _CRTIMP void __cdecl __set_app_type(int);
  571.  
  572. /*
  573.  * C source build only!!!!
  574.  *
  575.  * map Win32 errors into Xenix errno values -- for modules written in C
  576.  */
  577. #ifdef _WIN32
  578. extern void __cdecl _dosmaperr(unsigned long);
  579. #else  /* _WIN32 */
  580. extern void __cdecl _dosmaperr(short);
  581. #endif  /* _WIN32 */
  582.  
  583. /*
  584.  * internal routines used by the exec/spawn functions
  585.  */
  586.  
  587. extern int __cdecl _dospawn(int, const char *, char *, char *);
  588. #ifdef _WIN32
  589. extern int __cdecl _wdospawn(int, const wchar_t *, wchar_t *, wchar_t *);
  590. #endif  /* _WIN32 */
  591. extern int __cdecl _cenvarg(const char * const *, const char * const *,
  592.         char **, char **, const char *);
  593. #ifdef _WIN32
  594. extern int __cdecl _wcenvarg(const wchar_t * const *, const wchar_t * const *,
  595.         wchar_t **, wchar_t **, const wchar_t *);
  596. #endif  /* _WIN32 */
  597. #ifndef _M_IX86
  598. extern char ** _capture_argv(va_list *, const char *, char **, size_t);
  599. #ifdef _WIN32
  600. extern wchar_t ** _wcapture_argv(va_list *, const wchar_t *, wchar_t **, size_t);
  601. #endif  /* _WIN32 */
  602. #endif  /* _M_IX86 */
  603.  
  604. #ifdef __cplusplus
  605. }
  606. #endif  /* __cplusplus */
  607.  
  608. #endif  /* _INC_INTERNAL */
  609.