diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | 261 |
1 files changed, 219 insertions, 42 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index 57a579a..26e56c7 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | |||
@@ -1306,53 +1306,230 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
1306 | m_host.PreloadSound(sound); | 1306 | m_host.PreloadSound(sound); |
1307 | } | 1307 | } |
1308 | 1308 | ||
1309 | /// <summary> | ||
1310 | /// Return a portion of the designated string bounded by | ||
1311 | /// inclusive indices (start and end). As usual, the negative | ||
1312 | /// indices, and the tolerance for out-of-bound values, makes | ||
1313 | /// this more complicated than it might otherwise seem. | ||
1314 | /// </summary> | ||
1315 | |||
1309 | public string llGetSubString(string src, int start, int end) | 1316 | public string llGetSubString(string src, int start, int end) |
1310 | { | 1317 | { |
1318 | |||
1311 | m_host.AddScriptLPS(1); | 1319 | m_host.AddScriptLPS(1); |
1312 | // substring expects length | ||
1313 | // return src.Substring(start, end); | ||
1314 | 1320 | ||
1315 | // if one is negative so use length of string as base | 1321 | // Normalize indices (if negative). |
1316 | // if start > end then it is exclusive | 1322 | // After normlaization they may still be |
1317 | // for length add +1 for char at location=0 | 1323 | // negative, but that is now relative to |
1318 | if (start < 0) { start = src.Length-start; } | 1324 | // the start, rather than the end, of the |
1319 | if (end < 0) { end = src.Length - end; } | 1325 | // sequence. |
1320 | if (start > end) | 1326 | |
1327 | if (start < 0) | ||
1328 | { | ||
1329 | start = src.Length+start; | ||
1330 | } | ||
1331 | if (end < 0) | ||
1332 | { | ||
1333 | end = src.Length+end; | ||
1334 | } | ||
1335 | |||
1336 | // Conventional substring | ||
1337 | if (start <= end) | ||
1321 | { | 1338 | { |
1322 | return src.Substring(0, 1+end) + src.Substring(start, src.Length - start); | 1339 | // Implies both bounds are out-of-range. |
1340 | if(end < 0 || start >= src.Length) | ||
1341 | { | ||
1342 | return String.Empty; | ||
1343 | } | ||
1344 | // If end is positive, then it directly | ||
1345 | // corresponds to the lengt of the substring | ||
1346 | // needed (plus one of course). BUT, it | ||
1347 | // must be within bounds. | ||
1348 | if(end >= src.Length) | ||
1349 | { | ||
1350 | end = src.Length-1; | ||
1351 | } | ||
1352 | |||
1353 | if(start < 0) | ||
1354 | { | ||
1355 | return src.Substring(0,end+1); | ||
1356 | } | ||
1357 | // Both indices are positive | ||
1358 | return src.Substring(start, (end+1) - start); | ||
1323 | } | 1359 | } |
1360 | |||
1361 | // Inverted substring (end < start) | ||
1324 | else | 1362 | else |
1325 | { | 1363 | { |
1326 | return src.Substring(start, (1+end) - start); | 1364 | // Implies both indices are below the |
1365 | // lower bound. In the inverted case, that | ||
1366 | // means the entire string will be returned | ||
1367 | // unchanged. | ||
1368 | if(start < 0) | ||
1369 | { | ||
1370 | return src; | ||
1371 | } | ||
1372 | // If both indices are greater than the upper | ||
1373 | // bound the result may seem initially counter | ||
1374 | // intuitive. | ||
1375 | if(end >= src.Length) | ||
1376 | { | ||
1377 | return src; | ||
1378 | } | ||
1379 | |||
1380 | if(end < 0) | ||
1381 | { | ||
1382 | if(start < src.Length) | ||
1383 | { | ||
1384 | return src.Substring(start); | ||
1385 | } | ||
1386 | else | ||
1387 | { | ||
1388 | return String.Empty; | ||
1389 | } | ||
1390 | } | ||
1391 | else | ||
1392 | { | ||
1393 | if(start < src.Length) | ||
1394 | { | ||
1395 | return src.Substring(0,end+1) + src.Substring(start); | ||
1396 | } | ||
1397 | else | ||
1398 | { | ||
1399 | return src.Substring(0,end+1); | ||
1400 | } | ||
1401 | } | ||
1327 | } | 1402 | } |
1328 | } | 1403 | } |
1329 | 1404 | ||
1405 | /// <summary> | ||
1406 | /// Delete substring removes the specified substring bounded | ||
1407 | /// by the inclusive indices start and end. Indices may be | ||
1408 | /// negative (indicating end-relative) and may be inverted, | ||
1409 | /// i.e. end < start. | ||
1410 | /// </summary> | ||
1411 | |||
1330 | public string llDeleteSubString(string src, int start, int end) | 1412 | public string llDeleteSubString(string src, int start, int end) |
1331 | { | 1413 | { |
1414 | |||
1332 | m_host.AddScriptLPS(1); | 1415 | m_host.AddScriptLPS(1); |
1333 | //return src.Remove(start, end - start); | 1416 | |
1334 | // if one is negative so use length of string as base | 1417 | // Normalize indices (if negative). |
1335 | // if start > end then it is exclusive | 1418 | // After normlaization they may still be |
1336 | // for length add +1 for char at location=0 | 1419 | // negative, but that is now relative to |
1337 | if (start < 0) { start = src.Length - start; } | 1420 | // the start, rather than the end, of the |
1338 | if (end < 0) { end = src.Length - end; } | 1421 | // sequence. |
1339 | if (start > end) | 1422 | if (start < 0) |
1423 | { | ||
1424 | start = src.Length+start; | ||
1425 | } | ||
1426 | if (end < 0) | ||
1340 | { | 1427 | { |
1341 | return src.Remove(0, 1 + end) + src.Remove(start, src.Length - start); | 1428 | end = src.Length+end; |
1429 | } | ||
1430 | // Conventionally delimited substring | ||
1431 | if (start <= end) | ||
1432 | { | ||
1433 | // If both bounds are outside of the existing | ||
1434 | // string, then return unchanges. | ||
1435 | if(end < 0 || start >= src.Length) | ||
1436 | { | ||
1437 | return src; | ||
1438 | } | ||
1439 | // At least one bound is in-range, so we | ||
1440 | // need to clip the out-of-bound argument. | ||
1441 | if(start < 0) | ||
1442 | { | ||
1443 | start = 0; | ||
1444 | } | ||
1445 | |||
1446 | if(end >= src.Length) | ||
1447 | { | ||
1448 | end = src.Length-1; | ||
1449 | } | ||
1450 | |||
1451 | return src.Remove(start,end-start+1); | ||
1342 | } | 1452 | } |
1453 | // Inverted substring | ||
1343 | else | 1454 | else |
1344 | { | 1455 | { |
1345 | return src.Remove(start, (1 + end) - start); | 1456 | // In this case, out of bounds means that |
1457 | // the existing string is part of the cut. | ||
1458 | if(start < 0 || end >= src.Length) | ||
1459 | { | ||
1460 | return String.Empty; | ||
1461 | } | ||
1462 | |||
1463 | if(end > 0) | ||
1464 | { | ||
1465 | if(start < src.Length) | ||
1466 | { | ||
1467 | return src.Remove(start).Remove(0,end+1); | ||
1468 | } | ||
1469 | else | ||
1470 | { | ||
1471 | return src.Remove(0,end+1); | ||
1472 | } | ||
1473 | } | ||
1474 | else | ||
1475 | { | ||
1476 | if(start < src.Length) | ||
1477 | { | ||
1478 | return src.Remove(start); | ||
1479 | } | ||
1480 | else | ||
1481 | { | ||
1482 | return src; | ||
1483 | } | ||
1484 | } | ||
1346 | } | 1485 | } |
1347 | } | 1486 | } |
1348 | 1487 | ||
1349 | 1488 | /// <summary> | |
1350 | public string llInsertString(string dst, int position, string src) | 1489 | /// Insert string inserts the specified string identified by src |
1490 | /// at the index indicated by index. Index may be negative, in | ||
1491 | /// which case it is end-relative. The index may exceed either | ||
1492 | /// string bound, with the result being a concatenation. | ||
1493 | /// </summary> | ||
1494 | |||
1495 | public string llInsertString(string dest, int index, string src) | ||
1351 | { | 1496 | { |
1497 | |||
1352 | m_host.AddScriptLPS(1); | 1498 | m_host.AddScriptLPS(1); |
1353 | return dst.Insert(position, src); | ||
1354 | } | ||
1355 | 1499 | ||
1500 | // Normalize indices (if negative). | ||
1501 | // After normlaization they may still be | ||
1502 | // negative, but that is now relative to | ||
1503 | // the start, rather than the end, of the | ||
1504 | // sequence. | ||
1505 | if (index < 0) | ||
1506 | { | ||
1507 | index = dest.Length+index; | ||
1508 | |||
1509 | // Negative now means it is less than the lower | ||
1510 | // bound of the string. | ||
1511 | |||
1512 | if(index < 0) | ||
1513 | { | ||
1514 | return src+dest; | ||
1515 | } | ||
1516 | |||
1517 | } | ||
1518 | |||
1519 | if(index >= dest.Length) | ||
1520 | { | ||
1521 | return dest+src; | ||
1522 | } | ||
1523 | |||
1524 | // The index is in bounds. | ||
1525 | // In this case the index refers to the index that will | ||
1526 | // be assigned to the first character of the inserted string. | ||
1527 | // So unlike the other string operations, we do not add one | ||
1528 | // to get the correct string length. | ||
1529 | return dest.Substring(0,index)+src+dest.Substring(index); | ||
1530 | |||
1531 | } | ||
1532 | |||
1356 | public string llToUpper(string src) | 1533 | public string llToUpper(string src) |
1357 | { | 1534 | { |
1358 | m_host.AddScriptLPS(1); | 1535 | m_host.AddScriptLPS(1); |
@@ -2176,7 +2353,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
2176 | public string llGetScriptName() | 2353 | public string llGetScriptName() |
2177 | { | 2354 | { |
2178 | 2355 | ||
2179 | string result = null; | 2356 | string result = String.Empty; |
2180 | 2357 | ||
2181 | m_host.AddScriptLPS(1); | 2358 | m_host.AddScriptLPS(1); |
2182 | 2359 | ||
@@ -2184,7 +2361,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
2184 | { | 2361 | { |
2185 | if(item.Type == 10 && item.ItemID == m_itemID) | 2362 | if(item.Type == 10 && item.ItemID == m_itemID) |
2186 | { | 2363 | { |
2187 | result = item.Name; | 2364 | result = item.Name!=null?item.Name:String.Empty; |
2188 | break; | 2365 | break; |
2189 | } | 2366 | } |
2190 | } | 2367 | } |
@@ -2244,19 +2421,19 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
2244 | m_host.AddScriptLPS(1); | 2421 | m_host.AddScriptLPS(1); |
2245 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | 2422 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) |
2246 | { | 2423 | { |
2247 | if(inv.Value.Name == name) | 2424 | if(inv.Value.Name == name) |
2248 | { | 2425 | { |
2249 | if((inv.Value.OwnerMask & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) | 2426 | if((inv.Value.OwnerMask & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) |
2250 | { | 2427 | { |
2251 | return inv.Value.AssetID.ToString(); | 2428 | return inv.Value.AssetID.ToString(); |
2252 | } | 2429 | } |
2253 | else | 2430 | else |
2254 | { | 2431 | { |
2255 | return LLUUID.Zero.ToString(); | 2432 | return LLUUID.Zero.ToString(); |
2256 | } | 2433 | } |
2257 | } | 2434 | } |
2258 | } | 2435 | } |
2259 | return LLUUID.Zero.ToString(); | 2436 | return LLUUID.Zero.ToString(); |
2260 | } | 2437 | } |
2261 | 2438 | ||
2262 | public void llAllowInventoryDrop(int add) | 2439 | public void llAllowInventoryDrop(int add) |
@@ -2900,13 +3077,13 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
2900 | public string llGetObjectName() | 3077 | public string llGetObjectName() |
2901 | { | 3078 | { |
2902 | m_host.AddScriptLPS(1); | 3079 | m_host.AddScriptLPS(1); |
2903 | return m_host.Name; | 3080 | return m_host.Name!=null?m_host.Name:String.Empty; |
2904 | } | 3081 | } |
2905 | 3082 | ||
2906 | public void llSetObjectName(string name) | 3083 | public void llSetObjectName(string name) |
2907 | { | 3084 | { |
2908 | m_host.AddScriptLPS(1); | 3085 | m_host.AddScriptLPS(1); |
2909 | m_host.Name = name; | 3086 | m_host.Name = name!=null?name:String.Empty; |
2910 | } | 3087 | } |
2911 | 3088 | ||
2912 | public string llGetDate() | 3089 | public string llGetDate() |
@@ -3759,13 +3936,13 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
3759 | 3936 | ||
3760 | public string llGetObjectDesc() | 3937 | public string llGetObjectDesc() |
3761 | { | 3938 | { |
3762 | return m_host.Description; | 3939 | return m_host.Description!=null?m_host.Description:String.Empty; |
3763 | } | 3940 | } |
3764 | 3941 | ||
3765 | public void llSetObjectDesc(string desc) | 3942 | public void llSetObjectDesc(string desc) |
3766 | { | 3943 | { |
3767 | m_host.AddScriptLPS(1); | 3944 | m_host.AddScriptLPS(1); |
3768 | m_host.Description = desc; | 3945 | m_host.Description = desc!=null?desc:String.Empty; |
3769 | } | 3946 | } |
3770 | 3947 | ||
3771 | public string llGetCreator() | 3948 | public string llGetCreator() |