Configuration Reading Tutorial

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

Application.configuration

# 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
# This completes this tutorial.
# Come on down for many scripted products at
# Dedric Mauriac's Gadget Shop
# Woodbridge 87, 82, 27

Configuration Reader 1.0.lsl

integer line;
string configurationFile = "Application.Config";
key readLineId;
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(configurationFile) != INVENTORY_NOTECARD)
    {
        // notify owner of missing file
        llOwnerSay("Missing inventory notecard: " + configurationFile);
        return; // don't do anything else
    }
 
    // initialize to start reading from first line
    line = 0;
 
    // read the first line
    readLineId = llGetNotecardLine(configurationFile, 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);
 
            }
            else  // line does not contain equal sign
            {
                llOwnerSay("Configuration could not be read on line " + (string)line);
            }
        }
    }
 
    // read the next line
    readLineId = llGetNotecardLine(configurationFile, line++);
 
}
default
{
    state_entry()
    {
        init();
    }
    on_rez(integer start_param)
    {
        init();
    }
    changed(integer change)
    {
        if(change & CHANGED_INVENTORY) init();
        else if(change & CHANGED_OWNER) init();
    }
    dataserver(key request_id, string data)
    {
        if(request_id == readLineId)
            processConfiguration(data);
 
    }
}

2 Responses to Configuration Reading Tutorial

  1. Lean, clean, straightforward. A word of warning about the asynchronous nature of the dataserver event would have been helpful, because that has potential to drive someone crazy.

    Still your code sample is a great help to even intermediate scripters.

  2. I thought I had mentioned it in the video tutorial.