| 168 | } |
| 169 | |
| 170 | SwkbdButton swkbdInputText(SwkbdState* swkbd, char* buf, size_t bufsize) |
| 171 | { |
| 172 | SwkbdExtra extra = swkbd->extra; // Struct copy |
| 173 | |
| 174 | // Calculate sharedmem size |
| 175 | size_t sharedMemSize = 0; |
| 176 | sharedMemSize += (sizeof(u16)*(swkbd->max_text_len+1) + 3) &~ 3; |
| 177 | size_t dictOff = sharedMemSize; |
| 178 | sharedMemSize += (sizeof(SwkbdDictWord)*swkbd->dict_word_count + 3) &~ 3; |
| 179 | size_t statusOff = sharedMemSize; |
| 180 | sharedMemSize += swkbd->initial_status_offset >= 0 ? sizeof(SwkbdStatusData) : 0; |
| 181 | size_t learningOff = sharedMemSize; |
| 182 | sharedMemSize += swkbd->initial_learning_offset >= 0 ? sizeof(SwkbdLearningData) : 0; |
| 183 | if (swkbd->save_state_flags & BIT(0)) |
| 184 | { |
| 185 | swkbd->status_offset = sharedMemSize; |
| 186 | sharedMemSize += sizeof(SwkbdStatusData); |
| 187 | } |
| 188 | if (swkbd->save_state_flags & BIT(1)) |
| 189 | { |
| 190 | swkbd->learning_offset = sharedMemSize; |
| 191 | sharedMemSize += sizeof(SwkbdLearningData); |
| 192 | } |
| 193 | sharedMemSize = (sharedMemSize + 0xFFF) &~ 0xFFF; |
| 194 | swkbd->shared_memory_size = sharedMemSize; |
| 195 | |
| 196 | // Allocate sharedmem |
| 197 | swkbdSharedMem = (char*)memalign(0x1000, sharedMemSize); |
| 198 | if (!swkbdSharedMem) |
| 199 | { |
| 200 | swkbd->result = SWKBD_OUTOFMEM; |
| 201 | return SWKBD_BUTTON_NONE; |
| 202 | } |
| 203 | |
| 204 | // Create sharedmem block |
| 205 | Result res = svcCreateMemoryBlock(&swkbdSharedMemHandle, (u32)swkbdSharedMem, sharedMemSize, MEMPERM_READ|MEMPERM_WRITE, MEMPERM_READ|MEMPERM_WRITE); |
| 206 | if (R_FAILED(res)) |
| 207 | { |
| 208 | free(swkbdSharedMem); |
| 209 | swkbd->result = SWKBD_OUTOFMEM; |
| 210 | return SWKBD_BUTTON_NONE; |
| 211 | } |
| 212 | |
| 213 | // Copy stuff to shared mem |
| 214 | if (extra.initial_text) |
| 215 | { |
| 216 | swkbd->initial_text_offset = 0; |
| 217 | swkbdConvertToUTF16((u16*)swkbdSharedMem, extra.initial_text, swkbd->max_text_len); |
| 218 | } |
| 219 | if (extra.dict) |
| 220 | { |
| 221 | swkbd->dict_offset = dictOff; |
| 222 | memcpy(swkbdSharedMem+dictOff, extra.dict, sizeof(SwkbdDictWord)*swkbd->dict_word_count); |
| 223 | } |
| 224 | if (swkbd->initial_status_offset >= 0) |
| 225 | { |
| 226 | swkbd->initial_status_offset = statusOff; |
| 227 | memcpy(swkbdSharedMem+statusOff, extra.status_data, sizeof(SwkbdStatusData)); |
nothing calls this directly
no test coverage detected