Skip to content

Commit

Permalink
Merge pull request #357 from mihmig/master
Browse files Browse the repository at this point in the history
Add far2l terminal extensions support
  • Loading branch information
cyd01 authored Jan 18, 2022
2 parents 34e6289 + 87330fd commit cc7d412
Show file tree
Hide file tree
Showing 10 changed files with 1,017 additions and 18 deletions.
4 changes: 2 additions & 2 deletions 0.76_My_PuTTY/settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -1295,8 +1295,8 @@ void load_open_settings(settings_r *sesskey, Conf *conf)
gppb(sesskey, "HideMousePtr", false, conf, CONF_hide_mouseptr);
gppb(sesskey, "SunkenEdge", false, conf, CONF_sunken_edge);
gppi(sesskey, "WindowBorder", 1, conf, CONF_window_border);
gppi(sesskey, "CurType", 0, conf, CONF_cursor_type);
gppb(sesskey, "BlinkCur", false, conf, CONF_blink_cur);
gppi(sesskey, "CurType", 1, conf, CONF_cursor_type);
gppb(sesskey, "BlinkCur", true, conf, CONF_blink_cur);
/* pedantic compiler tells me I can't use conf, CONF_beep as an int * :-) */
gppi(sesskey, "Beep", 1, conf, CONF_beep);
gppi(sesskey, "BeepInd", 0, conf, CONF_beep_ind);
Expand Down
593 changes: 592 additions & 1 deletion 0.76_My_PuTTY/terminal.c

Large diffs are not rendered by default.

17 changes: 15 additions & 2 deletions 0.76_My_PuTTY/terminal.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
* but for the moment, this will do.
*/

#include <windows/winseat.h>
extern WinGuiSeat wgs;

#ifndef PUTTY_TERMINAL_H
#define PUTTY_TERMINAL_H

Expand Down Expand Up @@ -185,11 +188,20 @@ struct terminal_tag {
#define ANSI(x,y) ((x)+((y)*256))
#define ANSI_QUE(x) ANSI(x,1)

#define OSC_STR_MAX 2048
/* far2l extensions support */
//#define OSC_STR_MAX 2048
// todo: allocate osc_string dynamically
#define OSC_STR_MAX 1048576

int osc_strlen;
char osc_string[OSC_STR_MAX + 1];
bool osc_w;

/* far2l */
int far2l_ext; // extensions mode on
bool is_apc; // currently processing APC sequence
int clip_allowed; // remote clipboard access is allowed

char id_string[1024];

unsigned char *tabs;
Expand All @@ -205,7 +217,8 @@ struct terminal_tag {

SEEN_OSC_P,
OSC_STRING, OSC_MAYBE_ST,
VT52_ESC,
/* far2l extensions support */ SEEN_APC,
VT52_ESC,
VT52_Y1,
VT52_Y2,
VT52_FG,
Expand Down
7 changes: 7 additions & 0 deletions 0.76_My_PuTTY/windows/MAKEFILE.MINGW
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,7 @@ putty.exe: agentf.o aqsync.o be_all_s.o be_misc.o callback.o cmdline.o \
winnps.o winpgntc.o winprint.o winproxy.o winsecur.o \
winselgui.o winser.o winshare.o winstore.o wintime.o \
winucs.o winutils.o winx11.o x11fwd.o \
cencode.o cdecode.o \
adb.o \
kitty.o kitty_commun.o kitty_crypt.o kitty_image.o kitty_proxy.o kitty_registry.o kitty_ssh.o \
kitty_store.o kitty_tools.o kitty_win.o \
Expand Down Expand Up @@ -447,6 +448,7 @@ putty.exe: agentf.o aqsync.o be_all_s.o be_misc.o callback.o cmdline.o \
winnps.o winpgntc.o winprint.o winproxy.o winsecur.o \
winselgui.o winser.o winshare.o winstore.o wintime.o \
winucs.o winutils.o winx11.o x11fwd.o \
cencode.o cdecode.o \
adb.o \
kitty.o kitty_commun.o kitty_crypt.o kitty_image.o kitty_proxy.o kitty_registry.o kitty_ssh.o \
kitty_store.o kitty_tools.o kitty_win.o \
Expand Down Expand Up @@ -528,6 +530,11 @@ testcrypt.exe: ecc.o marshal.o memory.o millerrabin.o mpint.o mpunsafe.o \
sshpubk.o sshrsa.o sshrsag.o sshsh256.o sshsh512.o sshsha.o \
sshsha3.o testcrypt.o tree234.o utils.o winmiscs.o

cencode.o: ../windows/cencode.c
$(CC) $(COMPAT) $(CFLAGS) $(XFLAGS) -c ../windows/cencode.c

cdecode.o: ../windows/cencode.c
$(CC) $(COMPAT) $(CFLAGS) $(XFLAGS) -c ../windows/cdecode.c

agentf.o: ../agentf.c ../putty.h ../ssh.h ../pageant.h ../sshchan.h \
../defs.h ../puttyps.h ../network.h ../misc.h ../marshal.h \
Expand Down
88 changes: 88 additions & 0 deletions 0.76_My_PuTTY/windows/cdecode.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
cdecoder.c - c source to a base64 decoding algorithm implementation
This is part of the libb64 project, and has been placed in the public domain.
For details, see http://sourceforge.net/projects/libb64
*/

#include <cdecode.h>

int base64_decode_value(char value_in)
{
static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
static const char decoding_size = sizeof(decoding);
value_in -= 43;
if (value_in < 0 || value_in > decoding_size) return -1;
return decoding[(int)value_in];
}

void base64_init_decodestate(base64_decodestate* state_in)
{
state_in->step = step_a;
state_in->plainchar = 0;
}

int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in)
{
const char* codechar = code_in;
char* plainchar = plaintext_out;
char fragment;

*plainchar = state_in->plainchar;

switch (state_in->step)
{
while (1)
{
case step_a:
do {
if (codechar == code_in+length_in)
{
state_in->step = step_a;
state_in->plainchar = *plainchar;
return plainchar - plaintext_out;
}
fragment = (char)base64_decode_value(*codechar++);
} while (fragment < 0);
*plainchar = (fragment & 0x03f) << 2;
case step_b:
do {
if (codechar == code_in+length_in)
{
state_in->step = step_b;
state_in->plainchar = *plainchar;
return plainchar - plaintext_out;
}
fragment = (char)base64_decode_value(*codechar++);
} while (fragment < 0);
*plainchar++ |= (fragment & 0x030) >> 4;
*plainchar = (fragment & 0x00f) << 4;
case step_c:
do {
if (codechar == code_in+length_in)
{
state_in->step = step_c;
state_in->plainchar = *plainchar;
return plainchar - plaintext_out;
}
fragment = (char)base64_decode_value(*codechar++);
} while (fragment < 0);
*plainchar++ |= (fragment & 0x03c) >> 2;
*plainchar = (fragment & 0x003) << 6;
case step_d:
do {
if (codechar == code_in+length_in)
{
state_in->step = step_d;
state_in->plainchar = *plainchar;
return plainchar - plaintext_out;
}
fragment = (char)base64_decode_value(*codechar++);
} while (fragment < 0);
*plainchar++ |= (fragment & 0x03f);
}
}
/* control should not reach here */
return plainchar - plaintext_out;
}

28 changes: 28 additions & 0 deletions 0.76_My_PuTTY/windows/cdecode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
cdecode.h - c header for a base64 decoding algorithm
This is part of the libb64 project, and has been placed in the public domain.
For details, see http://sourceforge.net/projects/libb64
*/

#ifndef BASE64_CDECODE_H
#define BASE64_CDECODE_H

typedef enum
{
step_a, step_b, step_c, step_d
} base64_decodestep;

typedef struct
{
base64_decodestep step;
char plainchar;
} base64_decodestate;

void base64_init_decodestate(base64_decodestate* state_in);

int base64_decode_value(char value_in);

int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in);

#endif /* BASE64_CDECODE_H */
109 changes: 109 additions & 0 deletions 0.76_My_PuTTY/windows/cencode.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
cencoder.c - c source to a base64 encoding algorithm implementation
This is part of the libb64 project, and has been placed in the public domain.
For details, see http://sourceforge.net/projects/libb64
*/

#include <cencode.h>

const int CHARS_PER_LINE = 72;

void base64_init_encodestate(base64_encodestate* state_in)
{
state_in->step = step_A;
state_in->result = 0;
state_in->stepcount = 0;
}

char base64_encode_value(char value_in)
{
static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
if (value_in > 63) return '=';
return encoding[(int)value_in];
}

int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in)
{
const char* plainchar = plaintext_in;
const char* const plaintextend = plaintext_in + length_in;
char* codechar = code_out;
char result;
char fragment;

result = state_in->result;

switch (state_in->step)
{
while (1)
{
case step_A:
if (plainchar == plaintextend)
{
state_in->result = result;
state_in->step = step_A;
return codechar - code_out;
}
fragment = *plainchar++;
result = (fragment & 0x0fc) >> 2;
*codechar++ = base64_encode_value(result);
result = (fragment & 0x003) << 4;
case step_B:
if (plainchar == plaintextend)
{
state_in->result = result;
state_in->step = step_B;
return codechar - code_out;
}
fragment = *plainchar++;
result |= (fragment & 0x0f0) >> 4;
*codechar++ = base64_encode_value(result);
result = (fragment & 0x00f) << 2;
case step_C:
if (plainchar == plaintextend)
{
state_in->result = result;
state_in->step = step_C;
return codechar - code_out;
}
fragment = *plainchar++;
result |= (fragment & 0x0c0) >> 6;
*codechar++ = base64_encode_value(result);
result = (fragment & 0x03f) >> 0;
*codechar++ = base64_encode_value(result);

++(state_in->stepcount);
if (state_in->stepcount == CHARS_PER_LINE/4)
{
//*codechar++ = '\n';
state_in->stepcount = 0;
}
}
}
/* control should not reach here */
return codechar - code_out;
}

int base64_encode_blockend(char* code_out, base64_encodestate* state_in)
{
char* codechar = code_out;

switch (state_in->step)
{
case step_B:
*codechar++ = base64_encode_value(state_in->result);
*codechar++ = '=';
*codechar++ = '=';
break;
case step_C:
*codechar++ = base64_encode_value(state_in->result);
*codechar++ = '=';
break;
case step_A:
break;
}
//*codechar++ = '\n';

return codechar - code_out;
}

31 changes: 31 additions & 0 deletions 0.76_My_PuTTY/windows/cencode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
cencode.h - c header for a base64 encoding algorithm
This is part of the libb64 project, and has been placed in the public domain.
For details, see http://sourceforge.net/projects/libb64
*/

#ifndef BASE64_CENCODE_H
#define BASE64_CENCODE_H

typedef enum
{
step_A, step_B, step_C
} base64_encodestep;

typedef struct
{
base64_encodestep step;
char result;
int stepcount;
} base64_encodestate;

void base64_init_encodestate(base64_encodestate* state_in);

char base64_encode_value(char value_in);

int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in);

int base64_encode_blockend(char* code_out, base64_encodestate* state_in);

#endif /* BASE64_CENCODE_H */
Loading

0 comments on commit cc7d412

Please sign in to comment.