navienginebsp/tools/testreference/lauterbach/configdialog.cmm
changeset 0 5de814552237
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/navienginebsp/tools/testreference/lauterbach/configdialog.cmm	Tue Sep 28 18:00:05 2010 +0100
@@ -0,0 +1,846 @@
+//
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:  
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This script will display a dialog box to the user that is the central point
+// for configuring the path of the ROM image that is to be loaded onto the
+// different boards supported by the Symbian T32 scripts.  It is also used to
+// select the current target board.  Once this has been done, all operations
+// such as attaching, loading etc. will be performed on that board, according
+// to the settings saved by this script.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//
+// 1) load current environment into temporary variables
+//        if environment not set, take defaults
+// 2) initialise dialog with current environment
+//        ... dialog runs at this point ...
+// 3) when dialog exits, update current environment
+//
+
+; Declare the global variables used by the system and read the current config into them
+do globals.cmm
+
+GLOBAL &platformList
+GLOBAL &ConfigDialogOpen
+&ConfigDialogOpen="false"
+
+// I'm saving this as a global for now so that I can change the default extension for testing...
+GLOBAL &defaultExt
+&defaultExt="*.bin;*.img"
+
+&currentConfigFile="currentconfig.cmm"
+
+global &dialogMode
+
+gosub LoadPlatformFromFile "currentconfig.cmm"
+
+// Stop command prevents script from exiting before user has pressed anything...
+stop
+
+enddo
+
+//=============================================================================
+// Dialog Box Definition
+//=============================================================================
+OpenDialog:
+
+	gosub GeneratePlatformList
+	//print "Setting platform list to " "&platformList"
+	do sourcepaths.cmm
+
+	dialog
+(&
+		header "Current Configuration"
+
+//*****************************Definition***************************************
+
+		//---------- Platform ----------
+		pos 1. 0. 9.
+		text "Target Board"
+		pos 1. 1. 25. 1.
+PLATFORM: PULLDOWN "&platformList" "gosub LoadPlatformFromFile"
+
+		//---------- Platform Defaults Box ----------
+		pos 27. 0. 17. 3.
+		box "Target Board Defaults"
+
+			//---------- Defaults Button ----------
+			pos 28. 1. 7. 1.
+			BUTTON "Reload"
+			(
+				gosub LoadPlatformFromFile
+			)
+
+			//---------- Save As Defaults Button ----------
+			pos 36. 1. 7. 1.
+			BUTTON "Save"
+			(
+				gosub SavePlatform
+			)
+
+
+		//---------- Custom Config Box ----------
+		pos 45. 0. 19. 3.
+		box "Custom Config"
+
+			//---------- Load Button ----------
+			pos 46. 1. 8. 1.
+			BUTTON "Load..."
+			(
+				dialog.file "*.cmm"
+				entry &fileName
+
+				if "&fileName"!=""
+					(
+					gosub LoadPlatformFromFile &fileName
+					)
+			)
+
+			//---------- Save Button ----------
+			pos 55. 1. 8. 1.
+			BUTTON "Save As..."
+			(
+				dialog.filew "*.cmm"
+				entry &fileName
+				if ("&fileName"!="")
+				(
+					gosub SavePlatformToFile &fileName
+				)
+			)
+
+		//---------- Source Paths and Autoload Module ----------
+		pos 0. 2. 75. 4.
+		box "Source Paths and Autoload Module"
+
+		//---------- Source Paths ----------
+		pos 1. 3. 12. 1.
+		text "Source Paths"
+		pos 20. 3. 7. 1.
+LIST_SOURCEPATHS: BUTTON "List" "gosub ListSourcePaths"
+		pos 28. 3. 7.
+EDIT_SOURCEPATHS:	BUTTON "Edit" "gosub EditSourcePath"
+		pos 36. 3. 7. 1.
+RELOAD_SOURCEPATHS: BUTTON "Reload" "gosub ReloadSourcePaths"
+		pos 44. 3. 7
+DEFAULT_SOURCEPATHS: BUTTON "Default" "gosub DefaultSourcePaths"
+		pos 52. 3. 7
+SAVE_SOURCEPATHS: BUTTON "Save" "gosub SaveSourcePaths"
+
+		//---------- Autoload Module ----------
+		pos 1. 4. 15.
+		text "Autoload Module"
+		pos 20. 4. 54. 1.
+AUTOLOAD_MODULE: EDIT "" ""
+
+		//-------- RAM Image -------
+		pos 0. 6. 90. 10.
+		box "RAM Images"
+		pos 1. 7. 15. 1.
+		text "Load Address 1"
+		pos 20. 7. 20. 1.
+RAMADDR1:        EDIT "" ""
+		pos 1. 8. 15. 1.
+		text "Filename 1"
+		pos 20. 8. 65. 1.
+RAMIMAGE1:        EDIT "" ""
+		pos 86. 8. 3.
+		BUTTON "..."
+		(
+			gosub GetImageFromUser RAMIMAGE1
+		)
+
+		pos 1. 9. 15. 1.
+		text "Load Address 2"
+		pos 20. 9. 20. 1.
+RAMADDR2:        EDIT "" ""
+		pos 1. 10. 15. 1.
+		text "Filename 2"
+		pos 20. 10. 65. 1.
+RAMIMAGE2:        EDIT "" ""
+		pos 86. 10. 3.
+		BUTTON "..."
+		(
+			gosub GetImageFromUser RAMIMAGE2
+		)
+
+		pos 1. 11. 15. 1.
+		text "Load Address 3"
+		pos 20. 11. 20. 1.
+RAMADDR3:        EDIT "" ""
+		pos 1. 12. 15. 1.
+		text "Filename 3"
+		pos 20. 12. 65. 1.
+RAMIMAGE3:        EDIT "" ""
+		pos 86. 12. 3.
+		BUTTON "..."
+		(
+			gosub GetImageFromUser RAMIMAGE3
+		)
+
+		pos 1. 13. 15. 1.
+		text "Load Address 4"
+		pos 20. 13. 20. 1.
+RAMADDR4:        EDIT "" ""
+		pos 1. 14. 15. 1.
+		text "Filename 4"
+		pos 20. 14. 65. 1.
+RAMIMAGE4:        EDIT "" ""
+		pos 86. 14. 3.
+		BUTTON "..."
+		(
+			gosub GetImageFromUser RAMIMAGE4
+		)
+
+		//-------- NOR Flash Image -------
+		pos 0. 15. 90. 5.
+		box "NOR Flash Image"
+		pos 1. 16. 15. 1.
+		text "Load Address"
+		pos 20. 16. 20. 1.
+FLASHADDR:        EDIT "" ""
+		pos 1. 17. 15. 1.
+		text "Filename"
+		pos 20. 17. 65. 1.
+FLASHIMAGE:        EDIT "" ""
+		pos 86. 17. 3.
+GETFLASHIMAGE:		BUTTON "..."
+		(
+			gosub GetImageFromUser FLASHIMAGE
+		)
+		pos 1. 18. 19. 1.
+		text "Warning Dialogs"
+		pos 20. 18. 10. 1.
+FLASHWRITEPROTECT:	CHECKBOX "Flash Write"
+		(
+			print "Write Prot: &FlashWriteProtect"
+		)
+		pos 35. 18. 10. 1.
+FLASHERASEPROTECT:	CHECKBOX "Flash Erase"
+		(
+			print "Erase Prot: &FlashEraseProtect"
+		)
+
+
+		//---------- Bottom Row of Buttons ----------
+		//---------- OK Button ----------
+		pos 1. 20. 6.
+		DEFBUTTON "OK"
+		(
+			gosub CloseDialog save
+			continue
+		)
+
+		//---------- Cancel Button ----------
+		pos 8. 20. 10.
+		BUTTON "Cancel"
+		(
+			; Reload the current config from disk
+			do currentconfig.cmm
+
+			; Close the dialog and reset the symbolics sourcepath
+			gosub CloseDialog
+			continue
+		)
+
+		//---------- Advanced/Basic Button ----------
+		pos 65. 20. 11.
+ADV_BASIC: BUTTON "Toggle Advanced" "gosub ToggleDialogMode"
+)
+
+	; Set a flag to indicate that the dialig is open, seeing that there doesn't seem to be
+	; a way of querying T32 about it
+	&ConfigDialogOpen="true"
+
+	; Initialise any dialog controls that were not filled in automatically when creating the
+	; dialog and enable or disable the advanced ones as appropriate
+	gosub SetupDialogDefaults
+
+	RETURN
+
+//==============================================================================
+LoadPlatformFromFile:
+	ENTRY &fileName
+	LOCAL &platform
+
+	; Load the platform configuration from the filename passed in, if any
+	if "&fileName"!=""
+		(
+		if os.file(&fileName)
+			(
+			do &fileName
+			)
+		)
+	else
+		(
+		; Otherwise see what the currently selected platform is in the platforms drop down and load its configuration
+		&platform=dialog.string(PLATFORM)
+		if os.file(&PlatformsDir\&platform\&UserConfigCmm)
+			(
+			do &PlatformsDir\&platform\&UserConfigCmm
+			)
+		else
+			(
+			print "No platform specific user config defined; using blank defaults"
+			&Platform="&platform"
+			&RamImage=""
+			&RamAddr="0"
+			&RamImage1=""
+			&RamAddr1="0"
+			&RamImage2=""
+			&RamAddr2="0"
+			&RamImage3=""
+			&RamAddr3="0"
+			&RamImage4=""
+			&RamAddr4="0"
+			)
+		)
+
+	; And re-open the dialog so that it displays the newly loaded configuration
+	gosub CloseDialog
+	gosub OpenDialog
+
+	return
+
+//==============================================================================
+SetAdvancedDialogOptions:
+
+	dialog.enable LIST_SOURCEPATHS
+	dialog.enable EDIT_SOURCEPATHS
+	dialog.enable RELOAD_SOURCEPATHS
+	dialog.enable DEFAULT_SOURCEPATHS
+	dialog.enable SAVE_SOURCEPATHS
+	dialog.enable AUTOLOAD_MODULE
+	dialog.enable RAMADDR1
+	dialog.enable RAMADDR2
+	dialog.enable RAMADDR3
+	dialog.enable RAMADDR4
+	dialog.enable FLASHADDR
+	dialog.enable FLASHIMAGE
+	dialog.enable GETFLASHIMAGE
+	dialog.enable FLASHWRITEPROTECT
+	dialog.enable FLASHERASEPROTECT
+	&dialogMode="advanced"
+
+	return
+
+//==============================================================================
+SetBasicDialogOptions:
+
+	dialog.disable LIST_SOURCEPATHS
+	dialog.disable EDIT_SOURCEPATHS
+	dialog.disable RELOAD_SOURCEPATHS
+	dialog.disable DEFAULT_SOURCEPATHS
+	dialog.disable SAVE_SOURCEPATHS
+	dialog.disable AUTOLOAD_MODULE
+	dialog.disable RAMADDR1
+	dialog.disable RAMADDR2
+	dialog.disable RAMADDR3
+	dialog.disable RAMADDR4
+	dialog.disable FLASHADDR
+	dialog.disable FLASHIMAGE
+	dialog.disable GETFLASHIMAGE
+	dialog.disable FLASHWRITEPROTECT
+	dialog.disable FLASHERASEPROTECT
+	&dialogMode="basic"
+
+	return
+
+/==============================================================================
+ToggleDialogMode:
+
+	if ("&dialogMode"=="advanced")
+		(
+		gosub SetBasicDialogOptions
+		)
+	else
+		(
+		gosub SetAdvancedDialogOptions
+		)
+
+	return
+
+//==============================================================================
+CloseDialog:
+	ENTRY &save
+
+	if ("&save"=="save")
+		(
+		; Read the dialog controls that might have changed and save the configuration to disk
+		gosub ReadDialog
+		gosub SavePlatformToFile "&currentConfigFile"
+		do PrintConfig.cmm
+		)
+
+	; This function can be called safely even if the dialog is not open.  To allow this we must
+	; manually keep track of whether the dialog is open, as T32 will give an error if you try to
+	; close a dialog that is not open
+	if "&ConfigDialogOpen"!="false"
+		(
+		&ConfigDialogOpen="false"
+		dialog.end
+		)
+
+	return
+
+//==============================================================================
+SetupDialogDefaults:
+
+	; Display or hide the advanced controls according to the user's preference
+	if ("&dialogMode"=="advanced")
+		(
+		gosub SetAdvancedDialogOptions
+		)
+	else
+		(
+		gosub SetBasicDialogOptions
+		)
+
+	; And initialise any not yet initialised controls to their default
+	dialog.set PLATFORM				"&Platform"
+	dialog.set AUTOLOAD_MODULE		"&AutoloadModule"
+	dialog.set RAMADDR1				"&RamAddr1"
+	dialog.set RAMIMAGE1			"&RamImage1"
+	dialog.set RAMADDR2				"&RamAddr2"
+	dialog.set RAMIMAGE2			"&RamImage2"
+	dialog.set RAMADDR3				"&RamAddr3"
+	dialog.set RAMIMAGE3			"&RamImage3"
+	dialog.set RAMADDR4				"&RamAddr4"
+	dialog.set RAMIMAGE4			"&RamImage4"
+	dialog.set FLASHADDR			"&FlashAddr"
+	dialog.set FLASHIMAGE			"&FlashImage"
+	dialog.set FLASHERASEPROTECT	"&FlashEraseProtect"
+	dialog.set FLASHWRITEPROTECT	"&FlashWriteProtect"
+	
+
+	return
+
+//==============================================================================
+ReadDialog:
+
+	// Read dialog box config into global environment variables
+	&Platform=dialog.string(PLATFORM)
+	&AutoloadModule=dialog.string(AUTOLOAD_MODULE)
+	&RamImage1=dialog.string(RAMIMAGE1)
+	&RamAddr1=dialog.string(RAMADDR1)
+	&RamImage2=dialog.string(RAMIMAGE2)
+	&RamAddr2=dialog.string(RAMADDR2)
+	&RamImage3=dialog.string(RAMIMAGE3)
+	&RamAddr3=dialog.string(RAMADDR3)
+	&RamImage4=dialog.string(RAMIMAGE4)
+	&RamAddr4=dialog.string(RAMADDR4)
+	&FlashAddr=dialog.string(FLASHADDR)
+	&FlashImage=dialog.string(FLASHIMAGE)
+
+	if "&RamImage"==""
+	(
+		&RamImage="&RamImage1"
+		&RamAddr="&RamAddr1"
+	)
+	&FlashEraseProtect=dialog.boolean(FLASHERASEPROTECT)
+	if dialog.boolean(FLASHERASEPROTECT)==(0==0)
+	(
+		&FlashEraseProtect="ON"
+	)
+	else
+	(
+		&FlashEraseProtect="OFF"
+	)
+
+	&FlashWriteProtect=dialog.boolean(FLASHWRITEPROTECT)
+	if dialog.boolean(FLASHWRITEPROTECT)==(0==0)
+	(
+		&FlashWriteProtect="ON"
+	)
+	else
+	(
+		&FlashWriteProtect="OFF"
+	)
+
+	; Make sure that target addresses have been specified and if not, use a sensible default that will
+	; work on at least some platforms
+	if ("&RamAddr1"=="")
+	(
+		&RamAddr1="0x80000000"
+	)
+
+	if ("&RamAddr2"=="")
+	(
+		&RamAddr2="0x80000000"
+	)
+
+	if ("&RamAddr3"=="")
+	(
+		&RamAddr3="0x80000000"
+	)
+
+	if ("&RamAddr4"=="")
+	(
+		&RamAddr4="0x80000000"
+	)
+
+	if ("&FlashAddr"=="")
+	(
+		&FlashAddr="0"
+	)
+
+	return
+
+//==============================================================================
+SavePlatformToFile:
+	ENTRY &filename
+
+	gosub ReadDialog
+
+	// Open the config file for writing
+	open #1 &filename /Create
+
+	// Write the config to the file in script format for loading later
+	write #1 "&"+"Platform="+'"'+"&Platform"+'"'
+	write #1 "&"+"AutoloadModule="+'"'+"&AutoloadModule"+'"'
+	write #1 "&"+"RamAddr="+'"'+"&RamAddr"+'"'
+	write #1 "&"+"RamImage="+'"'+"&RamImage"+'"'
+	write #1 "&"+"RamAddr1="+'"'+"&RamAddr1"+'"'
+	write #1 "&"+"RamImage1="+'"'+"&RamImage1"+'"'
+	write #1 "&"+"RamAddr2="+'"'+"&RamAddr2"+'"'
+	write #1 "&"+"RamImage2="+'"'+"&RamImage2"+'"'
+	write #1 "&"+"RamAddr3="+'"'+"&RamAddr3"+'"'
+	write #1 "&"+"RamImage3="+'"'+"&RamImage3"+'"'
+	write #1 "&"+"RamAddr4="+'"'+"&RamAddr4"+'"'
+	write #1 "&"+"RamImage4="+'"'+"&RamImage4"+'"'
+	write #1 "&"+"FlashAddr="+'"'+"&FlashAddr"+'"'
+	write #1 "&"+"FlashImage="+'"'+"&FlashImage"+'"'
+	write #1 "&"+"FlashWriteProtect="+'"'+"&FlashWriteProtect"+'"'
+	write #1 "&"+"FlashEraseProtect="+'"'+"&FlashEraseProtect"+'"'
+
+	// All done, so close the file
+	close #1
+
+	// Do any tidyup
+	// type &filename
+
+	RETURN
+
+
+//==============================================================================
+SavePlatform:
+
+	//gosub PrintSeperator
+	//print "saving platform "+dialog.string(PLATFORM)
+
+	// Open the config file for writing
+	&filename="&PlatformsDir\"+dialog.string(PLATFORM)+"\&UserConfigCmm"
+
+	print "Saving platform to &filename"
+	gosub SavePlatformToFile &filename
+	RETURN
+
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// GeneratePlatformList
+//
+// Generate the list of platforms from a directory listing of the platforms
+// script dir.
+//
+//////////////////////////////////////////////////////////////////////////////
+GeneratePlatformList:
+	LOCAL &data
+	LOCAL &dirList
+	LOCAL &blanks
+
+	&filename="&TMPDIR\platformList.txt"
+	prt.file &filename
+	winprint.dir &PlatformsDir
+
+	&blanks=0
+	open #1 &filename /Read
+
+	// discard first line as it is the header & directory name
+	READ #1 %line &data
+
+	// read the file line at a time, process it and add directory entries to the list of supported platforms
+	RePeaT
+	(
+		READ #1 %line &data
+
+		; Okay, this is because there isn't a way of the read returning EOF
+		; the easiest solution is to count the number of blank lines and if
+		; it crosses a threshold assume that the end was reached.
+		if "&data"==""
+			(
+			&blanks=&blanks+1
+			if &blanks>10
+				(
+				goto endloop
+				)
+			)
+
+		// Remove all dots
+		gosub ReplaceAll "&data" "." ""
+		entry &tmp
+		&data=&tmp
+
+		// Replace multiple spaces with one space
+		gosub ReplaceAll "&data" "  " " "
+		entry &tmp
+		&data=&tmp
+
+		// Remove leading spaces
+		gosub RemoveLeadingChars "&data" " "
+		entry &tmp
+		&data=&tmp
+
+		// Replace all spaces with a comma
+		gosub ReplaceAll "&data" " " ","
+		entry &tmp
+		&data=&tmp
+
+		if ("&dirList"=="")
+		(
+			&dirList="&data"
+		)
+		else
+		(
+			&dirList="&dirList,&data"
+		)
+	)
+endloop: CLOSE #1
+
+	&platformList="&dirList"
+
+	RETURN
+
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//
+//
+//////////////////////////////////////////////////////////////////////////////
+RemoveLeadingChars:
+	LOCAL &inStr &removeStr &pos1 &pos2 &outStr
+	ENTRY &inStr &removeStr
+
+//	print "REMOVE: &inStr &removeStr"
+
+	&pos1=string.scan(&inStr,&removeStr,0)
+//	print "pos1=&pos1"
+
+	if (&pos1==0)
+	(
+//		print "found!!!!!!!!"
+
+		&len1=string.len(&inStr)
+		&len2=string.len(&removeStr)
+
+//		print "len1=&len1"
+//		print "len2=&len2"
+
+		&start=string.mid("&inStr",0,&pos1+1)
+		&end=string.mid("&inStr",&pos1+&len2+1,&len1)
+
+//		print "start : &start"
+//		print "end   : &end"
+
+		&outStr="&start&end"
+//		print "outStr: &outStr"
+	)
+	else
+	(
+		&outStr="&inStr"
+
+	)
+	return &outStr
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// ReplaceAll
+//
+// Repeatedly call ReplaceInString to replace all occurrences of a given
+// string (removeStr) with the new string (removeStr).
+//
+// Parameters:
+//	&inStr		    original string where replacements should be made
+//  &removeStr      string to remove
+//  &replaceStr     string to add in replacement for &removeStr
+//
+// Returns:
+//  string, in quotes.  These quotes have to be stripped off to make the
+//  returned string useful.
+//
+// Example usage:
+//
+//      &spaceStr="1 2 3 4 5 6 7 8 9"
+//	    gosub ReplaceAll "&spaceStr" " " ","
+//	    entry &retStr              // this string has extra quotes
+//	    &commaStr=&retStr          // this strips the extra quotes from the string
+//
+// The expected output will be:
+//    "1,2,3,4,5,6,7,8,9"
+//
+//////////////////////////////////////////////////////////////////////////////
+ReplaceAll:
+	ENTRY &inStr &removeStr &replaceStr
+
+	LOCAL &ret
+
+	repeat
+	(
+		gosub ReplaceInString &inStr &removeStr &replaceStr
+		entry &ret
+
+		if (&inStr==&ret)
+		(
+			goto allreplaced
+		)
+		&inStr="&ret"
+	)
+allreplaced:
+	return &inStr
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// ReplaceInString
+//
+// Within a given string (inStr), replace a single instance of a
+// string (removeStr) with a new string (replaceStr).
+//
+// Parameters:
+//	&inStr		    original string where replacements should be made
+//  &removeStr      string to remove
+//  &replaceStr     string to add in replacement for &removeStr
+//
+// Returns:
+//  string, in quotes.  These quotes have to be stripped off to make the
+//  returned string useful.
+//
+// Example usage:
+//      &spaceStr="1 2 3 4 5 6 7 8 9"
+//		gosub ReplaceInString &spaceStr " " ","
+//		entry &ret
+//		&commaStr=&ret
+//
+// The expected output will be:
+//    "1,2 3 4 5 6 7 8 9"
+//
+//////////////////////////////////////////////////////////////////////////////
+ReplaceInString:
+	LOCAL &inStr &removeStr &pos1 &pos2 &outStr
+	ENTRY &inStr &removeStr &replaceStr
+
+	&pos1=string.scan(&inStr,&removeStr,0)
+
+	if (&pos1==-1)
+	(
+		&outStr="&inStr"
+	)
+	else
+	(
+		&len1=string.len(&inStr)
+		&len2=string.len(&removeStr)
+
+		&start=string.mid("&inStr",0,&pos1+1)
+		&middle=string.mid("&inStr",&pos1+1,&pos1+1+&len2)
+		&end=string.mid("&inStr",&pos1+&len2+1,&len1)
+
+		&outStr="&start"+&replaceStr+"&end"
+	)
+	return &outStr
+
+
+//==============================================================================
+GetImageFromUser:
+	ENTRY &dialogElement
+
+	LOCAL &tmpRamImg
+	LOCAL &tmp1
+	LOCAL &tmpfile
+
+	&tmpRamImg=dialog.string(&dialogElement)
+
+	&tmp1=os.file.path("&tmpRamImg")+"\"+"&defaultExt"
+
+	dialog.file "&tmp1"
+	entry &tmpfile
+	if ("&tmpfile"!="")
+	(
+		&tmpRamImg="&tmpfile"
+
+		dialog.set &dialogElement "&tmpRamImg"
+	)
+	return
+
+//==============================================================================
+ListSourcePaths:
+	symbol.sourcepath.list
+	return
+
+//==============================================================================
+ReloadSourcePaths:
+	do sourcepaths.cmm
+	return
+
+//==============================================================================
+EditSourcePath:
+
+	if os.file("&PlatformsDir\&Platform\customsourcepaths.cmm")
+		(
+		print "Editing custom source paths"
+		)
+	else
+		(
+		if os.file("&PlatformsDir\&Platform\defaultsourcepaths.cmm")
+			(
+			print "No custom source paths defined for this platform. Creating from default source paths."
+			copy &PlatformsDir\&Platform\defaultsourcepaths.cmm &PlatformsDir\&Platform\customsourcepaths.cmm
+
+			// without this delay, the user gets prompted to reload the file
+			wait 0.5s
+			)
+		)
+	edit &PlatformsDir\&Platform\customsourcepaths.cmm
+	return
+
+//==============================================================================
+DefaultSourcePaths:
+	if os.file("&PlatformsDir\&Platform\customsourcepaths.cmm")
+		(
+		print "Removing custom source paths"
+		del &PlatformsDir\&Platform\customsourcepaths.cmm
+		)
+	else
+		(
+		print "Already using default source paths, nothing to do..."
+		)
+	return
+
+//==============================================================================
+SaveSourcePaths:
+	print "Saving custom source paths to file &PlatformsDir\&Platform\customsourcepaths.cmm"
+	store &PlatformsDir\&Platform\customsourcepaths.cmm SPATH
+	return
+