unichar_t* Wordlist_advanceSelectedCharsBy( SplineFont* sf, EncMap *map, unichar_t* txtu, int offset ) { unichar_t original_data[ PATH_MAX ]; static unichar_t ret[ PATH_MAX ]; int i = 0; u_strcpy( original_data, txtu ); TRACE("Wordlist_advanceSelectedCharsBy(1) %s\n", u_to_c( txtu )); WordlistTrimTrailingSingleSlash( txtu ); WordListLine wll = WordlistEscapedInputStringToParsedData( sf, txtu ); int selectedCount = WordListLine_countSelected( wll ); if( !selectedCount ) wll->isSelected = 1; memset( ret, 0, sizeof(unichar_t) * PATH_MAX ); for( i = 0; wll->sc; wll++, i++ ) { SplineChar* sc = wll->sc; int element_selected = wll->isSelected; if( element_selected ) { int pos = map->backmap[ sc->orig_pos ]; pos += offset; int gid = pos < 0 || pos >= map->enccount ? -2 : map->map[pos]; if( gid == -2 ) { // we can't find a glyph at the desired position. // so instead of dropping it we just do not perform the operation // on this char. pos -= offset; gid = pos < 0 || pos >= map->enccount ? -2 : map->map[pos]; if( gid == -2 ) { // we can't go back manually! u_strcpy( ret, original_data ); return ret; } } if( gid==-1 || !sf->glyphs[gid] ) sc = SFMakeChar( sf, map, pos ); else sc = sf->glyphs[gid]; } if( element_selected ) uc_strcat( ret, "[" ); /* uc_strcat( ret, "/" ); */ /* uc_strcat( ret, scarray[i]->name ); */ uc_strcat( ret, Wordlist_getSCName( sc )); if( element_selected ) uc_strcat( ret, "]" ); } return ret; }
static void dump_ustr( char* msg, unichar_t* u ) { char u8buf[1001]; char* pt = u8buf; memset( u8buf, 0, 1000 ); printf("%s\n", msg ); unichar_t* p = u; unichar_t* e = u + u_strlen( u ); for( ; p!=e; ++p ) { unichar_t buf[5]; buf[0] = *p; buf[1] = '\0'; printf("walk %d %s\n", *p, u_to_c(buf)); pt = utf8_idpb( pt, *p, 0); } printf("%s u8str:%s\n", msg, u8buf ); }
static SplineChar* u_WordlistEscapedInputStringToRealString_readGlyphName( SplineFont *sf, unichar_t* in, unichar_t* in_end, unichar_t** updated_in, unichar_t* glyphname ) { int startedWithBackSlash = (*in == '\\'); if( *in != '/' && *in != '\\' ) return 0; bool startsWithBackSlash = *in == '\\'; // move over the delimiter that we know we are on in++; unichar_t* startpos = in; // Get the largest possible 'glyphname' from the input stream. memset( glyphname, '\0', PATH_MAX ); unichar_t* outname = glyphname; while( *in != '/' && ( !startsWithBackSlash || *in != '\\' ) && *in != ' ' && *in != ']' && in != in_end ) { *outname = *in; ++outname; in++; } bool FullMatchEndsOnSpace = 0; unichar_t* maxpos = in; unichar_t* endpos = maxpos-1; TRACE("WordlistEscapedInputStringToRealString_readGlyphName(x1) -->:%s:<--\n", u_to_c(glyphname)); int loopCounter = 0; int firstLookup = 1; for( ; endpos >= startpos; endpos--, loopCounter++ ) { // printf("WordlistEscapedInputStringToRealString_readGlyphName(trim loop top) gn:%s\n", u_to_c(glyphname) ); SplineChar* sc = 0; if( startedWithBackSlash ) { if( glyphname[0] == 'u' ) glyphname++; unichar_t* endptr = 0; long unicodepoint = u_strtoul( glyphname+1, &endptr, 16 ); TRACE("AAA glyphname:%s\n", u_to_c(glyphname+1) ); TRACE("AAA unicodepoint:%ld\n", unicodepoint ); sc = SFGetChar( sf, unicodepoint, 0 ); if( sc && endptr ) { unichar_t* endofglyphname = glyphname + u_strlen(glyphname); /* printf("glyphname:%p\n", glyphname ); */ /* printf("endptr:%p endofglyphname:%p\n", endptr, endofglyphname ); */ for( ; endptr < endofglyphname; endptr++ ) --endpos; } if( !sc ) { // printf("WordlistEscapedInputStringToRealString_readGlyphName() no char found for backslashed unicodepoint:%ld\n", unicodepoint ); uc_strcpy(glyphname,"backslash"); sc = SFGetChar( sf, -1, u_to_c(glyphname) ); endpos = startpos; } } else { if( uc_startswith( glyphname, "uni")) { unichar_t* endptr = 0; long unicodepoint = u_strtoul( glyphname+3, &endptr, 16 ); SplineChar* tmp = 0; TRACE("uni prefix, codepoint: %ld\n", unicodepoint ); sc = SFGetChar( sf, unicodepoint, 0 ); if ((tmp = SFGetChar( sf, -1, u_to_c(glyphname) ))) { TRACE("have subst. char: %s\n", tmp->name ); sc = tmp; } else { if( sc && endptr ) { unichar_t* endofglyphname = glyphname + u_strlen(glyphname); // printf("endptr:%p endofglyphname:%p\n", endptr, endofglyphname ); for( ; endptr < endofglyphname; endptr++ ) --endpos; } } } if( firstLookup && glyphname[0] == '#' ) { unichar_t* endptr = 0; long unicodepoint = u_strtoul( glyphname+1, &endptr, 16 ); // printf("WordlistEscapedInputStringToRealString_readGlyphName() unicodepoint:%ld\n", unicodepoint ); sc = SFGetChar( sf, unicodepoint, 0 ); if( sc && endptr ) { unichar_t* endofglyphname = glyphname + u_strlen(glyphname); // printf("endptr:%p endofglyphname:%p\n", endptr, endofglyphname ); for( ; endptr < endofglyphname; endptr++ ) --endpos; } } if( !sc ) { // printf("WordlistEscapedInputStringToRealString_readGlyphName(getchar) gn:%s\n", glyphname ); sc = SFGetChar( sf, -1, u_to_c(glyphname) ); } } if( sc ) { // printf("WordlistEscapedInputStringToRealString_readGlyphName(found!) gn:%s start:%p end:%p\n", glyphname, startpos, endpos ); if( !loopCounter && FullMatchEndsOnSpace ) { endpos++; } *updated_in = endpos; return sc; } if( glyphname[0] != '\0' ) glyphname[ u_strlen(glyphname)-1 ] = '\0'; } *updated_in = endpos; // printf("WordlistEscapedInputStringToRealString_readGlyphName(end) gn:%s\n", glyphname ); return 0; }
unichar_t* Wordlist_advanceSelectedCharsBy( SplineFont* sf, EncMap *map, unichar_t* txtu, int offset ) { unichar_t original_data[ PATH_MAX ]; static unichar_t ret[ PATH_MAX ]; int limit = PATH_MAX; SplineChar* scarray[ PATH_MAX + 1 ]; GArray* selected = 0; int i = 0; u_strcpy( original_data, txtu ); TRACE("Wordlist_advanceSelectedCharsBy(1) %s\n", u_to_c( txtu )); WordlistTrimTrailingSingleSlash( txtu ); txtu = WordlistEscapedInputStringToRealStringBasic( sf, txtu, &selected ); TRACE("Wordlist_advanceSelectedCharsBy(2) %s\n", u_to_c( txtu )); GArray* bv = Wordlist_selectedToBitmapArray( selected ); TRACE("selected->len:%d\n", selected->len ); if( !selected->len ) { int one = 1; g_array_insert_val( bv, 0, one ); } g_array_unref( selected ); selected = 0; memset( scarray, 0, sizeof(SplineChar*) * limit+1 ); const unichar_t *pt, *ept, *tpt; pt = txtu; ept=txtu+u_strlen(txtu); for ( tpt=pt; tpt<ept; ++tpt ) { int ch = *tpt; if( tpt == pt ) { // your own char at the leading of the text SplineChar* sc = SFGetOrMakeCharFromUnicodeBasic( sf, ch ); scarray[i] = sc; i++; continue; } scarray[i] = SFGetOrMakeCharFromUnicodeBasic( sf, ch ); i++; if( i >= limit ) break; } memset( ret, 0, sizeof(unichar_t) * PATH_MAX ); for( i = 0; scarray[i]; i++ ) { int element_selected = g_array_index (bv, gint, i); if( element_selected ) { int pos = map->backmap[ scarray[i]->orig_pos ]; TRACE("pos1:%d\n", pos ); pos += offset; TRACE("pos2:%d\n", pos ); TRACE("map:%d\n", map->map[ pos ] ); int gid = pos < 0 || pos >= map->enccount ? -2 : map->map[pos]; if( gid == -2 ) { // we can't find a glyph at the desired position. // so instead of dropping it we just do not perform the operation // on this char. pos -= offset; gid = pos < 0 || pos >= map->enccount ? -2 : map->map[pos]; if( gid == -2 ) { // we can't go back manually! printf("no glyph!\n"); u_strcpy( ret, original_data ); return ret; } } if( gid==-1 || !sf->glyphs[gid] ) scarray[i] = SFMakeChar( sf, map, pos ); else scarray[i] = sf->glyphs[gid]; } if( element_selected ) uc_strcat( ret, "[" ); /* uc_strcat( ret, "/" ); */ /* uc_strcat( ret, scarray[i]->name ); */ uc_strcat( ret, Wordlist_getSCName( scarray[i] )); if( element_selected ) uc_strcat( ret, "]" ); } TRACE("Wordlist_advanceSelectedCharsBy(e) %s\n", u_to_c( ret )); return ret; }