static DataOffset getUnicodeGroupOffset (TextTableData *ttd, wchar_t character, int allocate) { unsigned int groupNumber = UNICODE_GROUP_NUMBER(character); DataOffset groupOffset = getTextTableHeader(ttd)->unicodeGroups[groupNumber]; if (!groupOffset && allocate) { if (!allocateDataItem(ttd->area, &groupOffset, sizeof(UnicodeGroupEntry), __alignof__(UnicodeGroupEntry))) return 0; getTextTableHeader(ttd)->unicodeGroups[groupNumber] = groupOffset; } return groupOffset; }
TextTableData * newTextTableData (void) { TextTableData *ttd; if ((ttd = malloc(sizeof(*ttd)))) { memset(ttd, 0, sizeof(*ttd)); if ((ttd->area = newDataArea())) { if (allocateDataItem(ttd->area, NULL, sizeof(TextTableHeader), __alignof__(TextTableHeader))) { return ttd; } destroyDataArea(ttd->area); } free(ttd); } return NULL; }
static DataOffset getUnicodeRowOffset (TextTableData *ttd, wchar_t character, int allocate) { DataOffset planeOffset = getUnicodePlaneOffset(ttd, character, allocate); if (!planeOffset) return 0; { UnicodePlaneEntry *plane = getDataItem(ttd->area, planeOffset); unsigned int rowNumber = UNICODE_ROW_NUMBER(character); DataOffset rowOffset = plane->rows[rowNumber]; if (!rowOffset && allocate) { if (!allocateDataItem(ttd->area, &rowOffset, sizeof(UnicodeRowEntry), __alignof__(UnicodeRowEntry))) return 0; plane = getDataItem(ttd->area, planeOffset); plane->rows[rowNumber] = rowOffset; } return rowOffset; } }
static DataOffset getUnicodePlaneOffset (TextTableData *ttd, wchar_t character, int allocate) { DataOffset groupOffset = getUnicodeGroupOffset(ttd, character, allocate); if (!groupOffset) return 0; { UnicodeGroupEntry *group = getDataItem(ttd->area, groupOffset); unsigned int planeNumber = UNICODE_PLANE_NUMBER(character); DataOffset planeOffset = group->planes[planeNumber]; if (!planeOffset && allocate) { if (!allocateDataItem(ttd->area, &planeOffset, sizeof(UnicodePlaneEntry), __alignof__(UnicodePlaneEntry))) return 0; group = getDataItem(ttd->area, groupOffset); group->planes[planeNumber] = planeOffset; } return planeOffset; } }
int saveDataItem (DataArea *area, DataOffset *offset, const void *item, size_t size, size_t alignment) { if (!allocateDataItem(area, offset, size, alignment)) return 0; memcpy(getDataItem(area, *offset), item, size); return 1; }