3.6 Routines Q-T
qsort
extern void _pascal qsort(
void *array,
word count,
word elementSize,
PCB(int, compare, (const void *, const void *))); This is a standard quicksort routine. The callback routine must be decared _pascal.
QueueGetInfo()
word QueueGetInfo(
QueueHandle qh); /* queue to query */ This routine returns information about a specific event queue. Pass the handle of the queue; for information about the current process' queue, pass a null handle. This routine returns the number of events (or messages) currently in the queue.
Include: geode.h
QueueGetMessage()
EventHandle QueueGetMessage(
QueueHandle qh); /* queue to query */ This routine returns the next message on the given queue, blocking if the queue is empty. When a new message is added to the empty queue, this routine will unblock the thread and return the message. This routine is used almost exclusively by the kernel.
Include: geode.h
QueuePostMessage()
void QueuePostMessage(
QueueHandle qh, /* queue to add event to */
EventHandle event, /* event to be added to queue */
MessageFlags flags); /* MF_INSERT_AT_FRONT or zero */ This routine adds the specified *event* to the passed queue. The only valid flag for this routine is MF_INSERT_AT_FRONT, which will put the event in the first spot of the queue.
Include: geode.h
RangeEnum()
Boolean RangeEnum(
CellFunctionParameters * cfp, /* cell function parameters */
RangeEnumParams * params); /* special other parameters */ This routine calls a callback routine for each cell in a specified range. This routine is passed pointers to two structures, both of which are shown below. It returns *false* if all the cells were processed, *true* if any of the cells caused the routine to abort before the end of the range was reached.
Callback Parameters: The callback routine, which must be declared _pascal, receives a RangeEnumCallbackParams structure, which has the following definition:
typedef struct {
RangeEnumParams *RECP_params; /* see below */
/* current row, column, and cell data of cell */
word RECP_row;
word RECP_column;
word RECP_cellData;
} RangeEnumCallbackParams;
The callback routine can do anything with the cell information. It should return false after successfully processing the cell; if an error occurs, or if it wants to abort the RangeEnum(), it should return true.
Structures: The CellFunctionParameters structure has the following definition:
typedef struct {
CellFunctionParameterFlags CFP_flags;
/* can have the following flags:
* CFPF_DIRTY
* set parameter block dirty
* CFPF_NO_FREE_COUNT
* counts the number of calls to
* a non-special RangeEnum() */
VMFileHandle CFP_file;
/* VM file handle of cell file */
VMBlockHandle CFP_rowBlocks[N_ROW_BLOCKS];
/* array of handles to grouped row blocks */
} CellFunctionParameters;
Include: cell.h
RangeExists()
Boolean RangeExists( /* returns non-zero if there are cells in range */
CellFunctionParameters * cfp, /* see RangeEnum() */
word firstRow, /* range delimiters */
byte firstColumn,
word lastRow,
byte lastColumn); This routine returns *true* if there are any cells in the specified range. It is passed a pointer to the **CellFunctionParameters** structure for the cell file, as well as the indices of the first and last row, and the first and last column, of the range to check.
Include: cell.h
RangeInsert()
void RangeInsert(
CellFunctionParameters * cfp, /* see RangeEnum() */
RangeInsertParams * rep); /* parameters structure */ This routine shifts existing cells to make room for new ones. (It does not actually create new cells.) Which cells are shifted, and in what direction, is specified by the **RangeInsertParams()** structure. This structure has three fields:
RIP_bounds - A Rectangle structure which specifies which cells should be shifted. The cells currently in this range will be shifted across or down, depending on the value of RIP_delta; the shifted cells displace more cells, and so on, to the edge of the visible portion of the cell file. To insert an entire row (which is much faster than inserting a partial row), set RIP_bounds.R_left = 0 and RIP_bounds.R_right = LARGEST_COLUMN.
RIP_delta - A Point structure which specifies how far the cells should be shifted and in which direction. If the range of cells is to be shifted horizontally, RIP_delta.P_x should specify how far the cells should be shifted over, and RIP_delta.P_y should be zero. If the cells are to be shifted vertically, RIP_delta.P_y should specify how far the cells should be shifted down, and RIP_delta.P_x should be zero.
RIP_cfp - This is the address of the CellFunctionParameters structure. You don’t have to initialize this; the routine will do so automatically.
Include: cell.h
Warnings: If cells are shifted off the “visible” portion of the cell file, you will be unable to access them by row or column numbers; but they will not be deleted. For this reason, you should free all such cells before calling RangeInsert(). (You can find out if there are any cells at the edges by calling RangeExists().) For an explanation of the “visible” and “scratch-pad” portions of a cell file, see Section 19.4.1 of the Concepts book.
realloc()
void * realloc(
void * blockPtr, /* address of memory to resize */
size_t newSize); /* New size of memory in bytes */ The **malloc()** family of routines is provided for Standard C compatibility. If a geode needs a small amount of fixed memory, it can call one of the routines. The kernel will allocate a fixed block to satisfy the geode's **malloc()** requests; it will allocate memory from this block. When the block is filled, it will allocate another fixed malloc-block. When all the memory in the block is freed, the memory manager will automatically free the block.
If a geode needs to change the size of a section of memory assigned to it by the malloc() family of routines, it should use realloc(). realloc() resizes the piece of memory specified and returns the memory’s new base address.
If the new size is smaller then the previous size, bytes will be cut off from the end. The request is guaranteed to succeed. Furthermore, the memory will not be moved; the address returned will be the same as the address passed.
If the new size is larger than the previous size, realloc() may move the data to accommodate the request. If so, it will return the new address. The new memory added will not be zero-initialized. If realloc() cannot fulfill the request, it will return a null pointer, and the memory will not be altered.
Resizing a stretch of memory down to zero bytes is exactly the same as freeing it with free(). If you pass a null address to realloc(), it will allocate the memory the same way malloc() does.
The memory must be in a malloc-block assigned to the geode calling realloc(). If you want to resize memory in another geode’s malloc-block, call GeoReAlloc().
Warnings: Pass exactly the same address as the one returned to you when you allocated the memory. If you pass a different address, the results are undefined.
See Also: calloc(), free(), malloc(), GeoReAlloc()
SerialClose()
StreamError SerialClose(
GeodeHandle driver,
SerialUnit unit,
Boolean linger); Close the stream to a serial port.
SerialCloseWithoutReset()
StreamError SerialClose(
GeodeHandle driver,
SerialUnit unit,
Boolean linger); Close the stream to a serial port, without actually resetting the port.
SerialFlush()
StreamError SerialFlush(
GeodeHandle driver,
SerialUnit unit,
StreamRoles roles); Flush all data pending in a serial port's input or output buffer (depending on the value of *roles*).
SerialGetFormat()
StreamError SerialGetFormat(
GeodeHandle driver,
SerialUnit unit,
SerialFormat * format,
SerialMode * mode,
SerialBaud * baud); Get the format of a stream to a specified serial port.
SerialGetModem()
StreamError SerialGetModem(
GeodeHandle driver,
SerialUnit unit,
SerialModem * modem); Read a modem's hardware flow control bits.
SerialOpen()
StreamError SerialOpen(
GeodeHandle driver,
SerialUnit unit,
StreamOpenFlags flags,
word inBuffSize,
word outBuffSize,
word timeout); This routine opens a stream to the specified serial port. It is passed the following arguments:
driver - The GeodeToken of the serial driver.
unit - The serial port to open.
flags - This specifies whether the call should fail if the port is busy, or wait for a time to see if it will become free.
inBuffSize - The size of the stream buffer used for input from the serial port.
outBuffSize - The size of the stream buffer used for output to the serial port.
timeout - The number of clock ticks to wait for the port to become free. (This argument is ignored if flags is not STREAM_OPEN_TIMEOUT.)
If the routine is successful, it returns zero. If it is unsuccessful, it returns a member of the StreamError enumerated type.
SerialQuery()
StreamError SerialQuery(
GeodeHandle driver,
SerialUnit unit,
StreamRoles role,
word * bytesAvailable); Find out how much space is available in a serial buffer, or how much data is waiting to be read.
SerialRead()
StreamError SerialRead (
GeodeHandle driver,
SerialUnit unit,
StreamBlocker blocker,
word buffSize,
byte * buffer,
word * numBytesRead); Read data from a serial port and write it to a passed buffer.
SerialReadByte()
StreamError SerialReadByte (
GeodeHandle driver,
SerialUnit unit,
StreamBlocker blocker,
word buffSize,
byte * dataByte); Read a byte of data from a serial port and write it to a passed variable.
SerialSetFormat()
StreamError SerialSetFormat(
GeodeHandle driver,
SerialUnit unit,
SerialFormat format,
SerialMode mode,
SerialBaud baud); Set the format for a stream to a specified serial port.
SerialSetModem()
StreamError SerialSetModem(
GeodeHandle driver,
SerialUnit unit,
SerialModem modem); Set a modem's hardware flow control bits.
SerialWrite()
StreamError SerialWrite(
GeodeHandle driver,
SerialUnit unit,
StreamBlocker blocker,
word buffSize,
const byte * buffer,
word * numBytesWritten); Write data to a serial port.
SerialWriteByte()
StreamError SerialWrite(
GeodeHandle driver,
SerialUnit unit,
StreamBlocker blocker,
word buffSize,
byte dataByte); Write one byte of data to a serial port.
SGC_MACHINE
byte SGC_MACHINE(val);
dword val; This macro is used to extract the machine type from a **SysGetConfig()** return value.
Include: system.goh
SGC_PROCESSOR
byte SGC_PROCESSOR(val);
dword val; This macro is used to extract the processor type from a **SysGetConfig()** return value.
Include: system.goh
SoundAllocMusic()
MemHandle SoundAllocMusic(
const word *song,
word voices ); This routine takes a pointer to a fixed buffer of music and returns a **MemHandle** which may then be passed to **SoundPlayMusic()** to play the music. If the music buffer is in a movable resource, you must initialize it using **SoundInitMusic()** instead of **SoundAllocMusic()**. To find out how to set up one of these buffers of music, see "Sound Library," Chapter 13 of the Concepts book. The *voices* argument is the number of voices in the buffer.
SoundAllocMusicNote()
MemHandle SoundAllocMusicNote(
word _far instrument,
word frequency,
word volume,
word DeltaType,
word duration); This routine allocates a **MemHandle** which may be passed to **SoundPlayMusicNote()**. You must provide all information about the note: its frequency, volume, and duration. You may specify an instrument, passing a value corresponding to a standard *instrument* (such as IP_PIANO). Specify the frequency in Hertz or use one of the constants such as MIDDLE_C_b to specify a standard note frequency. Volume ranges from zero to 0xffff-you may wish to use a constant value such as DYNAMIC_FFF if you want help trying to choose a loudness. The note's duration is determined by its delta type, one of SSDTT_MSEC, SSDTT_TICKS, and SSDTT_TEMPO. If you pass SSDTT_MSEC or SSDTT_TICKS, the duration is measured in milliseconds or ticks (each tick is one sixtieth of a second). If you pass SSDTT_TEMPO, you may set the size of your time unit when you call **SoundPlayMusicNote()**. The *duration* determines how many time units the note should play. If the delta type is SSDTT_TICKS and *duration* is 30, then the note will sound for half a second.
SoundAllocMusicStream()
MemHandle SoundAllocMusicStream(
word streamType,
word priority,
word voices,
word tempo); This routine returns a token suitable for passing to **SoundPlayMusicToStream()**. It is passed several arguments. The **SoundStreamType** determines how much space to allocate for the stream and will determine how much data can be written to the stream at one time. If you pass SST_ONE_SHOT, it indicates that the stream will not be explicitly destroyed, and that your stream should destroy the stream when the song is done. You must specify how many voices there are in the music buffer. You must also pass a starting *tempo* for the music stream.
SoundAllocSampleStream()
MemHandle SoundAllocSampleStream(void); This routine allocates a sample stream handle. If the returned handle is *null*, the library was unavailable (i.e. some other thread has grabbed exclusive access).
SoundDisableSampleStream()
void SoundDisableSampleStream(
MemHandle mh); This routine disassociates the DAC player from the passed sample handle. Before you play more sounds using the handle, you will have to call **SoundEnableSampleStream()** again.
SoundEnableSampleStream()
Boolean SoundEnableSampleStream(
MemHandle mh,
word priority,
word rate,
word manufacturerID,
word format); This routine associates a DAC player with the allocated sample handle. You must pass the sound handle, as returned by **SoundAllocSampleStream()**. You must also pass certain pieces of information about the sound you will be playing on the DAC device: the *priority* with which to grab the DAC player (e.g. SP_STANDARD), the sampling rate, and the *format* of the sample (as identified by a *manufacturerID* and a **DACSampleFormat** value).
SoundFreeMusic()
void SoundFreeMusic(
MemHandle mh); This routine frees up a music handle. The music must not be playing; call **SoundStopMusic()** if you are not sure. You may not use the music handle after calling this routine on it.
SoundFreeMusicNote()
void SoundFreeMusicNote(
MemHandle mh); This routine frees up the passed note handle. The note must not be playing when you call this routine; call **SoundStopMusicNote()** if you are not sure. You should not try to use the note's handle after freeing it.
SoundFreeMusicStream()
void SoundFreeMusicStream(
MemHandle mh); This routine frees up the music stream's token. No music must be playing via the stream; call **SoundDisableMusicStream()** if you are not sure. Do not try to use the stream after calling this routine on it.
SoundFreeSampleStream()
void SoundFreeSampleStream(
MemHandle mh); This routine frees the passed sampled sound handle. You must not try to use this handle after calling this routine on it.
SoundGetExclusive()
void SoundGetExclusive(void); This routine grabs the exclusive semaphore for the sound library; if another thread has already grabbed the exclusive, this routine will wait until the exclusive is released. Sounds which are playing now will be permitted to finish, but from now on, only the thread calling this routine will be allowed to play new sounds. When done with the sound library exclusive, call **SoundReleaseExclusive()**.
SoundGetExclusiveNB()
Boolean SoundGetExclusiveNB(void); This routine grabs the exclusive semaphore for the sound library, doing so even if some other thread has already grabbed the exclusive. Sounds which are playing now will be permitted to finish, but from now on, only the thread calling this routine will be allowed to play new sounds. This routine will return *true* if another thread already has exclusive access.
When done with the sound library exclusive, call SoundReleaseExclusive().
SoundInitMusic()
void SoundInitMusic(
MemHandle mh,
byte voices); This routine initializes a pre-defined simple music buffer structure. If the music buffer is stored in a fixed block, you can call **SoundAllocMusic()** instead. This allows a music buffer stored in a block referenced by a pointer to be playable using **SoundPlayMusic()**.
SoundPlayMusic()
Boolean SoundPlayMusic(
MemHandle mh,
word priority,
word tempo,
char flags); This routine plays a buffer of music previously initialized by **SoundInitMusic()** or allocated by **SoundAllocMusic()**. The *priority* value will determine whether your sound will play if other sounds are already occupying the voices - pass a value such as SP_STANDARD. The *tempo* value will be used to determine the length of a 1/128th note. If your music buffer contained any notes whose lengths were measured by SSDTT_TEMPO delta type, then you should set this value accordingly. The *flags* argument determines whether the music's handle should be automatically freed when the sound is done playing. You may pass either or both of the flags UNLOCK_ON_EOS or DESTROY_ON_EOS.
Remember that you must have called SoundInitMusic() on the music handle before you may use it to play music.
Include: sound.h
SoundPlayMusicNote()
Boolean SoundPlayMusicNote(
MemHandle mh, /* handle of note */
word priority,
word tempo,
word flags); This routine plays a buffer of music previously allocated by **SoundAllocMusicNote()** - the return value of that function is passed as *mh*. The *priority* value will determine whether your sound will play if other sounds are already occupying the voices - pass a value such as SP_STANDARD. The *tempo* value will be used to determine the length of a 1/128th note. If your note's delta type is SSDTT_TEMPO, then you should set this value accordingly. The *flags* argument determines whether the notes's handle should be automatically freed when the note is done playing. You may pass either or both of the flags UNLOCK_ON_EOS or DESTROY_ON_EOS.
This routine returns true if the library was unavailable (i.e. if some other thread had grabbed the sound exclusive).
Include: sound.h
SoundPlayToMusicStream()
Boolean SoundPlayToMusicStream(
MemHandle mh,
const word * sample,
word size,
SampleFormatDescription *format); This routine plays a music buffer to a stream. Specify which stream to play to by means of the token returned by **SoundAllocMusicStream()**. To play music to the buffer, pass the size of the buffer you are playing and a pointer to the start of the piece. This piece of buffer must be made up of whole events - it should not start or end in the middle of an event (e.g. you can't specify that you want to play a note but not give its frequency, even if you plan to play another buffer to the stream that might begin with a frequency).
If you don’t know the size of the buffer, it may be all right - any data in the buffer after the GE_END_OF_SONG will be ignored.
SoundPlayToSampleStream()
Boolean SoundPlayToSampleStream(
MemHandle mh,
word _far * sample,
word size,
SampleFormatDescription * format); This routine passes sampled sound data to a DAC player. You must pass a sample sound handle to this routine - to acquire such a handle, call **SoundAllocSampleStream()**. The sample sound handle must be associated with a DAC player - to so associate the handle, call **SoundEnableSampleStream()**. You must pass a pointer to the *sample* data, along with the *size* of the sample as measured in bytes. You may change the *format* information which will determine how the DAC player handles the data.
SoundReallocMusic()
Boolean SoundReallocMusic(
MemHandle mh,
word _far * song); This routine allows you to associate a new music buffer with an existing music handle. The new music buffer must not have more voices than was originally requested with **SoundAllocMusic()**. Do not call this routine with the handle of a sound that may be playing; call **SoundStopMusic()** on the handle if you are not sure. See "Sound Library," Chapter 13 of the Concepts book to find out how to set up the buffer of music.
SoundReallocMusicNote()
Boolean SoundReallocMusicNote(
MemHandle mh,
word freq,
word vol,
word timer,
word durat,
word _far * instrum); This routine allows you to associate new note values with an existing note handle. Do not call this routine with the handle of a note that may be playing; call **SoundStopMusicNote()** on the handle if you are not sure.
SoundReleaseExclusive()
void SoundReleaseExclusive(void); This routine releases the sound library exclusive semaphore. You will not need to call this routine unless your code calls **SoundGrabExclusive()** or **SoundGrabExclusiveNB()**. This routine allows other threads to play sounds. If another thread called **SoundGrabExclusive()** while your thread had the exclusive, it will now grab the exclusive.
SoundStopMusic()
Boolean SoundStopMusic(
MemHandle mh); /* Handle of music buffer */ This routine stops the playing of a simple music buffer. It returns *true* if the library was unavailable (i.e. some other thread has grabbed the exclusive).
SoundStopMusicNote()
Boolean SoundStopMusicNote(
MemHandle mh); This routine stops a note that is playing. Pass the handle of the note, as was returned by **SoundAllocMusicNote()**. This routine returns true if the sound library was unavailable (i.e. some other thread has grabbed the exclusive).
SoundStopMusicStream()
Boolean SoundStopMusicStream(
MemHandle mh); This routine stops any music being played to the stream. All sounds are flushed from the stream. It takes one argument, the token of the sound stream, as returned by **SoundAllocMusicStream()**.
SoundStopSampleStream()
void SoundStopSampleStream(
MemHandle mh); This routine stops a sound playing through a previously allocated sampled sound stream.
SpoolConvertPaperSize()
word SpoolConvertPaperSize(
int width, /* width of paper */
int height, /* height of paper */
PageType pt); /* type of page */ This routine converts a width and height into a page size number.
Include: spool.goh
SpoolCreatePaperSize()
Boolean SpoolCreatePaperSize( /* Returns true if failed */
word * retValue, /* returns paper size value */
char * name, /* name of paper size */
int width, /* width of paper */
int length, /* length of paper */
PageLayout layout); /* default page layout / This routine defines and stores a new paper size for later use by the user.
Include: spool.goh
SpoolCreatePrinter()
Boolean SpoolCreatePrinter( /* Returns true if error
(printer already exists) */
char *name, /* name of printer */
PrinterDriverType type, /* driver type */
int * retVal); /* Will hold printer number */ Adds the printer to the list of currently installed printers and returns the new printer number. This routine is normally called from within the Preferences manager. Returns *true* if the printer already exists.
Include: spool.goh
SpoolDeletePaperSize()
Boolean SpoolDeletePaperSize(
word size); /* size number to delete */ This routine deletes a user-defined paper size.
Include: spool.goh
SpoolDeletePrinter()
void SpoolDeletePrinter(
int prtrNum); /* printer number to delete */ Deletes the requested printer from the system.
Include: spool.goh
SpoolGetDefaultPrinter()
int SpoolGetDefaultPrinter(); /* Returns printer number */ Returns the system-default printer, which is used (for example) by the **PrintControlClass** as the default printer to print to.
Include: spool.goh
SpoolGetNumPaperSizes()
int SpoolGetNumPaperSizes(
PageType type); /* type of page */ Use this routine to find the number of paper sizes, both pre-defined and user-defined, that should appear in a paper size list.
Include: spool.goh
SpoolGetNumPrinters()
int SpoolGetNumPrinters(
PrinterDriverType type); /* driver type */ This routine returns the number of installed printers with the given type.
Structures:
typedef ByteEnum PrinterDriverType;
/* The driver type may be one of the following:
PDT_PRINTER,
PDT_PLOTTER,
PDT_FACSIMILE,
PDT_CAMERA,
PDT_OTHER,
PDT_ALL */
Include: spool.goh
SpoolGetPaperSize()
XYSizeAsDWord SpoolGetPaperSize(
int size, /* This must be between 0 and the return
* value of SpoolGetNumPaperSizes() */
PageType pt, /* type of page */
PageLayout *layout); /* Will hold returned page layout */ Use this routine to determine the dimensions of a paper size.
Include: spool.goh
SpoolGetPaperSizeOrder()
dword SpoolGetPaperSizeOrder( /* High byte is number of unused sizes;
* Low byte is # of ordered sizes */
PageType type,
byte *order, /* buffer of size MAX_PAPER_SIZES */
/* On return, this buffer will be
* filled with the page size numbers
* arranged in the order
* corresponding to their display */
byte *userSizes); /* buffer of size MAX_PAPER_SIZES */
/* On return, will hold ordered
* array of user paper sizes. */
SpoolGetPaperSizeString()
Boolean SpoolGetPaperSizeString( /* true if error*/
char * retValue, /* buffer for returned value */
int size, /* Must be between 0 and the return
* value of SpoolGetNumPaperSizes() */
PageType pt); /* type of page */ Use this routine to determine the string to be displayed for a specific paper size. Upon return, *retValue* will point to a character string and the Boolean return value will be *false* if successful. If any error occurs, or if the page type couldn't be found, the returned value will be *true*.
Include: spool.goh
SpoolGetPrinterString()
Boolean SpoolGetPrinterString( /* Returns true if error */
int *retValue, /* On return, will point to length of string */
char *string, /* returned name string */
int prtrNum); /* printer number */ This routine fills a buffer with the requested null-terminated printer name string. If the printer could not be found, the return value will be *true* (set for error).
Include: spool.goh
SpoolSetDefaultPrinter()
void SpoolSetDefaultPrinter(
int prtrNum); /* printer number */ Sets the system-default printer, used (for example) by **PrintControlClass** as the default printer. This routine is normally called from within the Preferences manager.
Include: spool.goh
SpoolSetDocSize()
void SpoolSetDocSize(
Boolean open; /* false if document is closed */
PageSizeInfo * psr); /* NULL if document is closed */ This routine tells the application's **PageSizeControl** object the document's size.
Include: spool.goh
SpoolSetPaperSizeOrder()
void SpoolSetPaperSizeOrder(
void * ptr, /* Array of PageSizeOrder entries */
word number); /* number of entries in array */ This routine resets the order in which paper sizes are displayed to the user.
Include: spool.goh
SpreadsheetInitFile()
VMBlockHandle SpreadsheetInitFile(
const SpreadsheetInitFileData * ifd); This routine initializes a VM file for use by the spreadsheet object. It allocates a spreadsheet map block in the file and initializes this block. The routine returns the map block's handle; applications will need to remember this handle. It does not change any existing blocks in the VM file.
The ifd parameter is pointer to a SpreadsheetInitFileData structure containing the file handle and the number of rows and columns to allocate.
Structures: The SpreadsheetInitFileData structure is defined as follows:
typedef struct {
word SIFD_file;
word SIFD_numRows;
word SIFD_numCols;
SpreadsheetDrawFlags SIFD_drawFlags;
} SpreadsheetInitFileData;
/* SpreadsheetDrawFlags:
* SDF_DRAW_GRAPHICS
* SDF_DRAW_NOTE_BUTTON
* SDF_DRAW_HEADER_FOOTER_BUTTON
* SDF_DRAW_GRID */
Include: ssheet.goh
StreamClose()
StreamError StreamClose (
GeodeHandle driver,
StreamToken stream,
Boolean linger); This routine shuts down a stream. It is passed the following arguments:
driver - The GeodeToken of the stream driver.
stream - The StreamToken of the stream.
linger - Set true (i.e., non-zero) if the data currently in the stream should be kept until it’s read; set false to flush the data immediately.
If the routine is successful, it returns zero. If it is unsuccessful, it returns a member of the StreamError enumerated type.
StreamFlush()
StreamError StreamFlush (
GeodeHandle driver,
StreamToken stream); This routine flushes all the data pending in a stream. It is passed the following arguments:
driver - The GeodeToken of the stream driver.
stream - The StreamToken of the stream.
If the routine is successful, it returns zero. If it is unsuccessful, it returns a member of the StreamError enumerated type.
StreamOpen()
StreamError StreamOpen (
GeodeHandle driver,
word buffSize,
GeodeHandle owner,
HeapFlags heapFlags,
StreamToken * stream); This routine opens a stream. It is passed the following:
driver - The GeodeToken of the stream driver.
buffSize - The size of the stream buffer, in bytes.
owner - The geode which will own the stream.
heapFlags - The flags for the creation of the buffer block.
*stream - The stream token will be written here.
If StreamOpen() is successful, it returns zero and writes the stream’s token to stream*. If it is unsuccessful, it returns a member of the **StreamError enumerated type.
StreamQuery()
StreamError StreamQuery (
GeodeHandle driver,
StreamToken stream,
StreamRoles role,
word * bytesAvailable); This routine finds out either how much free space is available in a stream's buffer, or how much data is waiting to be read. It is passed the following arguments:
driver - The GeodeToken of the stream driver.
stream - The StreamToken of the stream.
role - If this is STREAM_ROLES_WRITER, the routine will return the amount of free space available in the stream buffer. If it is STREAM_ROLES_READER, it will return the amount of data waiting to be read.
*bytesAvailable - The routine will write the number of bytes available (for writing or reading) to this variable.
If the routine is successful, it returns zero. If it is unsuccessful, it returns a member of the StreamError enumerated type.
StreamRead()
StreamError StreamRead (
GeodeHandle driver,
StreamToken stream,
StreamBlocker blocker,
word buffSize,
byte * buffer,
word * numBytesRead); This routine reads data from a stream. The routine takes the following arguments:
driver - The GeodeToken of the stream driver.
stream - The StreamToken of the stream.
blocker - Specify whether to block if there is not enough data waiting to be read.
buffsize - Size of passed buffer (i.e. amount of data to read from stream).
buffer - Pointer to buffer where data from stream will be written.
numBytesReadRead* - **StreamRead() will write to this variable the number of bytes actually read from the stream.
If StreamRead() is successful, it returns zero. If it is unsuccessful, or could not read all the data requested from the stream, it returns a member of the StreamError enumerated type.
StreamReadByte()
StreamError StreamWriteByte (
GeodeHandle driver,
StreamToken stream,
StreamBlocker blocker,
byte * dataByte); This routine reads a single byte from a stream. It takes the following arguments:
driver - The GeodeToken of the stream driver.
stream - The StreamToken of the stream.
blocker - Specify whether to block if there is not enough room to write the data.
*dataByte - Read a byte from the stream, and write it to this variable.
If the routine is successful, it returns zero. If it is unsuccessful, it returns a member of the StreamError enumerated type.
StreamWrite()
StreamError StreamWrite (
GeodeHandle driver,
StreamToken stream,
StreamBlocker blocker,
word buffSize,
const byte * buffer,
word * numBytesWritten); This routine writes data to a stream. The routine takes the following arguments:
driver - The GeodeToken of the stream driver.
stream - The StreamToken of the stream.
blocker - Specify whether to block if there is not enough room to write all the data.
buffsize - Size of passed data buffer (i.e. amount of data to write to stream).
buffer - Pointer to data to write to stream.
*numBytesWritten - StreamWrite() will write to this variable the number of bytes actually written to the stream.
If StreamWrite() is successful, it returns zero. If it is unsuccessful, or could not write all the data to the stream, it returns a member of the StreamError enumerated type.
StreamWriteByte()
StreamError StreamWriteByte (
GeodeHandle driver,
StreamToken stream,
StreamBlocker blocker,
byte dataByte); This routine writes a single byte to a stream. It takes the following arguments:
driver - The GeodeToken of the stream driver.
stream - The StreamToken of the stream.
blocker - Specify whether to block if there is not enough room to write the data.
dataByte - Write this byte to the stream.
If the routine is successful, it returns zero. If it is unsuccessful, it returns a member of the StreamError enumerated type.
SysGetConfig()
dword SysGetConfig(); This routine returns a set of values defining the system configuration. The returned dword contains four byte values, listed below from least significant byte to most significant byte:
configuration flags
This byte contains a record of SysConfigFlags reflecting the system status. This record includes information on how the system was started, whether Swat is running it, whether the system was restarted, etc.
reserved byte
This byte contains reserved information unusable by applications.
processor type
This byte contains a value reflecting the processor type of the machine running GEOS. This is of type SysProcessorType and is one of SPT_8088, SPT_8086, SPT_80186, SPT_80286, SPT_80386, or SPT_80486. Use the macro SGC_PROCESSOR to extract this value from the returned dword.
machine type
This byte contains a value of SysMachineType indicating the type of the machine running GEOS. It may be one of the following values: SMT_UNKNOWN, SMT_PC, SMT_PC_CONV, SMT_PC_JR, SMT_PC_XT, SMT_PC_XT_286, SMT_PC_AT, SMT_PS2_30, SMT_PS2_50, SMT_PS2_60, SMT_PS2_80, or SMT_PS1. Use the macro SGC_MACHINE to extract this value from the returned dword.
Include: system.h
SysGetDosEnvironment()
Boolean SysGetDosEnvironment( /* true if error (not found) */
const char * variable, /* environment variable */
char * buffer, /* buffer for return value */
word bufSize); /* maximum return string length */ This routine looks up a specified DOS environment variable in the environment buffer. It takes three parameters:
variable - A pointer to the null-terminated character string representing the name of the variable to be searched for.
buffer - A pointer to a locked or fixed buffer in which the variable’s value will be returned.
bufSize - The size of the passed buffer in bytes (the maximum number of characters that can be returned including the terminating null character).
If the variable is not found, the error flag returned will be true.
Include: system.h
SysGetECLevel()
ErrorCheckingFlags SysGetECLevel(
MemHandle * checksumBlock); This routine checks the current error-checking level of the system. The returned record of **ErrorCheckingFlags** describes which levels of error checking are turned on and which are off. If checksum error checking (ECF_BLOCK_CHECKSUM) is on, pass a pointer to the handle of a block on which the checksum will be done.
Include: ec.h
SysGetInfo()
dword SysGetInfo(
SysGetInfoType info); /* type of information to retrieve */ This routine returns general system information. Pass the type of information to be returned; the value returned depends on the type passed in info. Note that the largest returned value is a dword; many different return values should be cast to the appropriate type when calling **SysGetInfo()**.
The info parameter (of SysGetInfoType) can have one of the following values:
SGIT_TOTAL_HANDLES
Returns the total number of handles in the kernel’s handle table.
SGIT_HEAP_SIZE
Returns the total heap size in bytes.
SGIT_LARGEST_FREE_BLOCK
Returns the size (in bytes) of the largest possible block that may be allocated at the moment.
SGIT_TOTAL_COUNT
Returns the total number of clock ticks since the current session of GEOS started (subtracts the initial system clock value from the current time).
SGIT_NUMBER_OF_VOLUMES
Returns the total number of volumes registered with the system.
SGIT_TOTAL_GEODES
Returns the total number of geodes currently loaded.
SGIT_NUMBER_OF_PROCESSES
Returns the total number of processes currently loaded.
SGIT_NUMBER_OF_LIBRARIES
Returns the total number of libraries currently loaded.
SGIT_NUMBER_OF_DRIVERS
Returns the total number of drivers currently loaded.
SGIT_CPU_SPEED
Returns the CPU speed of the processor. The value returned will be ten times the ratio of the CPU speed relative to a base XT processor.
SGIT_SYSTEM_DISK
Returns the disk handle of the disk on which GEOS (the GEOS.INI file) resides.
SGIT_UI_PROCESS
Include: sysstats.h
SysGetPenMode()
Boolean SysGetPenMode(); This routine returns true if GEOS is running on a pen-based system, false if it is not.
Include: system.h
SysLocateFileInDosPath()
DiskHandle SysLocateFileInDosPath( /* sets thread's error value */
const char * fname, /* file name */
char * buffer); /* returned path of file */ This routine searches for a specified file along the search path specified in the DOS environment variable PATH. The parameters are
fname - A pointer to the null-terminated file name to search for.
buffer - A pointer to a locked or fixed buffer into which the full path of the file will be placed.
This routine returns the disk handle of the disk on which the file resides as well as the file’s full path (with drive name) in the buffer pointed to by buffer. The path returned is a null-terminated character string. If the file could not be found, a null disk handle will be returned. The error value can be retrieved with ThreadGetError().
Include: system.h
SysNotify()
word SysNotify(
SysNotifyFlags flags, /* options to offer user */
const char * string1, /* first string to display */
const char * string2); /* second string to display */ This routine causes the kernel to put up a standard notification dialog box on the screen. This dialog box is white with a black border and is used nearly exclusively for error notification by the kernel. Pass this routine the following parameters:
flags - A record of SysNotifyFlags indicating the options the dialog presents to the user. These flags are shown below.
string1 - A pointer to a null-terminated character string put up in the dialog box (may be a null pointer).
string2 - A pointer to a second null-terminated string presented in the dialog box (may be a null pointer).
The returned word is the user’s response, based on the SysNotifyFlags passed (see below).
Structures: SysNotifyFlags is a record of several flags; none, any, or all of the flags may be set at a time. The five flags are
SNF_RETRY
Allow the user to retry the operation that brought up the notification box. If the user selects this option, it will be returned by the routine.
SNF_EXIT
Allow the user to exit GEOS entirely. If the user selects this option, it will be returned by the routine after an SST_CLEAN_FORCED shutdown has been initiated.
SNF_ABORT
Allow the user to abort the operation that brought up the notification box. If the user selects this option, it will be returned by the routine.
SNF_CONTINUE
Allow the user to continue the operation. If the user selects this option, it will be returned by the routine.
SNF_REBOOT
Allow the user to shut down and reboot GEOS directly. If the user selects this option, the routine will not return.
Include: system.h
SysRegisterScreen()
void SysRegisterScreen(
GeodeHandle driver,
WindowHandle root);
SysSetECLevel()
void SysSetECLevel(
ErrorCheckingFlags flags, /* level of error checking */
MemHandle checksumBlock); /* block to check, if any */ This routine sets the error-checking level of the software. Pass it a record of **ErrorCheckingFlags** indicating which levels of error checking should be employed. If checksum checking (ECF_BLOCK_CHECKSUM) is turned on, also pass the handle of a block on which the checksum will be performed.
Include: ec.h
SysSetExitFlags()
word SysGetExitFlags(
ExitFlags bitsToSet,
ExitFlags bitsToClear);
SysShutdown()
Boolean SysShutdown(
SysShutdownType type,
...);
This routine causes the system to shut down, exiting to the native operating system (typically DOS). It takes variable parameters depending on the first parameter. The first parameter is the type of shutdown requested, and it determines the calling format of the routine. SysShutdown() returns a Boolean value dependent on the type of shutdown.
The parameters and calling format for this routine depend on the value in the type parameter. The possible values (SysShutdownType) are listed below with the associated parameter and return information.
SST_CLEAN
Shut down all applications cleanly, allowing any that wish to to abort the shutdown. The routine will return true if a system shutdown is already in progress at the time of the call. This type of shutdown will send MSG_META_CONFIRM_SHUTDOWN to all objects registered on the MANUFACTURER_ID_GEOWORKS:GCNSLT_SHUTDOWN_CONTROL GCN list (but only if the shutdown is not cancelled). Each object on that list must return an acknowledgment of the shutdown. The parameter format and parameters are
Boolean SysShutdown(
SysShutdownType type,
optr notificationOD,
Message msg);
notificationOD - The optr of an object which will receive the message passed in msg after the shutdown has been acknowledged. Pass a null optr to use the default notification (MSG_META_DETACH sent to the UI).
msg - The message to be sent to the object in notificationOD.
SST_CLEAN_FORCED
Shut down all applications cleanly without the possibility of cancellation. This type takes no additional parameters and does not allow other geodes to abort the shutdown. It will return, but the return value will be meaningless.
SST_DIRTY
Attempt to exit device drivers and close all files without shutting down applications. Does not return. The parameters of this type are
Boolean SysShutdown{
SysShutdownType type, /* SST_DIRTY */
const char * reason);
The reason parameter is a pointer to a text string presented to the user as a reason for the dirty shutdown. The string is null-terminated. Pass -1 if no reason is to be given.
SST_PANIC
Exit system device drivers (GA_SYSTEM) without exiting applications or closing files. This can be bad for the system and should be used only in emergency situations. This type of shutdown takes no additional parameters and does not return.
SST_REBOOT
This is used by GEOS when the user hits Ctrl-Alt-Del. Applications should not call it.
SST_RESTART
This is like SST_CLEAN_FORCED above, but it reloads GEOS after shutting down rather than exit completely. It takes no additional parameters; it will return TRUE if the system could not be restarted, FALSE if the shutdown has been initiated.
SST_FINAL
Perform the final phase of a shutdown. This routine is called only by the UI when the SST_CLEAN_FORCED shutdown is complete. This type does not return, and it takes one additional parameter. The calling format and parameters of this type are
Boolean SysShutdown(
SysShutdownType type,
const char * reason);
The reason parameter is a character string explaining the reason (typically an error) for the final shutdown.
SST_SUSPEND
Suspend system operation in preparation for task switching, and broadcast MSG_META_CONFIRM_SHUTDOWN to all objects on the MANUFACTURER_ID_GEOWORKS:GCNSLT_SHUTDOWN_CONTROL GCN list (see MetaClass). All notified objects must return acknowledgment of the shutdown. This type of SysShutdown() returns true if another system shutdown is already in progress. It takes two additional parameters:
Boolean SysShutdown(
SysShutdownType type,
optr notificationOD,
Message msg);
notificationOD - The optr of an object which will receive the message passed in msg after the shutdown has been acknowledged. Pass a null optr to use the default notification (MSG_META_DETACH sent to the UI), though this is not usually the intent of the call.
msg - The message to be sent to the object in notificationOD.
SST_CONFIRM_START
Called by the recipient of MSG_META_CONFIRM_SHUTDOWN; this allows shutdown confirmation dialog boxes to be presented in order to the user. The caller of this type will be blocked until all previous callers have finished their confirmation procedure. When SysShutdown() returns, the caller may present its confirmation dialog and continue or abort the shutdown. If SysShutdown() returns true from a call with this type, the caller should not present the confirmation dialog to the user and need not call SysShutdown() with SST_CONFIRM_END; another thread has already cancelled the shutdown. This type takes no additional parameters.
SST_CONFIRM_END
The counterpart of SST_CONFIRM_START, this ends the confirmation sequence in an object’s MSG_META_CONFIRM_SHUTDOWN handler. It takes one additional parameter and returns nothing. The calling format is shown below:
void SysShutdown(
SysShutdownType type,
Boolean confirm);
The confirm parameter should be TRUE if the shutdown is to be continued, FALSE if the shutdown should be aborted.
Include: system.h
Warnings: Most applications should not call SysShutdown(). Any that do should do so with extreme care.
SysStatistics()
void SysStatistics(
SysStats * stats); /* returned statistics */ This routine returns system performance statistics. Pass it a pointer to an empty **SysStats** structure; the routine will fill in the appropriate fields. **SysStats** has the following structure:
typedef struct {
dword SS_idleCount;
SysSwapInfo SS_swapOuts;
SysSwapInfo SS_swapIns;
word SS_contextSwitches;
word SS_interrupts;
word SS_runQueue;
} SysStats;
Include: sysstats.h
SysUnlockBIOS()
void SysUnlockBIOS(void);
TextSearchInString()
char * TextSearchInSTring(
const char *str1,
conat char *startPtr,
const char *endPtr,
word strSize,
const char *str2,
word str2Size,
word searchOptions,
word *matchLen); TextSearchInString() searches in a single text chunk for a passed text string. If a match is found, a pointer to that match (and the length of the match) are returned in passed buffers.
str1 is a pointer to the main string you will be searching in.
startPtr and endPtr are pointers to locations within str1 to begin and end the search.
strSize stores the size of str1, or zero if null-terminated.
str2 stores the match string, which may include wildcards (type WildCard).
str2Size stores the size of str2, or zero if null-terminated.
searchOptions stores the SearchOptions to use by the search mechanism. The high byte should be zeroed.
matchLen stores a buffer to store the size of the matched word. (The matched word itself is returned by the routine.)
Include: Objects/vTextC.goh
TextSearchInHugeArray()
dword TextSearchInSTring(
char *str2,
word str2Size,
dword str1Size,
dword curOffset,
dword endOffset,
FileHandle hugeArrayFile,
VMBlockHandle hugeArrayBlock,
word searchOptions,
word *matchLen); TextSearchInHugeArray() searches in a huge array for a passed text string. If a match is found, a dword offset to the match (and the length of the match) are returned in passed buffers.
str2 stores the match string, which may include wildcards (type WildCard).
str2Size stores the size of str2, or zero if null-terminated.
str1Size stores the total length of the string being searched.
curOffset stores the offset from the start of str1 to the first character to check.
endOffset stores the offset from the start of str1 to the last character to check.
hugeArrayFile stores the file handle of the huge array.
hugeArrayBlock stores the VM block handle of the huge array.
searchOptions stores the SearchOptions to use by the search mechanism. The high byte should be zeroed.
matchLen stores a buffer to store the size of the matched word. (The matched word itself is returned by the routine.)
Include: Objects/vTextC.goh
TGI_PRIORITY()
byte TGI_PRIORITY(val);
word val; This macro extracts the thread priority from the value returned by **ThreadGetInfo()**.
TGI_RECENT_CPU_USAGE()
byte TGI_RECENT_CPU_USAGE(val);
word val; This macro extracts the recent CPU usage from the value returned by **ThreadGetInfo()**.
ThreadAllocSem()
SemaphoreHandle ThreadAllocSem(
word value); /* allowable locks on the semaphore */ This routine allocates and initializes a new semaphore for private use by a multithreaded application. Pass the value with which to initialize the semaphore; this value represents the number of threads that can grab the semaphore before other grab attempts will block. Typically, the passed value will be one. The routine returns the handle of the new semaphore.
Include: sem.h
ThreadAllocThreadLock()
ThreadLockHandle ThreadAllocThreadLock(); This routine allocates a special semaphore called a thread lock. With a normal semaphore, a thread that grabs the semaphore twice without releasing it will deadlock; with a thread lock, a thread can grab it more than once in succession. The thread has to release it once for each time it grabs the thread lock, however.
In all other aspects, however, the thread lock resembles a normal semaphore. ThreadAllocThreadLock() returns the handle of the new thread lock.
Include: sem.h
ThreadAttachToQueue()
void ThreadAttachToQueue(
QueueHandle qh, /* queue to attach */
ClassStruct * class); /* primary class of thread */ This routine attaches the calling thread to the passed event queue. This is used only for event-driven threads. Typically, this routine is called when a thread is created; attaching to queues is automatic in nearly all cases, and you will rarely need this routine.
Pass the handle of the queue in qh and a class pointer in class. The class will be attached to the event queue and will handle all messages sent directly to the thread. This class should nearly always be a subclass of ProcessClass.
If a queue handle of zero is passed, the thread wants to “reattach” to the current queue. This is used typically during shutdown of event-driven threads, and it is nearly always taken care of automatically by ProcessClass.
Include: thread.h
ThreadCreate()
ThreadHandle ThreadCreate(
word priority, /* Initial base priority of new thread */
word valueToPass, /* Optional data to pass to new thread */
word (*startRoutine)(word valuePassed),
/* Pointer to entry routine */
word stackSize, /* Size of the stack for the new thread */
GeodeHandle owner); /* Geode that will own the new thread */ This routine creates a new procedural thread for a process. If you need a new event-driven thread, send MSG_PROCESS_CREATE_EVENT_THREAD to your process object instead.
Pass the following parameters to this routine:
priority - The priority of the new thread. Typically this will be one of the standard thread priorities (see below).
valueToPass - A word of optional data to be passed to the entry routine of the new thread. This can be used, for example, to indicate the thread’s initial context or for initializing thread variables.
startRoutine - A pointer to the entry routine to be executed immediately for the thread. This may be in either fixed or movable memory. The segment must be a virtual segment. Note that if the routine is in movable memory, it may degrade heap performance for the life of the thread (its movable block will remain locked for extended stretches of time). The routine may return the thread’s exit code or may call ThreadDestroy() directly.
stackSize - The stack size allocated for the thread. 512 bytes is typically enough for threads doing neither UI nor file system work; threads working with the file system will require 1 K. Threads working with UI objects will require 3 K.
owner - The geode handle of the geode that will own the thread. If the calling thread’s geode will own the new thread, it can call GeodeGetProcessHandle() prior to calling ThreadCreate().
ThreadCreate() returns the thread handle of the new thread. If an error occurs, the calling thread’s error code will be set and a null handle returned; you should likely call ThreadGetError() to retrieve the error code after creating the new thread. A return of NO_ERROR_RETURNED from ThreadGetError() means no error occurred.
The standard thread priorities that may be passed in the priority parameter are listed below:
PRIORITY_TIME_CRITICAL
The highest priority of all; you should not use this in general because it will pre-empt nearly all other threads. (It may be useful, however, during debugging.)
PRIORITY_HIGH
A high priority; generally only used for highly important threads.
PRIORITY_UI
Another high priority; this is used for User Interface threads to provide quick response to user actions.
PRIORITY_FOCUS
A medium-level priority; this is used for whatever thread has the current input focus (whichever thread the user is currently working with).
PRIORITY_STANDAR D The standard application thread priority; you should typically use this when creating new threads.
PRIORITY_LOW
A low priority for tasks that can be done in the background.
PRIORITY_LOWEST
The lowest standard priority; it is used for threads that can take any amount of time to complete.
Include: thread.h
ThreadDestroy()
void ThreadDestroy(
word errorCode, /* Error code to indicate cause of destruction */
optr ackObject, /* Object to receive destruction acknowledgment */
word ackData); /* Additional word of data to pass (as the low
* word of optr for source of MSG_META_ACK) */ This routine causes the current (calling) thread to exit and then destroy itself. The thread is responsible for ensuring that it has no leftover resources allocated or semaphores locked.
Pass it an error code or exit code meaningful to the application and the other threads in the application. This error code will be used by the debugger to determine the cause of the thread’s exit; a null error code usually indicates successful completion of the thread’s task.
Pass also the optr of the object to receive acknowledgement of the thread’s destruction. The object specified will receive MSG_META_ACK after the calling thread is completely destroyed.
Be Sure To: Always clean up before exiting a thread. Unlock locked resources, free allocated memory, etc. You do not have to do these things for the application’s primary thread; the process object (the primary thread) will automatically clean up after itself.
Include: thread.h
ThreadFreeSem()
void ThreadFreeSem(
SemaphoreHandle sem); /* semaphore to be freed */ This routine frees the specified semaphore that had been allocated with **ThreadAllocSem()**. You must be sure that no threads are using the semaphore or will use it after it has been freed. Subsequent access attempts could cause illegal handle errors or worse.
Include: sem.h
ThreadFreeThreadLock()
void ThreadFreeThreadLock(
ThreadLockHandle sem); /* thread lock to be freed */ This routine frees the specified thread lock that had been allocated with **ThreadAllocThreadLock()**. You must be sure that no threads are using or will use the thread lock after it has been freed. Subsequent attempts to grab or release the thread lock could cause illegal handle errors.
Include: sem.h
ThreadGetError()
word ThreadGetError(void) This routine returns the thread's current error value.
ThreadGetInfo()
word ThreadGetInfo(
ThreadHandle th, /* thread to get information about */
ThreadGetInfoType info); /* type of information to get */ This routine gets information about the specified thread. The information desired is specified in the *info* parameter; the subject thread is specified in the *th* parameter. If the thread handle passed is zero or a null handle, the routine will return information about the calling thread.
The info parameter is one of the following values of ThreadGetInfoType, specifying the type of information to be returned by ThreadGetInfo():
TGIT_PRIORITY_AND_USAGE
The returned word will contain both the thread’s priority and the thread’s recent CPU usage. To extract the priority of the thread, use the macro TGI_PRIORITY; to extract the recent CPU usage, use the macro TGI_RECENT_CPU_USAGE.
TGIT_THREAD_HANDLE
Useful only when the th parameter is zero, this will return the thread handle of the subject thread. If th is zero, the handle of the calling thread will be returned.
TGIT_QUEUE_HANDLE
The returned word will contain the queue handle of the event-driven thread specified in th. If the thread specified is not event-driven, a null queue handle will be returned.
Include: thread.h
ThreadGrabThreadLock()
void ThreadGrabThreadLock(
ThreadLockHandle sem); /* thread lock to grab */ This routine attempts to grab the thread lock for the calling thread. If the thread lock is currently held by another thread, the caller will block until the lock becomes available. If the caller already has the thread lock, it will grab the lock again and continue executing.
Be Sure To: Thread locks must be released with ThreadReleaseThreadLock() once for each time they are grabbed.
Warnings: This routine provides no deadlock protection for multiple threads. If multiple threads will be grabbing multiple thread locks, the locks should always be grabbed in the same order to minimize the potential for deadlock.
Include: sem.h
ThreadHandleException()
void ThreadHandleException(
ThreadHandle th, /* thread to handle the exception */
ThreadExceptions exception, /* exception to handle */
void (*handler) ()); /* pointer to handler */ This routine allows a thread to set up a handler for a processor exception. This can be useful for debugging purposes. Pass the following three parameters:
th - The handle of the thread to handle the exception. Pass zero for the current thread.
exception - A ThreadException type (see below).
handler - A pointer to a handler in fixed or locked memory. Pass a null pointer to use the GEOS default exception handler.
Structures: The ThreadException type has the following values:
TE_DIVIDE_BY_ZERO
TE_OVERFLOW
TE_BOUND
TE_FPU_EXCEPTION
TE_SINGLE_STEP
TE_BREAKPOINT
Include: thread.h
ThreadModify()
void ThreadModify(
ThreadHandle th, /* thread to modify */
word newBasePriority, /* thread's new base priority */
ThreadModifyFlags flags); /* flags (see below) */ This routine modifies the priority of the specified thread. Use it to either set the base priority of the thread or reset the current CPU usage to zero. The parameters should have the following values:
th - The thread handle; pass zero to change the priority of the calling thread.
newBasePriority - The new base priority of the thread. Use one of the standard priorities - see ThreadCreate() - or use a value between zero and 255.
flags A record of ThreadModifyFlags; pass TMF_BASE_PRIO to change the thread’s base priority or TMF_ZERO_USAGE to reset the thread’s recent CPU usage to zero.
Warnings: Unless the thread is timing-critical, you should not set the base priority to zero.
Include: thread.h
ThreadPrivAlloc()
word ThreadPrivAlloc(
word wordsRequested, /* number of words to allocate */
GeodeHandle owner); /* handle of geode to own data */ This routine allocates a number of contiguous words in the private data of all geodes (loaded and yet-to-be loaded). It is exactly the same as **GeodePrivAlloc()**; see the entry for that routine.
Include: thread.h
See Also: GeodePrivAlloc()
ThreadPrivFree()
void ThreadPrivFree(
word range, /* offset to first word to be freed */
word wordsRequested); /* number of words to free */ This routine frees a number of contiguous private-data words previously allocated with **ThreadPrivAlloc()**. It is similar to **GeodePrivFree()**; see the entry for that routine for full information.
Include: thread.h
See Also: GeodePrivFree()
ThreadPSem()
SemaphoreError ThreadPSem(
SemaphoreHandle sem); /* semaphore to grab */ This routine attempts to grab the passed semaphore via a "P" operation. If the semaphore has already been grabbed, the thread will block until the semaphore becomes available, even if it was grabbed by the same thread.
ThreadPSem() returns an error code of type SemaphoreError, described in ThreadPTimedSem(), below. The error code is intended to indicate abnormal return by the previous thread; if the semaphore never becomes available, the thread will block indefinitely and the routine will not return.
Be Sure To: When the thread no longer needs the semaphore, it should release it with ThreadVSem().
Warnings: This routine provides no deadlock protection. If threads will grab multiple common semaphores, they should always grab/release them in the same order, minimizing the chances for deadlock.
A thread may not try to grab a particular semaphore twice without releasing it in between grabs. The thread will block on itself and will deadlock. If a thread may need to grab the semaphore twice in a row, it should use a thread lock instead (see ThreadAllocThreadLock() for more information).
Include: sem.h
ThreadPTimedSem()
SemaphoreError ThreadPTimedSem(
SemaphoreHandle sem, /* semaphore to grab */
word timeout); /* ticks before timeout */ This routine attempts to grab the passed semaphore via a "P" operation. If the semaphore has already been grabbed, the thread will block for at most the number of ticks specified in *timeout*.
ThreadPTimedSem() returns an error code of type SemaphoreError, which has three values:
SE_NO_ERROR
No error occurred and the semaphore was grabbed properly.
SE_TIMEOUT
The time elapsed and the semaphore was not grabbed. If this value is returned, the thread should not proceed with whatever protected operation was to happen. Instead, it should either attempt to grab the semaphore again or should proceed with other tasks.
SE_PREVIOUS_OWNER_DIED
The previous owner of the semaphore exited abnormally. If the thread currently holding the semaphore exited without releasing the semaphore, for example, this would be returned.
Often timeout is passed as zero to indicate that if the semaphore isn’t available right now, the thread will go on with some other action.
Be Sure To: When the thread no longer needs the semaphore, it should release it with ThreadVSem().
Warnings: This routine provides no deadlock protection. If threads will grab multiple common semaphores, they should always grab/release them in the same order, minimizing the chances for deadlock.
A thread may not try to grab a particular semaphore twice without releasing it in between grabs. The thread will block on itself and will deadlock. If a thread may need to grab the semaphore twice in a row, it should use a thread lock instead, though there is no timeout equivalent for thread locks (see ThreadAllocThreadLock() for more information).
Include: sem.h
ThreadReleaseThreadLock()
void ThreadReleaseThreadLock(
ThreadLockHandle sem); /* threadlock to release */ This routine releases the specified thread lock previously grabbed with **ThreadGrabThreadLock()**. Pass the handle of the thread lock as returned by **ThreadAllocThreadLock()**.
Do not try to release a thread lock that has not previously been grabbed. The results are unpredictable.
Include: sem.h
ThreadVSem()
void ThreadVSem(
SemaphoreHandle sem); /* semaphore to release */ This routine releases a semaphore that was grabbed with ThreadPSem() or **ThreadPTimedSem()**. Pass the handle of the semaphore as returned by **ThreadAllocSem()**.
Do not try to release a semaphore that has not previously been grabbed with one of the above routines. The results are unpredictable.
Include: sem.h
TimerGetCount()
dword TimerGetCount(); This routine returns the value of the system counter. The returned value is the number of ticks since GEOS started.
Include: timer.h
TimerGetDateAndTime()
void TimerGetDateAndTime(
TimerDateAndTime * dateAndTime); /* buffer for returned values */ This routine returns the current time and date. Pass it a pointer to an empty **TimerDateAndTime** structure to be filled in by the routine.
Include: timedate.h
TimerSetDateAndTime()
void TimerSetDateAndTime(
word flags, /* which item to set */
const TimerDateAndTime * dateAndTime); /* new values */ This routine sets the current date and/or time of the system. Pass it the following:
flags - A word of flags. Pass TIME_SET_DATE to set the day, month, and year; pass TIME_SET_TIME to set the hour, minute, and second. Pass both to set both.
dateAndTime - A pointer to a TimerDateAndTime structure containing the information to be set.
Include: timedate.h
TimerSleep()
void TimerSleep(
word ticks); /* number of ticks the thread should sleep */ This routine invokes a "sleep timer" that will put the calling thread to sleep for the given number of ticks. At the end of the time, the thread will continue executing with the next instruction.
Warnings: Do not use sleep timers as a substitute for semaphores for thread synchronization.
Include: timer.h
TimerStart()
TimerHandle TimerStart(
TimerType timerType, /* type of timer to start */
optr destObject, /* object to receive notification
* message when timer expires */
word ticks, /* amount of time to run */
Message msg, /* notification message */
word interval, /* interval for continual timers */
word * id); /* buffer for returned timer ID */ This routine starts a timer of any type. The timer will run for the specified number of ticks and then will send the given message to the destination object. The message is sent with the flags MF_FORCE_QUEUE, MF_CHECK_DUPLICATE and MF_REPLACE, so it will always be put in the recipient's queue and will always replace any duplicates already in the queue. Pass this routine the following:
timerType - A value of TimerType indicating the type of timer to start.
destObject - The optr of the object that will be sent the specified message when the time is up.
ticks - The number of ticks for the timer to run. (Sixty ticks equals one second.)
msg - The message to be sent to the destination object when time is up.
interval - For continual timers, the interval (number of ticks) at which to send out the message to the destination object. The timer will send the message once at the end of each interval. The first message will be sent ticks ticks after the timer is started. The second message will be sent interval ticks after that.
id - A pointer to a word in which the timer’s ID will be returned. You will need this ID for TimerStop().
This routine returns the handle of the timer as well as an ID pointed to by the id parameter. You will need the handle and the ID for TimerStop().
TimerType: The TimerType enumerated type defines what type of timer should be initiated. It has the following values:
TIMER_ROUTINE_ONE_SHOT
Start a timer that will call a routine and then free itself when the time is expired. This type is supported in assembly but not in C.
TIMER_ROUTINE_CONTINUAL
Start a timer that will call a routine once per time interval until TimerStop() is called. This type is supported in assembly but not in C.
TIMER_EVENT_ONE_SHOT
Start a timer that will send a message to a given object, then free itself, when time is expired.
TIMER_EVENT_CONTINUAL
Start a timer that will send a message to a given object once per time interval until TimerStop() is called.
TIMER_MS_ROUTINE_ONE_SHOT
Start a timer that has millisecond accuracy. For this timer, the number of ticks will actually be the number of milliseconds. The timer will call a specified routine and then free itself when time is expired. This type is supported in assembly but not in C.
TIMER_EVENT_REAL_TIME
Start a timer that will call a routine at some particular date and time. On devices that support such a timer, this event will wake a sleeping machine.
Include: timer.h
TimerStop()
Boolean TimerStop(
TimerHandle th, /* handle of timer to be stopped */
word id); /* timer ID (returned by TimerStart() */ This routine stops a timer that had been started with **TimerStart()**. Pass it the timer handle and the ID as returned by that routine (the ID of a continual timer will always be zero).
The returned error flag will be true if the timer could not be found.
Warnings: If you call TimerStop() to stop a continual timer that sends its message across threads, there may be timer events left in the recipient’s event queue. It is unsafe in this situation to assume that all timer events have been handled. To ensure the timer message has been handled, you can send the destination an “all-safe” message with the MF_FORCE_QUEUE flag.
Include: timer.h
TocDBLock()
void * TocDBLock(
DBGroupAndItem thing); Use this routine to lock a name array maintained by a PrefTocList object.
Include: config.goh
TocDBLockGetRef()
void * TocDBLockGetRef(
DBGroupAndItem thing,
optr *refPtr); This routine locks a name array maintained by a PrefTocList object, returning the item's pointer and optr.
Include: config.goh
TocFindCategory()
Boolean TocFindCategory(
TocCategoryStruct *cat); This routine searches a PrefTocList object's name list for a given token.
Structures:
typedef struct {
TokenChars TCS_tokenChars;
DBGroupAndItem TCS_files; /* file name array */
DBGroupAndItem TCS_devices; /* device name array--only if
* TCF_EXTENDED_DEVICE_DRIVERS
* is set. */
} TocCategoryStruct;
Include: config.goh
TocGetFileHandle()
word TocGetFileHandle(); Use this routine to get the handle of the file used by PrefTocLists to store their name array data.
Include: config.goh
TocNameArrayAdd()
word TocNameArrayAdd(
DBGroupAndItem array,
const char *nameToFind,
const void *data); Use this routine to add a name to a name array maintained by a PrefTocList object.
Include: config.h
TocNameArrayFind()
word TocNameArrayGetElement(
DBGroupAndItem array,
word element,
void *buffer); Use this routine to find a name in the name list maintained by a PrefTocList object.
Include: config.goh
TocNameArrayGetElement()
word TocNameArrayGetElement(
DBGroupAndItem array,
word element,
void *buffer); Use this routine to retrieve a given element from a name array maintained by a PrefTocList object.
Include: config.goh
TocSortedNameArrayAdd()
word TocSortedNameArrayAdd(
word arr,
const char *nameToAdd,
NameArrayAddFlags flags,
const void *data); This routine adds a name to a sorted name array associated with a PrefTocList object.
Structures:
typedef WordFlags NameArrayAddFlags;
#define NAAF_SET_DATA_ON_REPLACE 0x8000
Include: config.goh
TocSortedNameArrayFind()
Boolean TocSortedNameArrayFind(
word arr,
const char *nameToFind,
SortedNameArrayFindFlags flags,
void *buffer,
word *elementNum); This routine looks up a name in a sorted name array associated with a PrefTocList object.
Structures:
typedef WordFlags SortedNameArrayFindFlags;
#define SNAFF_IGNORE_CASE 0x0080
Include: config.goh
TocUpdateCategory()
void TocUpdateCategory(
TocUpdateCategoryParams *params); Use this routine to update a PrefTocList object based upon the files in a given directory with a given token.
Structures:
typedef struct {
TocUpdateCategoryFlags TUCP_flags;
TokenChars TUCP_tokenChars;
byte TUCP_fileArrayElementSize;
TocUpdateAddCallback *TUCP_addCallback;
byte TUCP_pad; /* Wants to be word-aligned */
} TocUpdateCategoryParams;
typedef word _pascal TocUpdateAddCallback(
const char *filename,
optr chunkArray);
/* Return 0 if add aborted, else return offset of new element within
* block */
Include: config.goh
TOKEN_CHARS()
dword TOKEN_CHARS(a, b, c, d);
char a, b, c, d; This macro creates a single dword value from four given characters. This is useful when creating a token characters value for a specific token.
TokenDefineToken()
word TokenDefineToken(
dword tokenChars, /* four token characters */
ManufacturerID manufacturerID, /* manufacturer ID for token */
optr monikerList, /* optr of moniker list */
TokenFlags flags); /* token flags */ This routine adds a new token and moniker list to the token database. If the token already exists in the token DB, the old will be replaced with the new. This routine must only be called by a thread that can lock the block in which the passed moniker or moniker list resides. This routine must be passed the following parameters:
tokenChars - The four token characters that identify this moniker or moniker list in the token database. Create this dword value from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
monikerList - The optr of the moniker list to be added to the token database.
flags - A record of TokenFlags indicating the relocation status of the moniker list.
Warnings: This routine may legally move locked LMem blocks (token database items), thereby invalidating all pointers to token database items.
Include: token.h
TokenGetTokenInfo()
Boolean TokenGetTokenInfo(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */
TokenFlags * flags); /* returned token flags */ This routine returns information about a specified token. Pass it the following:
tokenChars - The four token characters that identify the token database entry. Create this dword from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
flags - A pointer to an empty flags record; the flags set (if any) for the specified token (if it exists) will be returned here.
This routine returns a (non-zero) value of VMStatus if the token was not found in the token database. It returns zero if successful.
Include: token.h
TokenListTokens()
dword TokenListTokens(
TokenRangeFlags tokenRangeFlags,
word headerSize,
ManufacturerID manufacturerID)); This routine lists all the tokens in the token database. It allocates a new block on the global heap and writes in it an array of **GeodeToken** structures. This routine returns the actual tokens, not the token groups.
The returned dword consists of two values: The high word represents the number of tokens in the returned block and may be extracted with the macro TokenListTokensCountFromDWord(). The low word represents the handle of the newly-allocated block and can be extracted with the macro TokenListTokensHandleFromDWord().
Include: token.h
TokenListTokensCountFromDWord()
word TokenListTokensCountFromDWord(d);
dword d; This macro extracts the number of tokens from the value returned by **TokenListTokens()**.
TokenListTokensHandleFromDWord()
word TokenListTokensHandleFromDWord(d);
dword d; This routine extracts the MemHandle from the value returned by **TokenListTokens()**.
TokenLoadMonikerBlock()
Boolean TokenLoadMonikerBlock(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */
DisplayType displayType, /* type of display for token */
VisMonikerSearchFlags searchFlags, /* flags for finding token */
word * blockSize, /* returned block size */
MemHandle * blockHandle); /* returned block handle */ This routine loads a specified token's moniker, allocating a new global memory block for the moniker. The returned Boolean will be *false* if the moniker was found, *true* otherwise. Information about the moniker is returned in the values pointed to by *blockSize* (the size of the newly allocated block) and *blockHandle* (the handle of the new block). If the moniker is not found, both return pointers will be NULL and no block will be allocated.
Pass this routine the following:
tokenChars - The four token characters that identify the token database entry. Create this dword from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
displayType - A value of DisplayType indicating the size of the display (used to indicate small-screen devices, primarily).
searchFlags - A record of VisMonikerSearchFlags indicating what type of moniker is being requested.
blockSize - A pointer to a word in which the new block’s size will be returned.
blockHandle - A pointer to a handle in which the new block’s handle will be returned.
Include: token.h
TokenLoadMonikerBuffer()
Boolean TokenLoadMonikerBuffer(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */
DisplayType displayType, /* type of display for token */
VisMonikerSearchFlags searchFlags, /* flags for finding token */
void * buffer, /* pointer to buffer for token */
word bufSize, /* size of passed buffer */
word * bytesReturned); /* number of bytes returned */ This routine loads a specified token's moniker into a provided buffer. The return value will be *false* if the moniker was found, *true* otherwise. The size of the returned moniker will be returned in the word pointed to by the *bytesReturned* parameter.
Pass this routine the following:
tokenChars - The four token characters that identify the token database entry. Create this dword from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
displayType - A value of DisplayType indicating the size of the display (used to indicate small-screen devices, primarily).
searchFlags - A record of VisMonikerSearchFlags indicating what type of moniker is being requested.
buffer - A pointer to a locked or fixed buffer into which the moniker will be copied.
bufSize - The size of the passed buffer; also the maximum size of the moniker that may be returned.
bytesReturned - The size of the moniker actually returned in the buffer.
Include: token.h
TokenLoadMonikerChunk()
Boolean TokenLoadMonikerChunk(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */
DisplayType displayType, /* type of display for token */
VisMonikerSearchFlags searchFlags, /* flags for finding token */
MemHandle lmemBlock, /* locked block for new chunk */
word * chunkSize, /* returned new chunk size */
ChunkHandle * chunkHandle); /* returned new chunk handle */ This routine loads a specified token's moniker, allocating a new chunk in a local memory block for the moniker. The returned error flag will be *true* if the moniker was not found, *false* otherwise.
Pass this routine the following:
tokenChars - The four token characters that identify the token database entry. Create this dword from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
displayType - A value of DisplayType indicating the size of the display (used to indicate small-screen devices, primarily).
searchFlags - A record of VisMonikerSearchFlags indicating what type of moniker is being requested.
lmemBlock - The MemHandle of the local memory block in which the new chunk will be allocated. If the block is locked, you must dereference the global handle after calling this routine.
chunkSize - A pointer to a word in which the size of the allocated chunk will be returned.
chunkhandle - A pointer to a chunk handle in which the handle of the newly allocated chunk will be returned.
Warnings: This routine can move chunks in the passed block, thereby invalidating pointers to any chunk in the block.
Include: token.h
TokenLoadTokenBlock()
Boolean TokenLoadTokenBlock(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */
word * blockSize, /* returned size of new block */
MemHandle * blockHandle); /* returned handle of block */ This routine loads the specified token's **TokenEntry** structure into a newly-allocated global memory block. If the token is not found, the returned error flag will be *true*; otherwise, it will be *false*.
Pass this routine the following:
tokenChars - The four token characters that identify the token database entry. Create this dword from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
blockSize - A pointer to a word in which the size of the newly-allocated block will be returned.
blockHandle - A pointer to a global handle in which the handle of the newly-allocated block will be returned.
Include: token.h
TokenLoadTokenBuffer()
Boolean TokenLoadTokenBuffer(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */
TokenEntry * buffer); /* buffer for returned token */ This routine loads the specified token's **TokenEntry** structure into a passed buffer. The returned error flag will be *true* if the token was not found, *false* otherwise. Pass this routine the following:
tokenChars - The four token characters that identify the token database entry. Create this dword from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
buffer - A pointer to a locked or fixed buffer into which the token entry will be copied.
Include: token.h
TokenLoadTokenChunk()
Boolean TokenLoadTokenChunk(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */
MemHandle lmemBlock, /* handle of block for chunk */
word * chunkSize, /* returned size of new chunk */
ChunkHandle * chunkHandle); /* returned chunk handle */ This routine loads the specified token's **TokenEntry** structure into a newly-allocated chunk. The returned error flag will be *true* if the token could not be found, *false* otherwise.
Pass this routine the following:
tokenChars - The four token characters that identify the token database entry. Create this dword from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
lmemBlock - The MemHandle of the local memory block in which the new chunk will be allocated. If the block is locked, you must manually dereference this handle after the routine call.
chunksize - A pointer to a word in which the size of the newly-allocated chunk will be returned.
chunkHandle - A pointer to a chunk handle in which the handle of the newly-allocated chunk will be returned.
Warnings: This routine can move chunks in the passed block, thereby invalidating pointers to any chunk in the block.
Include: token.h
TokenLockTokenMoniker()
void * TokenLockTokenMoniker(
TokenMonikerInfo tokenMonikerInfo); /* The DB group and item numbers
* as returned by TokenLookupMoniker() */ This routine locks a token's moniker so it may be drawn; it returns a pointer to the locked chunk containing the moniker information. Pass it the structure returned by **TokenLookupMoniker()**.
Be Sure To: Unlock the moniker with TokenUnlockMoniker() after you have finished drawing it.
Include: token.h
TokenLookupMoniker()
Boolean TokenLookupMoniker(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */
DisplayType displayType, /* display type of token */
VisMonikerSearchFlags searchFlags, /* flags for finding token */
TokenMonikerInfo * tokenMonikerInfo); /* DB group and item of token */ This routine finds and retrieves a pointer to the specific moniker for the specified token, given also the token's display type and other attributes. Pass the following:
tokenChars - The four token characters that identify this moniker or moniker list in the token database. Create this dword value from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
displayType - A value of DisplayType indicating the size of the display (used to indicate small-screen devices, primarily).
searchFlags - A record of VisMonikerSearchFlags indicating what type of moniker is being requested.
tokenDBItem A pointer to an empty TokenMonikerInfo structure, in which the token’s group and item numbers will be returned.
The return value is an error flag: it will be true if the item could not be found in the token database, false otherwise.
Include: token.h
TokenCloseLocalTokenDB()
void TokenCloseLocalTokenDB() This routine closes the local token database.
TokenListTokens()
dword TokenListTokens(
TokenRangeFlags tokenRangeFlags,
word headerSize,
ManufacturerID manufacturerID) This routine locates all the tokens that meet specified criteria, allocates a block, and copies the tokens to that block. The upper word of the return value is the number of matching tokens found; the lower word is the handle of the block which was allocated.
TokenOpenLocalTokenDB()
word TokenOpenLocalTokenDB() This routine opens the local token database. It returns zero on success, and a **VMStatus** error code on failure.
Include: token.h
TokenRemoveToken
Boolean TokenRemoveToken(
dword tokenChars, /* four characters of token */
ManufacturerID manufacturerID, /* manufacturer ID of token */ This routine removes the specified token and its moniker list from the token database. It returns an error flag: if the token could not be found, the returned flag is *true*; otherwise it is *false*. Pass the following:
tokenChars - The four token characters that identify this moniker or moniker list in the token database. Create this dword value from the four characters with the macro TOKEN_CHARS.
manufacturerID - The manufacturer ID number of the manufacturer responsible for the token database entry.
Include: token.h
TokenUnlockTokenMoniker()
void TokenUnlockTokenMoniker(
void * moniker); This routine unlocks a moniker that had been locked with **TokenLockMoniker()**. Pass a pointer to the locked moniker, as returned by the locking routine.
Include: token.h
TypeFromFormatID()
word TypeFromFormatID(id);
ClipboardItemFormatID id; This macro extracts the word-sized format ID (of type **ClipboardItemFormat**) from a **ClipboardFormatID** argument.