blob: 3597fca3d88f9307604715528dfe9779a93f3f73 [file] [log] [blame]
/* Metrowerks Standard Library
* Copyright © 1995-2002 Metrowerks Corporation. All rights reserved.
*
* $Date$
* $Revision$
*/
#include <ansi_parms.h>
#include <size_t.h>
#include <console.h>
#include <unistd.h>
#if __MACH__
short InstallConsole(short fd)
{
#pragma unused (fd)
return 0;
}
#else
#include <Carbon.h>
typedef int (*ReadPtr)(int, void *, __std(size_t));
typedef int (*WritePtr)(int, const void *, __std(size_t));
static struct
{
Boolean isLoaded;
CFBundleRef theBundle;
ReadPtr theRead;
WritePtr theWrite;
} __msl_os_x;
static OSErr __msl_CreateFrameworkBundleFromName(CFStringRef theFrameworkName,
CFBundleRef *theBundle)
{
OSErr theErr;
FSRef theRef;
CFURLRef theFrameworkURL;
CFURLRef theBundleURL;
/* Find the folder containing all the frameworks */
theErr = FSFindFolder(kOnAppropriateDisk, kFrameworksFolderType, false, &theRef);
if (theErr == noErr)
{
/* Turn the framework folder FSRef into a CFURL */
theFrameworkURL = CFURLCreateFromFSRef(kCFAllocatorSystemDefault, &theRef);
if (theFrameworkURL != NULL)
{
/* Create a CFURL pointing to the desired framework */
theBundleURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault,
theFrameworkURL, theFrameworkName, false);
CFRelease(theFrameworkURL);
if (theBundleURL != NULL)
{
/* Turn the CFURL into a bundle reference */
*theBundle = CFBundleCreate(kCFAllocatorSystemDefault, theBundleURL);
CFRelease(theBundleURL);
}
}
}
return theErr;
}
short InstallConsole(short fd)
{
#pragma unused (fd)
OSErr theErr;
short theResult;
theResult = -1;
/* Start with no bundle */
__msl_os_x.isLoaded = false;
__msl_os_x.theBundle = NULL;
__msl_os_x.theRead = NULL;
__msl_os_x.theWrite = NULL;
/* Create a bundle reference based on its name */
theErr = __msl_CreateFrameworkBundleFromName(CFSTR("System.framework"),
&__msl_os_x.theBundle);
if ((theErr == noErr) && (__msl_os_x.theBundle != NULL))
{
theResult = 0;
__msl_os_x.isLoaded = CFBundleLoadExecutable(__msl_os_x.theBundle);
if (__msl_os_x.isLoaded)
{
/* Lookup the functions in the bundle by name */
__msl_os_x.theRead = (ReadPtr)
CFBundleGetFunctionPointerForName(__msl_os_x.theBundle, CFSTR("read"));
__msl_os_x.theWrite = (WritePtr)
CFBundleGetFunctionPointerForName(__msl_os_x.theBundle, CFSTR("write"));
}
}
return theResult;
}
#endif
void RemoveConsole(void)
{
#if !__MACH__
if (__msl_os_x.theBundle != NULL)
{
if (__msl_os_x.isLoaded)
{
__msl_os_x.theRead = NULL;
__msl_os_x.theWrite = NULL;
CFBundleUnloadExecutable(__msl_os_x.theBundle);
__msl_os_x.isLoaded = false;
}
CFRelease(__msl_os_x.theBundle);
__msl_os_x.theBundle = NULL;
}
#endif
}
long WriteCharsToConsole(char *buffer, long n)
{
#if __MACH__
return write(1, buffer, n);
#else
/* Call the function if it was found */
if (__msl_os_x.theWrite == NULL)
return -1;
else
return __msl_os_x.theWrite(1, buffer, n);
#endif
}
#if __MACH__
long WriteCharsToErrorConsole(char *buffer, long n)
{
return write(2, buffer, n);
}
#endif
long ReadCharsFromConsole(char *buffer, long n)
{
#if __MACH__
return read(0, buffer, n);
#else
/* Call the function if it was found */
if (__msl_os_x.theRead == NULL)
return -1;
else
return __msl_os_x.theRead(0, buffer, n);
#endif
}
/* JWW - This code should never be reached, but it's needed for link purposes */
char *__ttyname(long fildes)
{
#pragma unused (fildes)
/* all streams have the same name */
static char *__devicename = "Terminal";
if (fildes >= 0 && fildes <= 2)
return (__devicename);
return (0L);
}
int kbhit(void)
{
return 0;
}
int getch(void)
{
return 0;
}
void clrscr()
{
return;
}
/* Change record:
* JWW 010919 Created Mach-O console stubs file
* JWW 020418 Use __std() for all size_t, and #include <size_t.h> to get proper C++ definitions
*/