Back to index

lightning-sunbird  0.9+nobinonly
Defines | Functions | Variables
npmac.cpp File Reference
#include <Processes.h>
#include <Gestalt.h>
#include <CodeFragments.h>
#include <Timer.h>
#include <Resources.h>
#include <ToolUtils.h>
#include "jri.h"
#include "npapi.h"
#include "npupp.h"

Go to the source code of this file.

Defines

#define XP_MAC   1
#define NDEBUG   1
#define EnterCodeResource()
#define ExitCodeResource()
#define PLUGIN_TRACE   0
#define PLUGINDEBUGSTR
#define DEBUG_MEMORY   0

Functions

void NPN_Version (int *plugin_major, int *plugin_minor, int *netscape_major, int *netscape_minor)
NPError NPN_GetURLNotify (NPP instance, const char *url, const char *window, void *notifyData)
NPError NPN_GetURL (NPP instance, const char *url, const char *window)
NPError NPN_PostURLNotify (NPP instance, const char *url, const char *window, uint32 len, const char *buf, NPBool file, void *notifyData)
NPError NPN_PostURL (NPP instance, const char *url, const char *window, uint32 len, const char *buf, NPBool file)
NPError NPN_RequestRead (NPStream *stream, NPByteRange *rangeList)
NPError NPN_NewStream (NPP instance, NPMIMEType type, const char *window, NPStream **stream)
int32 NPN_Write (NPP instance, NPStream *stream, int32 len, void *buffer)
NPError NPN_DestroyStream (NPP instance, NPStream *stream, NPError reason)
void NPN_Status (NPP instance, const char *message)
const char * NPN_UserAgent (NPP instance)
voidNPN_MemAlloc (uint32 size)
void NPN_MemFree (void *ptr)
uint32 NPN_MemFlush (uint32 size)
void NPN_ReloadPlugins (NPBool reloadPages)
JRIEnvNPN_GetJavaEnv (void)
jref NPN_GetJavaPeer (NPP instance)
NPError NPN_GetValue (NPP instance, NPNVariable variable, void *value)
NPError NPN_SetValue (NPP instance, NPPVariable variable, void *value)
void NPN_InvalidateRect (NPP instance, NPRect *rect)
void NPN_InvalidateRegion (NPP instance, NPRegion region)
void NPN_ForceRedraw (NPP instance)
NPError Private_Initialize (void)
void Private_Shutdown (void)
NPError Private_New (NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char *argn[], char *argv[], NPSavedData *saved)
NPError Private_Destroy (NPP instance, NPSavedData **save)
NPError Private_SetWindow (NPP instance, NPWindow *window)
NPError Private_NewStream (NPP instance, NPMIMEType type, NPStream *stream, NPBool seekable, uint16 *stype)
NPError Private_DestroyStream (NPP instance, NPStream *stream, NPError reason)
int32 Private_WriteReady (NPP instance, NPStream *stream)
int32 Private_Write (NPP instance, NPStream *stream, int32 offset, int32 len, void *buffer)
void Private_StreamAsFile (NPP instance, NPStream *stream, const char *fname)
void Private_Print (NPP instance, NPPrint *platformPrint)
int16 Private_HandleEvent (NPP instance, void *event)
void Private_URLNotify (NPP instance, const char *url, NPReason reason, void *notifyData)
jref Private_GetJavaClass (void)
NPError Private_GetValue (NPP instance, NPPVariable variable, void *result)
NPError Private_SetValue (NPP instance, NPNVariable variable, void *value)
void SetUpQD (void)
NPError main (NPNetscapeFuncs *nsTable, NPPluginFuncs *pluginFuncs, NPP_ShutdownUPP *unloadUpp)

Variables

QDGlobals * gQDPtr
short gResFile
NPNetscapeFuncs gNetscapeFuncs
RoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, main)

Define Documentation

Definition at line 267 of file npmac.cpp.

Definition at line 62 of file npmac.cpp.

Definition at line 63 of file npmac.cpp.

#define NDEBUG   1

Definition at line 51 of file npmac.cpp.

Definition at line 116 of file npmac.cpp.

Definition at line 121 of file npmac.cpp.

#define XP_MAC   1

Definition at line 50 of file npmac.cpp.


Function Documentation

NPError main ( NPNetscapeFuncs nsTable,
NPPluginFuncs pluginFuncs,
NPP_ShutdownUPP unloadUpp 
)

Definition at line 622 of file npmac.cpp.

{
       EnterCodeResource();
       PLUGINDEBUGSTR("\pmain");

       NPError err = NPERR_NO_ERROR;
       
       //
       // Ensure that everything Netscape passed us is valid!
       //
       if ((nsTable == NULL) || (pluginFuncs == NULL) || (unloadUpp == NULL))
              err = NPERR_INVALID_FUNCTABLE_ERROR;
       
       //
       // Check the ³major² version passed in Netscapeıs function table.
       // We wonıt load if the major version is newer than what we expect.
       // Also check that the function tables passed in are big enough for
       // all the functions we need (they could be bigger, if Netscape added
       // new APIs, but thatıs OK with us -- weıll just ignore them).
       //
       if (err == NPERR_NO_ERROR)
       {
              if ((nsTable->version >> 8) > NP_VERSION_MAJOR)         // Major version is in high byte
                     err = NPERR_INCOMPATIBLE_VERSION_ERROR;
//            if (nsTable->size < sizeof(NPNetscapeFuncs))
//                   err = NPERR_INVALID_FUNCTABLE_ERROR;
//            if (pluginFuncs->size < sizeof(NPPluginFuncs))          
//                   err = NPERR_INVALID_FUNCTABLE_ERROR;
       }
              
       
       if (err == NPERR_NO_ERROR)
       {
              //
              // Copy all the fields of Netscapeıs function table into our
              // copy so we can call back into Netscape later.  Note that
              // we need to copy the fields one by one, rather than assigning
              // the whole structure, because the Netscape function table
              // could actually be bigger than what we expect.
              //
              
              int navMinorVers = nsTable->version & 0xFF;

              gNetscapeFuncs.version = nsTable->version;
              gNetscapeFuncs.size = nsTable->size;
              gNetscapeFuncs.posturl = nsTable->posturl;
              gNetscapeFuncs.geturl = nsTable->geturl;
              gNetscapeFuncs.requestread = nsTable->requestread;
              gNetscapeFuncs.newstream = nsTable->newstream;
              gNetscapeFuncs.write = nsTable->write;
              gNetscapeFuncs.destroystream = nsTable->destroystream;
              gNetscapeFuncs.status = nsTable->status;
              gNetscapeFuncs.uagent = nsTable->uagent;
              gNetscapeFuncs.memalloc = nsTable->memalloc;
              gNetscapeFuncs.memfree = nsTable->memfree;
              gNetscapeFuncs.memflush = nsTable->memflush;
              gNetscapeFuncs.reloadplugins = nsTable->reloadplugins;
              if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
              {
                     gNetscapeFuncs.getJavaEnv = nsTable->getJavaEnv;
                     gNetscapeFuncs.getJavaPeer = nsTable->getJavaPeer;
              }
              if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
              {      
                     gNetscapeFuncs.geturlnotify = nsTable->geturlnotify;
                     gNetscapeFuncs.posturlnotify = nsTable->posturlnotify;
              }
              gNetscapeFuncs.getvalue = nsTable->getvalue;
              gNetscapeFuncs.setvalue = nsTable->setvalue;
              gNetscapeFuncs.invalidaterect = nsTable->invalidaterect;
              gNetscapeFuncs.invalidateregion = nsTable->invalidateregion;
              gNetscapeFuncs.forceredraw = nsTable->forceredraw;

              // defer static constructors until the global functions are initialized.
              __InitCode__();
              
              //
              // Set up the plugin function table that Netscape will use to
              // call us.  Netscape needs to know about our version and size
              // and have a UniversalProcPointer for every function we implement.
              //
              pluginFuncs->version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
              pluginFuncs->size = sizeof(NPPluginFuncs);
              pluginFuncs->newp = NewNPP_NewProc(Private_New);
              pluginFuncs->destroy = NewNPP_DestroyProc(Private_Destroy);
              pluginFuncs->setwindow = NewNPP_SetWindowProc(Private_SetWindow);
              pluginFuncs->newstream = NewNPP_NewStreamProc(Private_NewStream);
              pluginFuncs->destroystream = NewNPP_DestroyStreamProc(Private_DestroyStream);
              pluginFuncs->asfile = NewNPP_StreamAsFileProc(Private_StreamAsFile);
              pluginFuncs->writeready = NewNPP_WriteReadyProc(Private_WriteReady);
              pluginFuncs->write = NewNPP_WriteProc(Private_Write);
              pluginFuncs->print = NewNPP_PrintProc(Private_Print);
              pluginFuncs->event = NewNPP_HandleEventProc(Private_HandleEvent);     
              if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
              {      
                     pluginFuncs->urlnotify = NewNPP_URLNotifyProc(Private_URLNotify);                   
              }
              if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
              {
                     pluginFuncs->javaClass      = (JRIGlobalRef) Private_GetJavaClass();
                     pluginFuncs->getvalue = NewNPP_GetValueProc(Private_GetValue);
                     pluginFuncs->setvalue = NewNPP_SetValueProc(Private_SetValue);
              }
              *unloadUpp = NewNPP_ShutdownProc(Private_Shutdown);
              SetUpQD();
              err = Private_Initialize();
       }
       
       ExitCodeResource();
       return err;
}
NPError NPN_DestroyStream ( NPP  instance,
NPStream stream,
NPError  reason 
)

Definition at line 241 of file npmac.cpp.

{
       int navMinorVers = gNetscapeFuncs.version & 0xFF;
       NPError err;
       
       if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
       {
              err = CallNPN_DestroyStreamProc(gNetscapeFuncs.destroystream, instance, stream, reason);
       }
       else
       {
              err = NPERR_INCOMPATIBLE_VERSION_ERROR;
       }
       return err;
}
void NPN_ForceRedraw ( NPP  instance)

Definition at line 328 of file npmac.cpp.

Definition at line 298 of file npmac.cpp.

jref NPN_GetJavaPeer ( NPP  instance)

Definition at line 303 of file npmac.cpp.

NPError NPN_GetURL ( NPP  instance,
const char *  url,
const char *  window 
)

Definition at line 177 of file npmac.cpp.

{
       return CallNPN_GetURLProc(gNetscapeFuncs.geturl, instance, url, window);
}
NPError NPN_GetURLNotify ( NPP  instance,
const char *  url,
const char *  window,
void notifyData 
)

Definition at line 161 of file npmac.cpp.

{
       int navMinorVers = gNetscapeFuncs.version & 0xFF;
       NPError err;
       
       if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
       {
              err = CallNPN_GetURLNotifyProc(gNetscapeFuncs.geturlnotify, instance, url, window, notifyData);
       }
       else
       {
              err = NPERR_INCOMPATIBLE_VERSION_ERROR;
       }
       return err;
}
NPError NPN_GetValue ( NPP  instance,
NPNVariable  variable,
void value 
)

Definition at line 308 of file npmac.cpp.

{
       return CallNPN_GetValueProc( gNetscapeFuncs.getvalue, instance, variable, value);
}
void NPN_InvalidateRect ( NPP  instance,
NPRect rect 
)

Definition at line 318 of file npmac.cpp.

void NPN_InvalidateRegion ( NPP  instance,
NPRegion  region 
)

Definition at line 323 of file npmac.cpp.

void* NPN_MemAlloc ( uint32  size)

Definition at line 269 of file npmac.cpp.

{
#if DEBUG_MEMORY
       return (void*) NewPtrClear(size);
#else
       return CallNPN_MemAllocProc(gNetscapeFuncs.memalloc, size);
#endif
}

Definition at line 287 of file npmac.cpp.

void NPN_MemFree ( void ptr)

Definition at line 278 of file npmac.cpp.

{
#if DEBUG_MEMORY
       DisposePtr(Ptr(ptr));
#else
       CallNPN_MemFreeProc(gNetscapeFuncs.memfree, ptr);
#endif
}
NPError NPN_NewStream ( NPP  instance,
NPMIMEType  type,
const char *  window,
NPStream **  stream 
)

Definition at line 209 of file npmac.cpp.

{
       int navMinorVers = gNetscapeFuncs.version & 0xFF;
       NPError err;
       
       if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
       {
              err = CallNPN_NewStreamProc(gNetscapeFuncs.newstream, instance, type, window, stream);
       }
       else
       {
              err = NPERR_INCOMPATIBLE_VERSION_ERROR;
       }
       return err;
}
NPError NPN_PostURL ( NPP  instance,
const char *  url,
const char *  window,
uint32  len,
const char *  buf,
NPBool  file 
)

Definition at line 199 of file npmac.cpp.

{
       return CallNPN_PostURLProc(gNetscapeFuncs.posturl, instance, url, window, len, buf, file);
}
NPError NPN_PostURLNotify ( NPP  instance,
const char *  url,
const char *  window,
uint32  len,
const char *  buf,
NPBool  file,
void notifyData 
)

Definition at line 182 of file npmac.cpp.

{
       int navMinorVers = gNetscapeFuncs.version & 0xFF;
       NPError err;
       
       if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
       {
              err = CallNPN_PostURLNotifyProc(gNetscapeFuncs.posturlnotify, instance, url, 
                                                                                                  window, len, buf, file, notifyData);
       }
       else
       {
              err = NPERR_INCOMPATIBLE_VERSION_ERROR;
       }
       return err;
}
void NPN_ReloadPlugins ( NPBool  reloadPages)

Definition at line 292 of file npmac.cpp.

NPError NPN_RequestRead ( NPStream stream,
NPByteRange rangeList 
)

Definition at line 204 of file npmac.cpp.

{
       return CallNPN_RequestReadProc(gNetscapeFuncs.requestread, stream, rangeList);
}
NPError NPN_SetValue ( NPP  instance,
NPPVariable  variable,
void value 
)

Definition at line 313 of file npmac.cpp.

{
       return CallNPN_SetValueProc( gNetscapeFuncs.setvalue, instance, variable, value);
}
void NPN_Status ( NPP  instance,
const char *  message 
)

Definition at line 257 of file npmac.cpp.

const char* NPN_UserAgent ( NPP  instance)

Definition at line 262 of file npmac.cpp.

void NPN_Version ( int plugin_major,
int plugin_minor,
int netscape_major,
int netscape_minor 
)

Definition at line 153 of file npmac.cpp.

{
       *plugin_major = NP_VERSION_MAJOR;
       *plugin_minor = NP_VERSION_MINOR;
       *netscape_major = gNetscapeFuncs.version >> 8;          // Major version is in high byte
       *netscape_minor = gNetscapeFuncs.version & 0xFF; // Minor version is in low byte
}
int32 NPN_Write ( NPP  instance,
NPStream stream,
int32  len,
void buffer 
)

Definition at line 225 of file npmac.cpp.

{
       int navMinorVers = gNetscapeFuncs.version & 0xFF;
       NPError err;
       
       if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
       {
              err = CallNPN_WriteProc(gNetscapeFuncs.write, instance, stream, len, buffer);
       }
       else
       {
              err = NPERR_INCOMPATIBLE_VERSION_ERROR;
       }
       return err;
}
NPError Private_Destroy ( NPP  instance,
NPSavedData **  save 
)

Definition at line 392 of file npmac.cpp.

{
       NPError err;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pDestroy;g;");
       err = NPP_Destroy(instance, save);
       ExitCodeResource();
       return err;
}

Here is the call graph for this function:

Here is the caller graph for this function:

NPError Private_DestroyStream ( NPP  instance,
NPStream stream,
NPError  reason 
)

Definition at line 451 of file npmac.cpp.

{
       NPError err;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pDestroyStream;g;");
       err = NPP_DestroyStream(instance, stream, reason);
       ExitCodeResource();
       return err;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 35 of file npwin.cpp.

{
    jref clazz = NPP_GetJavaClass();
    if (clazz) {
              JRIEnv* env = NPN_GetJavaEnv();
              return JRI_NewGlobalRef(env, clazz);
    }
    return NULL;
}
NPError Private_GetValue ( NPP  instance,
NPPVariable  variable,
void result 
)

Definition at line 503 of file npmac.cpp.

{
       NPError err;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pGetValue;g;");
       err = NPP_GetValue(instance, variable, result);
       ExitCodeResource();
       return err;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int16 Private_HandleEvent ( NPP  instance,
void event 
)

Definition at line 461 of file npmac.cpp.

{
       int16 result;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pHandleEvent;g;");
       result = NPP_HandleEvent(instance, event);
       ExitCodeResource();
       return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 361 of file npmac.cpp.

{
       NPError err;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pInitialize;g;");
       err = NPP_Initialize();
       ExitCodeResource();
       return err;
}

Here is the call graph for this function:

Here is the caller graph for this function:

NPError Private_New ( NPMIMEType  pluginType,
NPP  instance,
uint16  mode,
int16  argc,
char *  argn[],
char *  argv[],
NPSavedData saved 
)

Definition at line 383 of file npmac.cpp.

{
       EnterCodeResource();
       NPError ret = NPP_New(pluginType, instance, mode, argc, argn, argv, saved);
       PLUGINDEBUGSTR("\pNew;g;");
       ExitCodeResource();
       return ret;   
}

Here is the call graph for this function:

Here is the caller graph for this function:

NPError Private_NewStream ( NPP  instance,
NPMIMEType  type,
NPStream stream,
NPBool  seekable,
uint16 stype 
)

Definition at line 412 of file npmac.cpp.

{
       NPError err;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pNewStream;g;");
       err = NPP_NewStream(instance, type, stream, seekable, stype);
       ExitCodeResource();
       return err;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void Private_Print ( NPP  instance,
NPPrint platformPrint 
)

Definition at line 471 of file npmac.cpp.

{
       EnterCodeResource();
       PLUGINDEBUGSTR("\pPrint;g;");
       NPP_Print(instance, platformPrint);
       ExitCodeResource();
}

Here is the call graph for this function:

Here is the caller graph for this function:

NPError Private_SetValue ( NPP  instance,
NPNVariable  variable,
void value 
)

Definition at line 513 of file npmac.cpp.

{
       NPError err;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pSetValue;g;");
       err = NPP_SetValue(instance, variable, value);
       ExitCodeResource();
       return err;
}

Here is the call graph for this function:

Here is the caller graph for this function:

NPError Private_SetWindow ( NPP  instance,
NPWindow window 
)

Definition at line 402 of file npmac.cpp.

{
       NPError err;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pSetWindow;g;");
       err = NPP_SetWindow(instance, window);
       ExitCodeResource();
       return err;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 371 of file npmac.cpp.

{
       EnterCodeResource();
       PLUGINDEBUGSTR("\pShutdown;g;");
       NPP_Shutdown();

       __destroy_global_chain();

       ExitCodeResource();
}

Here is the call graph for this function:

Here is the caller graph for this function:

void Private_StreamAsFile ( NPP  instance,
NPStream stream,
const char *  fname 
)

Definition at line 442 of file npmac.cpp.

{
       EnterCodeResource();
       PLUGINDEBUGSTR("\pStreamAsFile;g;");
       NPP_StreamAsFile(instance, stream, fname);
       ExitCodeResource();
}

Here is the call graph for this function:

Here is the caller graph for this function:

void Private_URLNotify ( NPP  instance,
const char *  url,
NPReason  reason,
void notifyData 
)

Definition at line 479 of file npmac.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

int32 Private_Write ( NPP  instance,
NPStream stream,
int32  offset,
int32  len,
void buffer 
)

Definition at line 432 of file npmac.cpp.

{
       int32 result;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pWrite;g;");
       result = NPP_Write(instance, stream, offset, len, buffer);
       ExitCodeResource();
       return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int32 Private_WriteReady ( NPP  instance,
NPStream stream 
)

Definition at line 422 of file npmac.cpp.

{
       int32 result;
       EnterCodeResource();
       PLUGINDEBUGSTR("\pWriteReady;g;");
       result = NPP_WriteReady(instance, stream);
       ExitCodeResource();
       return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void SetUpQD ( void  )

Definition at line 525 of file npmac.cpp.

{
       ProcessSerialNumber PSN;
       FSSpec                      myFSSpec;
       Str63                       name;
       ProcessInfoRec              infoRec;
       OSErr                       result = noErr;
       CFragConnectionID    connID;
       Str255                             errName;
       
       //
       // Memorize the pluginıs resource file 
       // refnum for later use.
       //
       gResFile = CurResFile();
       
#if !TARGET_API_MAC_CARBON
       //
       // Ask the system if CFM is available.
       //
       long response;
       OSErr err = Gestalt(gestaltCFMAttr, &response);
       Boolean hasCFM = BitTst(&response, 31-gestaltCFMPresent);
                     
       if (hasCFM)
       {
              //
              // GetProcessInformation takes a process serial number and 
              // will give us back the name and FSSpec of the application.
              // See the Process Manager in IM.
              //
              infoRec.processInfoLength = sizeof(ProcessInfoRec);
              infoRec.processName = name;
              infoRec.processAppSpec = &myFSSpec;
              
              PSN.highLongOfPSN = 0;
              PSN.lowLongOfPSN = kCurrentProcess;
              
              result = GetProcessInformation(&PSN, &infoRec);
              if (result != noErr)
                     PLUGINDEBUGSTR("\pFailed in GetProcessInformation");
              }
       else
              //
              // If no CFM installed, assume it must be a 68K app.
              //
              result = -1;         
              
       if (result == noErr)
       {
              //
              // Now that we know the app name and FSSpec, we can call GetDiskFragment
              // to get a connID to use in a subsequent call to FindSymbol (it will also
              // return the address of ³main² in app, which we ignore).  If GetDiskFragment 
              // returns an error, we assume the app must be 68K.
              //
              Ptr mainAddr;        
              result =  GetDiskFragment(infoRec.processAppSpec, 0L, 0L, infoRec.processName,
                                                          kReferenceCFrag, &connID, (Ptr*)&mainAddr, errName);
       }

       if (result == noErr) 
       {
              //
              // The app is a PPC code fragment, so call FindSymbol
              // to get the exported ³qd² symbol so we can access its
              // QuickDraw globals.
              //
              CFragSymbolClass symClass;
              result = FindSymbol(connID, "\pqd", (Ptr*)&gQDPtr, &symClass);
              if (result != noErr)
                     PLUGINDEBUGSTR("\pFailed in FindSymbol qd");
       }
       else
       {
              //
              // The app is 68K, so use its A5 to compute the address
              // of its QuickDraw globals.
              //
              gQDPtr = (QDGlobals*)(*((long*)SetCurrentA5()) - (sizeof(QDGlobals) - sizeof(GrafPtr)));
       }
#endif /* !TARGET_API_MAC_CARBON */
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

Definition at line 140 of file npmac.cpp.

QDGlobals* gQDPtr

Definition at line 136 of file npmac.cpp.

short gResFile

Definition at line 139 of file npmac.cpp.

RoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, main)

Definition at line 616 of file npmac.cpp.