/* for now this function can only unexpand strings with tables that contain only single character strings like "\n", "\t" etc. */ gchar *unexpand_string(const gchar *original, const char specialchar, Tconvert_table *table) { gchar *tmp, *tosearchfor, *retval, *prev, *dest, *orig; Tconvert_table *tmpentry; orig = g_strdup(original); DEBUG_MSG("original='%s', strlen()=%d\n",original,strlen(original)); tosearchfor = g_malloc(tablesize(table)+1); DEBUG_MSG("tablesize(table)=%d, alloc'ed %d bytes for tosearchfor\n",tablesize(table), tablesize(table)+1); tmp = tosearchfor; tmpentry = table; while(tmpentry->my_char != NULL) { *tmp = tmpentry->my_char[0]; /* we fill the search string with the first character */ tmpentry++; tmp++; } *tmp = '\0'; DEBUG_MSG("unexpand_string, tosearchfor='%s'\n",tosearchfor); DEBUG_MSG("alloc'ing %d bytes\n", (countchars(original, tosearchfor) + strlen(original) + 1)); retval = g_malloc((countchars(original, tosearchfor) + strlen(original) + 1) * sizeof(gchar)); dest = retval; prev = orig; /* now we go trough the original till we hit specialchar */ tmp = strpbrk(prev, tosearchfor); while (tmp) { gint len = tmp - prev; gint mychar = table_convert_char2int(table, tmp, tcc2i_firstchar); DEBUG_MSG("unexpand_string, tmp='%s', prev='%s'\n",tmp, prev); if (mychar == -1) mychar = *tmp; DEBUG_MSG("unexpand_string, copy %d bytes and advancing dest\n",len); memcpy(dest, prev, len); dest += len; *dest = specialchar; dest++; *dest = mychar; dest++; prev=tmp+1; DEBUG_MSG("prev now is '%s'\n",prev); tmp = strpbrk(prev, tosearchfor); } DEBUG_MSG("unexpand_string, copy the rest (%s) to dest\n",prev); memcpy(dest,prev,strlen(prev)+1); /* this will also make sure there is a \0 at the end */ DEBUG_MSG("unexpand_string, retval='%s'\n",retval); g_free(orig); g_free(tosearchfor); return retval; }
tablesize Universe::size() const { long long currsize = 1; TableSizeType tst = TST_EXACT; for (auto it = _tables.cbegin(); it != _tables.cend(); ++it) { tablesize ts = (*it)->size(); switch (ts._type) { case TST_EXACT: currsize = currsize * ts._size; break; case TST_APPROXIMATED: currsize = currsize * ts._size; tst = TST_APPROXIMATED; break; case TST_INFINITE: return tablesize(TST_INFINITE, getMaxElem<size_t>()); } } return tablesize(tst, currsize); }