Skip to content

Commit

Permalink
bidi.c: update the API.
Browse files Browse the repository at this point in the history
The input length field is now a size_t rather than an int, on general
principles. The return value is now void (we weren't using the
previous return value at all). And we now require the client to have
previously allocated a BidiContext, which will allow allocated storage
to be reused between runs, saving a lot of churn on malloc.

(However, the current BidiContext doesn't contain anything
interesting. I could have moved the existing mallocs into it, but
there's no point, since I'm about to rewrite the whole thing anyway.)
  • Loading branch information
sgtatham committed Oct 10, 2021
1 parent 53e84b8 commit caa16de
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 5 deletions.
2 changes: 2 additions & 0 deletions defs.h
Expand Up @@ -170,6 +170,8 @@ typedef struct SessionSpecial SessionSpecial;

typedef struct StripCtrlChars StripCtrlChars;

typedef struct BidiContext BidiContext;

/*
* A small structure wrapping up a (pointer, length) pair so that it
* can be conveniently passed to or from a function.
Expand Down
4 changes: 3 additions & 1 deletion putty.h
Expand Up @@ -2359,7 +2359,9 @@ typedef struct bidi_char {
unsigned int origwc, wc;
unsigned short index, nchars;
} bidi_char;
int do_bidi(bidi_char *line, int count);
BidiContext *bidi_new_context(void);
void bidi_free_context(BidiContext *ctx);
void do_bidi(BidiContext *ctx, bidi_char *line, size_t count);
int do_shape(bidi_char *line, bidi_char *to, int count);
bool is_rtl(int c);

Expand Down
22 changes: 19 additions & 3 deletions terminal/bidi.c
Expand Up @@ -1116,6 +1116,22 @@ int do_shape(bidi_char *line, bidi_char *to, int count)
return 1;
}

struct BidiContext {
int dummy;
};

BidiContext *bidi_new_context(void)
{
BidiContext *ctx = snew(BidiContext);
memset(ctx, 0, sizeof(BidiContext));
return ctx;
}

void bidi_free_context(BidiContext *ctx)
{
sfree(ctx);
}

/*
* The Main Bidi Function, and the only function that should
* be used by the outside world.
Expand All @@ -1124,7 +1140,7 @@ int do_shape(bidi_char *line, bidi_char *to, int count)
* the Bidirectional algorithm to.
*/

int do_bidi(bidi_char *line, int count)
void do_bidi(BidiContext *ctx, bidi_char *line, size_t count)
{
unsigned char* types;
unsigned char* levels;
Expand All @@ -1145,7 +1161,7 @@ int do_bidi(bidi_char *line, int count)
}
}
if (!yes)
return L;
return;

/* Initialize types, levels */
types = snewn(count, unsigned char);
Expand Down Expand Up @@ -1565,7 +1581,7 @@ int do_bidi(bidi_char *line, int count)
*/
sfree(types);
sfree(levels);
return R;
return;
}


Expand Down
6 changes: 5 additions & 1 deletion terminal/terminal.c
Expand Up @@ -2048,6 +2048,8 @@ Terminal *term_init(Conf *myconf, struct unicode_data *ucsdata, TermWin *win)
term->win_scrollbar_update_pending = false;
term->win_palette_pending = false;

term->bidi_ctx = bidi_new_context();

palette_reset(term, false);

return term;
Expand Down Expand Up @@ -2107,6 +2109,8 @@ void term_free(Terminal *term)
sfree(term->window_title);
sfree(term->icon_title);

bidi_free_context(term->bidi_ctx);

sfree(term);
}

Expand Down Expand Up @@ -5662,7 +5666,7 @@ static termchar *term_bidi_line(Terminal *term, struct termline *ldata,
}

if(!term->no_bidi)
do_bidi(term->wcFrom, nbc);
do_bidi(term->bidi_ctx, term->wcFrom, nbc);

if(!term->no_arabicshaping) {
do_shape(term->wcFrom, term->wcTo, nbc);
Expand Down
2 changes: 2 additions & 0 deletions terminal/terminal.h
Expand Up @@ -353,6 +353,8 @@ struct terminal_tag {
char *window_title, *icon_title;
bool minimised;

BidiContext *bidi_ctx;

/* Multi-layered colour palette. The colours from Conf (plus the
* default xterm-256 ones that don't have Conf ids at all) have
* lowest priority, followed by platform overrides if any,
Expand Down

0 comments on commit caa16de

Please sign in to comment.