*** /dev/null Sat Nov 23 05:03:15 2024
--- - Sat Nov 23 05:04:05 2024
***************
*** 0 ****
--- 1,485 ----
+ #!/usr/local/bin/perl
+
+ # This script modifies C code to use the hijacked NSPR routines that are
+ # now baked into the JavaScript engine rather than using the NSPR
+ # routines that they were based on, i.e. types like PRArenaPool are changed
+ # to JSArenaPool.
+ #
+ # This script was used in 9/98 to facilitate the incorporation of some NSPR
+ # code into the JS engine so as to minimize dependency on NSPR.
+ #
+
+ # Command-line: jsify.pl [options] [filename]*
+ #
+ # Options:
+ # -r Reverse direction of transformation, i.e. JS ==> NSPR2
+ # -outdir Directory in which to place output files
+
+
+ # NSPR2 symbols that will be modified to JS symbols, e.g.
+ # PRArena <==> JSArena
+
+ @NSPR_symbols = (
+ "PRArena",
+ "PRArenaPool",
+ "PRArenaStats",
+ "PR_ARENAMETER",
+ "PR_ARENA_",
+ "PR_ARENA_ALIGN",
+ "PR_ARENA_ALLOCATE",
+ "PR_ARENA_CONST_ALIGN_MASK",
+ "PR_ARENA_DEFAULT_ALIGN",
+ "PR_ARENA_DESTROY",
+ "PR_ARENA_GROW",
+ "PR_ARENA_MARK",
+ "PR_ARENA_RELEASE",
+
+ "PR_smprintf",
+ "PR_smprintf_free",
+ "PR_snprintf",
+ "PR_sprintf_append",
+ "PR_sscanf",
+ "PR_sxprintf",
+ "PR_vsmprintf",
+ "PR_vsnprintf",
+ "PR_vsprintf_append",
+ "PR_vsxprintf",
+
+ "PRCList",
+ "PRCListStr",
+ "PRCLists",
+
+ "PRDestroyEventProc",
+ "PREvent",
+ "PREventFunProc",
+ "PREventQueue",
+ "PRHandleEventProc",
+ "PR_PostEvent",
+ "PR_PostSynchronousEvent",
+ "PR_ProcessPendingEvents",
+ "PR_CreateEventQueue",
+ "PR_DequeueEvent",
+ "PR_DestroyEvent",
+ "PR_DestroyEventQueue",
+ "PR_EventAvailable",
+ "PR_EventLoop",
+ "PR_GetEvent",
+ "PR_GetEventOwner",
+ "PR_GetEventQueueMonitor",
+ "PR_GetEventQueueSelectFD",
+ "PR_GetMainEventQueue",
+ "PR_HandleEvent",
+ "PR_InitEvent",
+ "PR_ENTER_EVENT_QUEUE_MONITOR",
+ "PR_EXIT_EVENT_QUEUE_MONITOR",
+ "PR_MapEvents",
+ "PR_RevokeEvents",
+
+ "PR_cnvtf",
+ "PR_dtoa",
+ "PR_strtod",
+
+ "PRFileDesc",
+
+ "PR_HASH_BITS",
+ "PR_GOLDEN_RATIO",
+ "PRHashAllocOps",
+ "PRHashComparator",
+ "PRHashEntry",
+ "PRHashEnumerator",
+ "PRHashFunction",
+ "PRHashNumber",
+ "PRHashTable",
+ "PR_HashString",
+ "PR_HashTableAdd",
+ "PR_HashTableDestroy",
+ "PR_HashTableDump",
+ "PR_HashTableEnumerateEntries",
+ "PR_HashTableLookup",
+ "PR_HashTableRawAdd",
+ "PR_HashTableRawLookup",
+ "PR_HashTableRawRemove",
+ "PR_HashTableRemove",
+
+ "PRBool",
+ "PRFloat64",
+ "PRInt16",
+ "PRInt32",
+ "PRInt64",
+ "PRInt8",
+ "PRIntn",
+ "PRUint16",
+ "PRUint32",
+ "PRUint64",
+ "PRUint8",
+ "PRUintn",
+ "PRPtrDiff",
+ "PRPtrdiff",
+ "PRUptrdiff",
+ "PRUword",
+ "PRWord",
+ "PRPackedBool",
+ "PRSize",
+ "PRStatus",
+ "pruword",
+ "prword",
+ "prword_t",
+
+ "PR_ALIGN_OF_DOUBLE",
+ "PR_ALIGN_OF_FLOAT",
+ "PR_ALIGN_OF_INT",
+ "PR_ALIGN_OF_INT64",
+ "PR_ALIGN_OF_LONG",
+ "PR_ALIGN_OF_POINTER",
+ "PR_ALIGN_OF_SHORT",
+ "PR_ALIGN_OF_WORD",
+ "PR_BITS_PER_BYTE",
+ "PR_BITS_PER_BYTE_LOG2",
+ "PR_BITS_PER_DOUBLE",
+ "PR_BITS_PER_DOUBLE_LOG2",
+ "PR_BITS_PER_FLOAT",
+ "PR_BITS_PER_FLOAT_LOG2",
+ "PR_BITS_PER_INT",
+ "PR_BITS_PER_INT64",
+ "PR_BITS_PER_INT64_LOG2",
+ "PR_BITS_PER_INT_LOG2",
+ "PR_BITS_PER_LONG",
+ "PR_BITS_PER_LONG_LOG2",
+ "PR_BITS_PER_SHORT",
+ "PR_BITS_PER_SHORT_LOG2",
+ "PR_BITS_PER_WORD",
+ "PR_BITS_PER_WORD_LOG2",
+ "PR_BYTES_PER_BYTE",
+ "PR_BYTES_PER_DOUBLE",
+ "PR_BYTES_PER_DWORD",
+ "PR_BYTES_PER_DWORD_LOG2",
+ "PR_BYTES_PER_FLOAT",
+ "PR_BYTES_PER_INT",
+ "PR_BYTES_PER_INT64",
+ "PR_BYTES_PER_LONG",
+ "PR_BYTES_PER_SHORT",
+ "PR_BYTES_PER_WORD",
+ "PR_BYTES_PER_WORD_LOG2",
+
+ "PRSegment",
+ "PRSegmentAccess",
+ "PRStuffFunc",
+ "PRThread",
+
+ "PR_APPEND_LINK",
+
+ "PR_ASSERT",
+
+ "PR_ATOMIC_DWORD_LOAD",
+ "PR_ATOMIC_DWORD_STORE",
+
+ "PR_Abort",
+
+ "PR_ArenaAllocate",
+ "PR_ArenaCountAllocation",
+ "PR_ArenaCountGrowth",
+ "PR_ArenaCountInplaceGrowth",
+ "PR_ArenaCountRelease",
+ "PR_ArenaCountRetract",
+ "PR_ArenaFinish",
+ "PR_ArenaGrow",
+ "PR_ArenaRelease",
+ "PR_CompactArenaPool",
+ "PR_DumpArenaStats",
+ "PR_FinishArenaPool",
+ "PR_FreeArenaPool",
+ "PR_InitArenaPool",
+
+ "PR_Assert",
+
+ "PR_AttachThread",
+
+ "PR_BEGIN_EXTERN_C",
+ "PR_BEGIN_MACRO",
+
+ "PR_BIT",
+ "PR_BITMASK",
+
+ "PR_BUFFER_OVERFLOW_ERROR",
+
+ "PR_CALLBACK",
+ "PR_CALLBACK_DECL",
+ "PR_CALLOC",
+ "PR_CEILING_LOG2",
+ "PR_CLEAR_ARENA",
+ "PR_CLEAR_BIT",
+ "PR_CLEAR_UNUSED",
+ "PR_CLIST_IS_EMPTY",
+ "PR_COUNT_ARENA",
+ "PR_CURRENT_THREAD",
+
+ "PR_GetSegmentAccess",
+ "PR_GetSegmentSize",
+ "PR_GetSegmentVaddr",
+ "PR_GrowSegment",
+ "PR_DestroySegment",
+ "PR_MapSegment",
+ "PR_NewSegment",
+ "PR_Segment",
+ "PR_Seg",
+ "PR_SEGMENT_NONE",
+ "PR_SEGMENT_RDONLY",
+ "PR_SEGMENT_RDWR",
+
+ "PR_Calloc",
+ "PR_CeilingLog2",
+ "PR_CompareStrings",
+ "PR_CompareValues",
+ "PR_DELETE",
+ "PR_END_EXTERN_C",
+ "PR_END_MACRO",
+ "PR_ENUMERATE_STOP",
+ "PR_FAILURE",
+ "PR_FALSE",
+ "PR_FLOOR_LOG2",
+ "PR_FREEIF",
+ "PR_FREE_PATTERN",
+ "PR_FloorLog2",
+ "PR_FormatTime",
+ "PR_Free",
+
+ "PR_GetEnv",
+ "PR_GetError",
+ "PR_INIT_ARENA_POOL",
+ "PR_INIT_CLIST",
+ "PR_INIT_STATIC_CLIST",
+ "PR_INLINE",
+ "PR_INSERT_AFTER",
+ "PR_INSERT_BEFORE",
+ "PR_INSERT_LINK",
+ "PR_INT32",
+ "PR_INTERVAL_NO_TIMEOUT",
+ "PR_INTERVAL_NO_WAIT",
+ "PR_Init",
+ "PR_LIST_HEAD",
+ "PR_LIST_TAIL",
+ "PR_LOG",
+ "PR_LOGGING",
+ "PR_LOG_ALWAYS",
+ "PR_LOG_BEGIN",
+ "PR_LOG_DEBUG",
+ "PR_LOG_DEFINE",
+ "PR_LOG_END",
+ "PR_LOG_ERROR",
+ "PR_LOG_MAX",
+ "PR_LOG_MIN",
+ "PR_LOG_NONE",
+ "PR_LOG_NOTICE",
+ "PR_LOG_TEST",
+ "PR_LOG_WARN",
+ "PR_LOG_WARNING",
+ "PR_LogFlush",
+ "PR_LogPrint",
+ "PR_MALLOC",
+ "PR_MAX",
+ "PR_MD_calloc",
+ "PR_MD_free",
+ "PR_MD_malloc",
+ "PR_MD_realloc",
+ "PR_MIN",
+ "PR_Malloc",
+ "PR_NEW",
+ "PR_NEWZAP",
+ "PR_NEXT_LINK",
+ "PR_NOT_REACHED",
+ "PR_NewCondVar",
+ "PR_NewHashTable",
+ "PR_NewLogModule",
+ "PR_PREV_LINK",
+ "PR_PUBLIC_API",
+ "PR_PUBLIC_DATA",
+ "PR_RANGE_ERROR",
+ "PR_REALLOC",
+ "PR_REMOVE_AND_INIT_LINK",
+ "PR_REMOVE_LINK",
+ "PR_ROUNDUP",
+ "PR_Realloc",
+
+ "PR_SET_BIT",
+ "PR_STATIC_CALLBACK",
+ "PR_SUCCESS",
+ "PR_SetError",
+ "PR_SetLogBuffering",
+ "PR_SetLogFile",
+
+ "PR_TEST_BIT",
+ "PR_TRUE",
+ "PR_UINT32",
+ "PR_UPTRDIFF",
+
+ "prarena_h___",
+ "prbit_h___",
+ "prclist_h___",
+ "prdtoa_h___",
+ "prlog_h___",
+ "prlong_h___",
+ "prmacos_h___",
+ "prmem_h___",
+ "prprf_h___",
+ "prtypes_h___",
+
+ "prarena",
+ "prbit",
+ "prbitmap_t",
+ "prclist",
+ "prcpucfg",
+ "prdtoa",
+ "prhash",
+ "plhash",
+ "prlong",
+ "prmacos",
+ "prmem",
+ "prosdep",
+ "protypes",
+ "prprf",
+ "prtypes"
+ );
+
+ while ($ARGV[0] =~ /^-/) {
+ if ($ARGV[0] eq "-r") {
+ shift;
+ $reverse_conversion = 1;
+ } elsif ($ARGV[0] eq "-outdir") {
+ shift;
+ $outdir = shift;
+ }
+ }
+
+ # Given an NSPR symbol compute the JS equivalent or
+ # vice-versa
+ sub subst {
+ local ($replacement);
+ local ($sym) = @_;
+
+ $replacement = substr($sym,0,2) eq "pr" ? "js" : "JS";
+ $replacement .= substr($sym, 2);
+ return $replacement;
+ }
+
+ # Build the regular expression that will convert between the NSPR
+ # types and the JS types
+ if ($reverse_conversion) {
+ die "Not implemented yet";
+ } else {
+ foreach $sym (@NSPR_symbols) {
+ $regexp .= $sym . "|"
+ }
+ # Get rid of the last "!"
+ chop $regexp;
+
+ # Replace PR* with JS* and replace pr* with js*
+ $regexp = 's/(^|\\W)(' . $regexp . ')/$1 . &subst($2)/eg';
+ # print $regexp;
+ }
+
+ # Pre-compile a little subroutine to perform the regexp substitution
+ # between NSPR types and JS types
+ eval('sub convert_from_NSPR {($line) = @_; $line =~ ' . $regexp . ';}');
+
+ sub convert_mallocs {
+ ($line) = @_;
+ $line =~ s/PR_MALLOC/malloc/g;
+ $line =~ s/PR_REALLOC/realloc/g;
+ $line =~ s/PR_FREE/free/g;
+ return $line;
+ }
+
+ sub convert_includes {
+ ($line) = @_;
+ if ($line !~ /include/) {
+ return $line;
+ }
+
+ if ($line =~ /prlog\.h/) {
+ $line = '#include "jsutil.h"'. " /* Added by JSIFY */\n";
+ } elsif ($line =~ /plhash\.h/) {
+ $line = '#include "jshash.h"'. " /* Added by JSIFY */\n";
+ } elsif ($line =~ /plarena\.h/) {
+ $line = '#include "jsarena.h"'. " /* Added by JSIFY */\n";
+ } elsif ($line =~ /prmem\.h/) {
+ $line = "";
+ } elsif ($line =~ /jsmsg\.def/) {
+ $line = '#include "js.msg"' . "\n";
+ } elsif ($line =~ /shellmsg\.def/) {
+ $line = '#include "jsshell.msg"' . "\n";
+ } elsif ($line =~ /jsopcode\.def/) {
+ $line = '#include "jsopcode.tbl"' . "\n";
+ }
+ return $line;
+ }
+
+ sub convert_declarations {
+ ($line) = @_;
+ $line =~ s/PR_EXTERN/JS_EXTERN_API/g;
+ $line =~ s/PR_IMPLEMENT_DATA/JS_EXPORT_DATA/g;
+ $line =~ s/PR_IMPLEMENT/JS_EXPORT_API/g;
+ $line =~ s/PR_CALLBACK/JS_DLL_CALLBACK/g;
+ $line =~ s/PR_STATIC_CALLBACK/JS_STATIC_DLL_CALLBACK/g;
+ $line =~ s/PR_IMPORT/JS_IMPORT/g;
+ $line =~ s/PR_PUBLIC_API/JS_EXPORT_API/g;
+ $line =~ s/PR_PUBLIC_DATA/JS_EXPORT_DATA/g;
+ return $line;
+ }
+
+ sub convert_long_long_macros {
+ ($line) = @_;
+ $line =~ s/\b(LL_)/JSLL_/g;
+ return $line;
+ }
+
+ sub convert_asserts {
+ ($line) = @_;
+ $line =~ s/\bPR_ASSERT/JS_ASSERT/g;
+ return $line;
+ }
+
+ while ($#ARGV >= 0) {
+ $infile = shift;
+
+ # Change filename, e.g. prtime.h to jsprtime.h, except for legacy
+ # files that start with 'prmj', like prmjtime.h.
+ $outfile = $infile;
+ if ($infile !~ /^prmj/) {
+ $outfile =~ s/^pr/js/;
+ $outfile =~ s/^pl/js/;
+ }
+
+ if ($outdir) {
+ $outfile = $outdir . '/' . $outfile;
+ }
+
+ if ($infile eq $outfile) {
+ die "Error: refuse to overwrite $outfile, use -outdir option."
+ }
+ die "Can't open $infile" if !open(INFILE, "<$infile");
+ die "Can't open $outfile for writing" if !open(OUTFILE, ">$outfile");
+
+ while (<INFILE>) {
+ $line = $_;
+
+ #Get rid of #include "prlog.h"
+ &convert_includes($line);
+
+ # Rename PR_EXTERN, PR_IMPORT, etc.
+ &convert_declarations($line);
+
+ # Convert from PR_MALLOC to malloc, etc.
+ &convert_mallocs($line);
+
+ # Convert from PR_ASSERT to JS_ASSERT
+ # &convert_asserts($line);
+
+ # Convert from, e.g. PRArena to JSPRArena
+ &convert_from_NSPR($line);
+
+ # Change LL_* macros to JSLL_*
+ &convert_long_long_macros($line);
+
+ print OUTFILE $line;
+ }
+ }
|