def llList2Json(kind, lst): kind = fs(kind) lst = fl(lst) if kind == JSON_OBJECT: ret = u'{' if len(lst) & 1: return JSON_INVALID for i in xrange(0, len(lst), 2): if ret != u'{': ret += u',' ret += InternalJsonQuote(lst[i]) + u':' + InternalElement2Json( lst[i + 1], ParseNumbers=False) ret += u'}' elif kind == JSON_ARRAY: ret = u'[' if lst: ret += InternalElement2Json(lst[0], ParseNumbers=False) del lst[0] for elem in lst: ret += u',' + InternalElement2Json(elem, ParseNumbers=False) ret += u']' else: ret = JSON_INVALID return ret
def llJsonValueType(json, lst): json = fs(json) lst = fl(lst) ret = InternalJsonFindValue(json, lst, ReturnsToken=True) if ret == JSON_INVALID: return ret return ret[2]
def llJsonGetValue(json, lst): json = fs(json) lst = fl(lst) return InternalJsonFindValue(json, lst, ReturnsToken=False)
def llJson2List(json): json = fs(json) json = llStringTrim(json, 3) # STRING_TRIM if json == u'': return [] if json[0] == u'[' and json[-1] == u']': # Array can of worms. Not all LSL quirks are implemented. ret = [] token = InternalJsonGetTokenFull(json, 1) if token[2] == u']' and token[1] == len(json): return ret if token[2] == u':': return [JSON_INVALID] if token[2] == u',': ret.append(u'') else: ret.append(InternalJson2Elem(json[token[0]:token[1]])) token = InternalJsonGetTokenFull(json, token[1]) while True: if token[2] == u']' and token[1] == len(json): break elif token[2] != u',': return [JSON_INVALID] token = InternalJsonGetTokenFull(json, token[1]) if token[2] == u',' or token[2] == u']' and token[1] == len(json): ret.append(u'') else: if token[2] == u':': return JSON_INVALID ret.append(InternalJson2Elem(json[token[0]:token[1]])) token = InternalJsonGetTokenFull(json, token[1]) return ret if json[0] == u'{' and json[-1] == u'}': # Object can of worms. Worse than array. Not all LSL quirks are implemented. # Parse this grammar: # object: '{' complete_list incomplete_element '}' $ # complete_list: <empty> | complete_list complete_element ',' # complete_element: nonempty_string ':' value # incomplete_element: <empty> | value | string ':' value # string: '"' '"' | nonempty_string # # That allows: # {"a":1,"b":2,} # incomplete_element is empty # {"a":1,"b":2} # "b" is an incomplete_element # {2} # complete_list empty # {} # both empty # etc. ret = [] token = InternalJsonGetTokenFull(json, 1) if token[2] == u'}' and token[1] == len(json): return ret if token[2] in (u':', u','): return [JSON_INVALID] while True: k = u'' if token[2] == u'}' and token[1] == len(json): ret.append(k) ret.append(k) return ret if token[2] == JSON_STRING: colon = InternalJsonGetTokenFull(json, token[1]) if colon[2] == u':': k = InternalJsonUnquote(json[token[0]:token[1]]) token = InternalJsonGetTokenFull(json, colon[1]) if token[2] in (u',', u':'): return [JSON_INVALID] ret.append(k) ret.append(InternalJson2Elem(json[token[0]:token[1]])) token = InternalJsonGetTokenFull(json, token[1]) if token[2] == u'}' and token[1] == len(json): return ret if token[2] != u',' or k == u'': return [JSON_INVALID] token = InternalJsonGetTokenFull(json, token[1]) return [InternalJson2Elem(json)]
def llGetInventoryPermMask(item, category): item = fs(item) category = fi(category) if category < 0 or category > 4 or item == u'': return 0 raise ELSLCantCompute
def llGetInventoryKey(s): s = fs(s) if s == u'': return Key(NULL_KEY) raise ELSLCantCompute
def llGetHTTPHeader(id, s): id = fk(id) s = fs(s) if not cond(id): return u'' raise ELSLCantCompute
def llGetEnv(s): s = fs(s) if s not in GetEnvSettings: return u"" raise ELSLCantCompute