Difference between revisions of "Read Note Card Configuration"
Jump to navigation
Jump to search
m (<lsl> tag to <source>) |
|||
(6 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
{{LSL Header}} | |||
Learn how to read configuration files with Linden Scripting Language (LSL) in Second Life (SL). After viewing this tutorial, you will be able to: | Learn how to read configuration files with Linden Scripting Language (LSL) in Second Life (SL). After viewing this tutorial, you will be able to: | ||
Line 23: | Line 24: | ||
# blank lines are ignored as well as lines | # blank lines are ignored as well as lines | ||
# proceeded with a "#" sign. | # proceeded with a "#" sign. | ||
Name = Dedric Mauriac | Name = Dedric Mauriac | ||
Favorite Color = Blue | Favorite Color = Blue | ||
< | <source lang="lsl2"> | ||
string configurationNotecardName = "Application.Config"; | |||
key notecardQueryId; | |||
integer line; | integer line; | ||
string AvatarName; | string AvatarName; | ||
string FavoriteColor; | string FavoriteColor; | ||
Line 37: | Line 37: | ||
init() | init() | ||
{ | { | ||
// reset configuration values to default | |||
AvatarName = "Unknown"; | AvatarName = "Unknown"; | ||
FavoriteColor = "None"; | FavoriteColor = "None"; | ||
// make sure the file exists and is a notecard | |||
if(llGetInventoryType( | if(llGetInventoryType(configurationNotecardName) != INVENTORY_NOTECARD) | ||
{ | { | ||
// notify owner of missing file | |||
llOwnerSay("Missing inventory notecard: " + | llOwnerSay("Missing inventory notecard: " + configurationNotecardName); | ||
// don't do anything else | |||
return; | |||
} | } | ||
// initialize to start reading from first line (which is 0) | |||
line = 0; | line = 0; | ||
notecardQueryId = llGetNotecardLine(configurationNotecardName, line); | |||
} | } | ||
processConfiguration(string data) | processConfiguration(string data) | ||
{ | { | ||
// if we are at the end of the file | |||
if(data == EOF) | if(data == EOF) | ||
{ | { | ||
// notify the owner | |||
llOwnerSay("We are done reading the configuration"); | llOwnerSay("We are done reading the configuration"); | ||
// notify what was read | |||
llOwnerSay("The avatar name is: " + AvatarName); | llOwnerSay("The avatar name is: " + AvatarName); | ||
llOwnerSay("The favorite color is: " + FavoriteColor); | llOwnerSay("The favorite color is: " + FavoriteColor); | ||
// do not do anything else | |||
return; | return; | ||
} | } | ||
// if we are not working with a blank line | |||
if(data != "") | if(data != "") | ||
{ | { | ||
// if the line does not begin with a comment | |||
if(llSubStringIndex(data, "#") != 0) | if(llSubStringIndex(data, "#") != 0) | ||
{ | { | ||
// find first equal sign | |||
integer i = llSubStringIndex(data, "="); | integer i = llSubStringIndex(data, "="); | ||
// if line contains equal sign | |||
if(i != -1) | if(i != -1) | ||
{ | { | ||
// get name of name/value pair | |||
string name = llGetSubString(data, 0, i - 1); | string name = llGetSubString(data, 0, i - 1); | ||
// get value of name/value pair | |||
string value = llGetSubString(data, i + 1, -1); | string value = llGetSubString(data, i + 1, -1); | ||
// trim name | |||
list temp = llParseString2List(name, [" "], []); | list temp = llParseString2List(name, [" "], []); | ||
name = llDumpList2String(temp, " "); | name = llDumpList2String(temp, " "); | ||
// make name lowercase (case insensitive) | |||
name = llToLower(name); | name = llToLower(name); | ||
// trim value | |||
temp = llParseString2List(value, [" "], []); | temp = llParseString2List(value, [" "], []); | ||
value = llDumpList2String(temp, " "); | value = llDumpList2String(temp, " "); | ||
// name | |||
if(name == "name") | if(name == "name") | ||
AvatarName = value; | AvatarName = value; | ||
// color | |||
else if(name == "favorite color") | else if(name == "favorite color") | ||
FavoriteColor = value; | FavoriteColor = value; | ||
// unknown name | |||
else | else | ||
llOwnerSay("Unknown configuration value: " + name + " on line " + (string)line); | llOwnerSay("Unknown configuration value: " + name + " on line " + (string)line); | ||
} | } | ||
// line does not contain equal sign | |||
else | |||
{ | { | ||
llOwnerSay("Configuration could not be read on line " + (string)line); | llOwnerSay("Configuration could not be read on line " + (string)line); | ||
Line 120: | Line 120: | ||
} | } | ||
} | } | ||
// read the next line | |||
notecardQueryId = llGetNotecardLine(configurationNotecardName, ++line); | |||
} | } | ||
default | default | ||
{ | { | ||
on_rez(integer start_param) | |||
{ | { | ||
init(); | init(); | ||
} | } | ||
changed(integer change) | |||
{ | { | ||
init(); | if(change & (CHANGED_OWNER | CHANGED_INVENTORY)) | ||
init(); | |||
} | } | ||
state_entry() | |||
{ | { | ||
init(); | |||
} | } | ||
dataserver(key request_id, string data) | dataserver(key request_id, string data) | ||
{ | { | ||
if(request_id == | if(request_id == notecardQueryId) | ||
processConfiguration(data); | processConfiguration(data); | ||
} | } | ||
} | } | ||
</ | </source> | ||
{{LSLC|Library}}{{LSLC|Tutorials|Notecard}} |
Latest revision as of 12:35, 24 January 2015
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Learn how to read configuration files with Linden Scripting Language (LSL) in Second Life (SL). After viewing this tutorial, you will be able to:
- Create a script
- Read each line of a note card
- Skip over comments
- Skip blank lines
- Notify the owner of the lines with unknown settings
- Unknown setting name
- Missing delimiter (equal sign)
- Notify the owner of missing configuration note card
- Detect when the notecard has been changed
- Offer case-insensitive settings
- Trim white-space from name/value settings
- Initialize with default values
- Detect that the name of the configuration file is a notecard
- Detect that you have reached the end of the file
# this is a file to configure your application # blank lines are ignored as well as lines # proceeded with a "#" sign. Name = Dedric Mauriac Favorite Color = Blue
string configurationNotecardName = "Application.Config";
key notecardQueryId;
integer line;
string AvatarName;
string FavoriteColor;
init()
{
// reset configuration values to default
AvatarName = "Unknown";
FavoriteColor = "None";
// make sure the file exists and is a notecard
if(llGetInventoryType(configurationNotecardName) != INVENTORY_NOTECARD)
{
// notify owner of missing file
llOwnerSay("Missing inventory notecard: " + configurationNotecardName);
// don't do anything else
return;
}
// initialize to start reading from first line (which is 0)
line = 0;
notecardQueryId = llGetNotecardLine(configurationNotecardName, line);
}
processConfiguration(string data)
{
// if we are at the end of the file
if(data == EOF)
{
// notify the owner
llOwnerSay("We are done reading the configuration");
// notify what was read
llOwnerSay("The avatar name is: " + AvatarName);
llOwnerSay("The favorite color is: " + FavoriteColor);
// do not do anything else
return;
}
// if we are not working with a blank line
if(data != "")
{
// if the line does not begin with a comment
if(llSubStringIndex(data, "#") != 0)
{
// find first equal sign
integer i = llSubStringIndex(data, "=");
// if line contains equal sign
if(i != -1)
{
// get name of name/value pair
string name = llGetSubString(data, 0, i - 1);
// get value of name/value pair
string value = llGetSubString(data, i + 1, -1);
// trim name
list temp = llParseString2List(name, [" "], []);
name = llDumpList2String(temp, " ");
// make name lowercase (case insensitive)
name = llToLower(name);
// trim value
temp = llParseString2List(value, [" "], []);
value = llDumpList2String(temp, " ");
// name
if(name == "name")
AvatarName = value;
// color
else if(name == "favorite color")
FavoriteColor = value;
// unknown name
else
llOwnerSay("Unknown configuration value: " + name + " on line " + (string)line);
}
// line does not contain equal sign
else
{
llOwnerSay("Configuration could not be read on line " + (string)line);
}
}
}
// read the next line
notecardQueryId = llGetNotecardLine(configurationNotecardName, ++line);
}
default
{
on_rez(integer start_param)
{
init();
}
changed(integer change)
{
if(change & (CHANGED_OWNER | CHANGED_INVENTORY))
init();
}
state_entry()
{
init();
}
dataserver(key request_id, string data)
{
if(request_id == notecardQueryId)
processConfiguration(data);
}
}