• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Metrowerks Standard Library
2  * Copyright � 1995-2002 Metrowerks Corporation.  All rights reserved.
3  *
4  * $Date$
5  * $Revision$
6  */
7 
8 #include <ansi_parms.h>
9 #include <size_t.h>
10 #include <console.h>
11 #include <unistd.h>
12 
13 #if __MACH__
InstallConsole(short fd)14   short InstallConsole(short fd)
15   {
16   #pragma unused (fd)
17 
18     return 0;
19   }
20 #else
21   #include <Carbon.h>
22 
23   typedef int (*ReadPtr)(int, void *, __std(size_t));
24   typedef int (*WritePtr)(int, const void *, __std(size_t));
25 
26   static struct
27   {
28     Boolean isLoaded;
29     CFBundleRef theBundle;
30     ReadPtr theRead;
31     WritePtr theWrite;
32   } __msl_os_x;
33 
__msl_CreateFrameworkBundleFromName(CFStringRef theFrameworkName,CFBundleRef * theBundle)34   static OSErr __msl_CreateFrameworkBundleFromName(CFStringRef theFrameworkName,
35     CFBundleRef *theBundle)
36   {
37     OSErr theErr;
38     FSRef theRef;
39     CFURLRef theFrameworkURL;
40     CFURLRef theBundleURL;
41 
42     /* Find the folder containing all the frameworks */
43     theErr = FSFindFolder(kOnAppropriateDisk, kFrameworksFolderType, false, &theRef);
44 
45     if (theErr == noErr)
46     {
47       /* Turn the framework folder FSRef into a CFURL */
48       theFrameworkURL = CFURLCreateFromFSRef(kCFAllocatorSystemDefault, &theRef);
49 
50       if (theFrameworkURL != NULL)
51       {
52         /* Create a CFURL pointing to the desired framework */
53         theBundleURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault,
54           theFrameworkURL, theFrameworkName, false);
55 
56         CFRelease(theFrameworkURL);
57 
58         if (theBundleURL != NULL)
59         {
60           /* Turn the CFURL into a bundle reference */
61           *theBundle = CFBundleCreate(kCFAllocatorSystemDefault, theBundleURL);
62 
63           CFRelease(theBundleURL);
64         }
65       }
66     }
67 
68     return theErr;
69   }
70 
InstallConsole(short fd)71   short InstallConsole(short fd)
72   {
73   #pragma unused (fd)
74     OSErr theErr;
75     short theResult;
76 
77     theResult = -1;
78 
79     /* Start with no bundle */
80     __msl_os_x.isLoaded = false;
81     __msl_os_x.theBundle = NULL;
82     __msl_os_x.theRead = NULL;
83     __msl_os_x.theWrite = NULL;
84 
85     /* Create a bundle reference based on its name */
86     theErr = __msl_CreateFrameworkBundleFromName(CFSTR("System.framework"),
87       &__msl_os_x.theBundle);
88 
89     if ((theErr == noErr) && (__msl_os_x.theBundle != NULL))
90     {
91       theResult = 0;
92 
93       __msl_os_x.isLoaded = CFBundleLoadExecutable(__msl_os_x.theBundle);
94 
95       if (__msl_os_x.isLoaded)
96       {
97         /* Lookup the functions in the bundle by name */
98         __msl_os_x.theRead = (ReadPtr)
99           CFBundleGetFunctionPointerForName(__msl_os_x.theBundle, CFSTR("read"));
100         __msl_os_x.theWrite = (WritePtr)
101           CFBundleGetFunctionPointerForName(__msl_os_x.theBundle, CFSTR("write"));
102       }
103     }
104 
105     return theResult;
106   }
107 #endif
108 
RemoveConsole(void)109 void RemoveConsole(void)
110 {
111 #if !__MACH__
112   if (__msl_os_x.theBundle != NULL)
113   {
114     if (__msl_os_x.isLoaded)
115     {
116       __msl_os_x.theRead = NULL;
117       __msl_os_x.theWrite = NULL;
118 
119       CFBundleUnloadExecutable(__msl_os_x.theBundle);
120       __msl_os_x.isLoaded = false;
121     }
122 
123     CFRelease(__msl_os_x.theBundle);
124     __msl_os_x.theBundle = NULL;
125   }
126 #endif
127 }
128 
WriteCharsToConsole(char * buffer,long n)129 long WriteCharsToConsole(char *buffer, long n)
130 {
131 #if __MACH__
132   return write(1, buffer, n);
133 #else
134   /* Call the function if it was found */
135   if (__msl_os_x.theWrite == NULL)
136     return -1;
137   else
138     return __msl_os_x.theWrite(1, buffer, n);
139 #endif
140 }
141 
142 #if __MACH__
WriteCharsToErrorConsole(char * buffer,long n)143 long WriteCharsToErrorConsole(char *buffer, long n)
144 {
145   return write(2, buffer, n);
146 }
147 #endif
148 
ReadCharsFromConsole(char * buffer,long n)149 long ReadCharsFromConsole(char *buffer, long n)
150 {
151 #if __MACH__
152   return read(0, buffer, n);
153 #else
154   /* Call the function if it was found */
155   if (__msl_os_x.theRead == NULL)
156     return -1;
157   else
158     return __msl_os_x.theRead(0, buffer, n);
159 #endif
160 }
161 
162 /* JWW - This code should never be reached, but it's needed for link purposes */
__ttyname(long fildes)163 char *__ttyname(long fildes)
164 {
165 #pragma unused (fildes)
166   /* all streams have the same name */
167   static char *__devicename = "Terminal";
168 
169   if (fildes >= 0 && fildes <= 2)
170     return (__devicename);
171 
172   return (0L);
173 }
174 
kbhit(void)175 int kbhit(void)
176 {
177   return 0;
178 }
179 
getch(void)180 int getch(void)
181 {
182   return 0;
183 }
184 
clrscr()185 void clrscr()
186 {
187   return;
188 }
189 
190 /* Change record:
191  * JWW 010919 Created Mach-O console stubs file
192  * JWW 020418 Use __std() for all size_t, and #include <size_t.h> to get proper C++ definitions
193  */