ECode SparseBooleanArray::ToString( /* [out] */ String* str) { VALIDATE_NOT_NULL(str); if (mSize <= 0) { *str = "{}"; return NOERROR; } StringBuilder buffer(mSize * 28); buffer.AppendChar('{'); for (Int32 i = 0; i < mSize; i++) { if (i > 0) { buffer.Append(", "); } Int32 key; KeyAt(i, &key); buffer.Append(key); buffer.AppendChar('='); Boolean value; ValueAt(i, &value); buffer.Append(value); } buffer.AppendChar('}'); *str = buffer.ToString(); return NOERROR; }
bool KeyboardLayout::_AddKeyCodes(const parse_state& state, BPoint& rowLeftTop, Key& key, const char* data, int32& lastCount) { if (data[0] == '-') { // no key, just free space int32 num = strtoul(data + 1, NULL, 0); if (num < 1) num = 1; else if (num > 32) { _Error(state, "empty key count too large"); return false; } key.frame.OffsetTo(rowLeftTop); rowLeftTop.x = key.frame.left + key.frame.Width() * num; return true; } int32 modifier = 0; if (isalpha(data[0])) { bool led = false; if (!strcmp("led-caps", data)) { modifier = B_CAPS_LOCK; led = true; } else if (!strcmp("led-num", data)) { modifier = B_NUM_LOCK; led = true; } else if (!strcmp("led-scroll", data)) { modifier = B_SCROLL_LOCK; led = true; } else { // TODO: get modifier (ie. "num") } if (led) { key.frame.OffsetTo(rowLeftTop); rowLeftTop.x = key.frame.right; fBounds = key.frame | fBounds; Indicator* indicator = new(std::nothrow) Indicator; if (indicator != NULL) { indicator->modifier = modifier; indicator->frame = key.frame; fIndicators.AddItem(indicator); } return true; } } int32 first; int32 last; int32 num = 1; if (data[0] == '+') { num = strtoul(data + 1, NULL, 0); if (num < 1) num = 1; else if (num > 32) { _Error(state, "key count too large"); return false; } if (fKeyCount > 0) first = fKeys[fKeyCount - 1].code + 1; else first = 1; last = first + num - 1; } else { char* end; first = strtoul(data, &end, 0); last = first; if (end[0] == '-') { last = strtoul(end + 1, NULL, 0); if (first > last) { _Error(state, "invalid key code specifier"); return false; } num = last - first; } else if (end[0] == '+') { num = strtoul(end + 1, NULL, 0) + 1; last = first + num - 1; } else if (end[0] != '\0') { _Error(state, "invalid key range"); return false; } } if (lastCount != 0) { // update existing keys if (lastCount != num) { _Error(state, "modifier key mismatch"); return false; } for (int32 i = fKeyCount - num; i < fKeyCount; i++, first++) { Key* key = KeyAt(i); _AddAlternateKeyCode(key, modifier, first); } } else { // add new keys for (int32 i = first; i <= last; i++) { key.code = i; // "layout" key.frame.OffsetTo(rowLeftTop); rowLeftTop.x = key.frame.right; _AddKey(key); } lastCount = num; } return true; }