You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ravi/vscode-debugger/src/protocol.h

401 lines
9.6 KiB

/*
** See LICENSE Notice in lua.h
** Copyright (C) 2015-2016 Dibyendu Majumdar
*/
#ifndef RAVI_VSCODE_PROTOCOL_H
#define RAVI_VSCODE_PROTOCOL_H
#include "../../src/ravi_membuf.h"
#include "json.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>
enum {
VSCODE_REQUEST = 1,
VSCODE_EVENT = 2,
VSCODE_RESPONSE = 3,
VSCODE_UNKNOWN = 4
};
enum {
VSCODE_INITIALIZED_EVENT = 1,
VSCODE_STOPPED_EVENT = 2,
VSCODE_EXITED_EVENT = 3,
VSCODE_TERMINATED_EVENT = 4,
VSCODE_THREAD_EVENT = 5,
VSCODE_OUTPUT_EVENT = 6,
VSCODE_BREAKPOINT_EVENT = 7,
};
enum {
VSCODE_ERROR_RESPONSE = 1,
};
enum {
VSCODE_EOF = -2,
VSCODE_UNKNOWN_REQUEST = -1,
VSCODE_INITIALIZE_REQUEST = 1,
VSCODE_CONFIGURATION_DONE_REQUEST = 2,
VSCODE_LAUNCH_REQUEST = 3,
VSCODE_ATTACH_REQUEST = 4,
VSCODE_DISCONNECT_REQUEST = 5,
VSCODE_SET_BREAKPOINTS_REQUEST = 6,
VSCODE_SET_FUNCTION_BREAKPOINTS_REQUEST = 7,
VSCODE_SET_EXCEPTION_BREAKPOINTS_REQUEST = 8,
VSCODE_CONTINUE_REQUEST = 9,
VSCODE_NEXT_REQUEST = 10,
VSCODE_STEPIN_REQUEST = 11,
VSCODE_STEPOUT_REQUEST = 12,
VSCODE_PAUSE_REQUEST = 13,
VSCODE_STACK_TRACE_REQUEST = 14,
VSCODE_SCOPES_REQUEST = 15,
VSCODE_VARIABLES_REQUEST = 16,
VSCODE_SOURCE_REQUEST = 17,
VSCODE_THREAD_REQUEST = 18,
VSCODE_EVALUATE_REQUEST = 19,
};
enum {
VSCODE_INITIALIZE_RESPONSE = 1,
VSCODE_CONFIGURATION_DONE_RESPONSE = 2,
VSCODE_LAUNCH_RESPONSE = 3,
VSCODE_ATTACH_RESPONSE = 4,
VSCODE_DISCONNECT_RESPONSE = 5,
VSCODE_SET_BREAKPOINTS_RESPONSE = 6,
VSCODE_SET_FUNCTION_BREAKPOINTS_RESPONSE = 7,
VSCODE_SET_EXCEPTION_BREAKPOINTS_RESPONSE = 8,
VSCODE_CONTINUE_RESPONSE = 9,
VSCODE_NEXT_RESPONSE = 10,
VSCODE_STEPIN_RESPONSE = 11,
VSCODE_STEPOUT_RESPONSE = 12,
VSCODE_PAUSE_RESPONSE = 13,
VSCODE_STACK_TRACE_RESPONSE = 14,
VSCODE_SCOPES_RESPONSE = 15,
VSCODE_VARIABLES_RESPONSE = 16,
VSCODE_SOURCE_RESPONSE = 17,
VSCODE_THREAD_RESPONSE = 18,
VSCODE_EVALUATE_RESPONSE = 19,
};
enum {
NAME_LEN = 50,
PATH_LEN = 256,
VALUE_LEN = 80,
COMMAND_LEN = 30,
EVENT_LEN = 30,
REASON_LEN = 100,
CATEGORY_LEN = 30,
TEXT_LEN = 256,
MAX_BREAKPOINTS = 5,
MAX_STACK_FRAMES = 50,
MAX_SCOPES = 4,
MAX_VARIABLES = 251,
MAX_THREADS = 1,
SOURCE_LEN = 8196,
MAX_TOTAL_BREAKPOINTS = 20
};
/*
The max integer that can be transferred to a Javascript number (and hence JSON
number) is 2^53-1 which is equal to 9007199254740991. This takes up 53 bits.
The integer 4503599627370495 takes up 52 bits - so that means 6 8-bit values and 1
4-bit value can be accomodated.
*/
typedef struct {
unsigned int x8[5];
unsigned int depth;
unsigned int vartype;
} PackedInteger;
typedef struct {
int id;
char format[TEXT_LEN];
} Message;
typedef struct {
int id;
char name[NAME_LEN];
} Thread;
typedef struct {
char name[NAME_LEN];
char path[PATH_LEN];
int64_t sourceReference;
} Source;
typedef struct {
int id;
char name[NAME_LEN];
Source source;
int line;
int column;
} StackFrame;
typedef struct {
char name[NAME_LEN];
int64_t variablesReference;
int expensive;
} Scope;
typedef struct {
char name[NAME_LEN];
char type[NAME_LEN];
char value[VALUE_LEN];
int64_t variablesReference;
} Variable;
typedef struct {
int line;
int column;
} SourceBreakpoint;
typedef struct { char name[NAME_LEN]; } FunctionBreakpoint;
typedef struct {
int id;
int verified;
char message[TEXT_LEN];
Source source;
int line;
int column;
} Breakpoint;
typedef struct {
int supportsConfigurationDoneRequest;
int supportsFunctionBreakpoints;
int supportsConditionalBreakpoints;
int supportsEvaluateForHovers;
} Capabilities;
/* See
* https://github.com/Microsoft/vscode-debugadapter-node/blob/master/protocol/src/debugProtocol.ts
*/
typedef struct {
int type;
int64_t seq;
union {
struct {
int event_type;
char event[EVENT_LEN];
union {
struct {
char reason[REASON_LEN];
int threadId;
char text[TEXT_LEN];
int allThreadsStopped;
} StoppedEvent;
struct {
int exitCode;
} ExitedEvent;
struct {
int restart;
} TerminatedEvent;
struct {
char reason[REASON_LEN];
int threadId;
} ThreadEvent;
struct {
char category[CATEGORY_LEN];
char output[TEXT_LEN];
} OutputEvent;
struct {
char reason[TEXT_LEN];
Breakpoint breakpoint;
} BreakpointEvent;
} u;
} Event;
struct {
int request_type;
char command[COMMAND_LEN];
union {
struct {
char adapterID[NAME_LEN];
int linesStartAt1;
int columnsStartAt1;
char pathFormat[NAME_LEN];
} InitializeRequest;
struct {
int noDebug;
char program[TEXT_LEN];
int stopOnEntry;
char lua_path[PATH_LEN];
char lua_cpath[PATH_LEN];
char cwd[PATH_LEN];
} LaunchRequest;
struct {
Source source;
Breakpoint breakpoints[MAX_BREAKPOINTS];
} SetBreakpointsRequest;
struct {
FunctionBreakpoint breakpoints[MAX_BREAKPOINTS];
} SetFunctionBreakpointsRequest;
struct {
char filters[1][TEXT_LEN];
} SetExceptionBreakpointsRequest;
struct {
int integer;
} CommonIntRequest;
struct {
int64_t integer64;
} CommonInt64Request;
struct {
int threadId;
} ContinueRequest;
struct {
int threadId;
} NextRequest;
struct {
int threadId;
} StepInRequest;
struct {
int threadId;
} StepOutRequest;
struct {
int threadId;
} PauseRequest;
struct {
int threadId;
int startFrame;
int levels;
} StackTraceRequest;
struct {
int frameId;
} ScopesRequest;
struct {
int64_t variablesReference;
} VariablesRequest;
struct {
int64_t sourceReference;
} SourceRequest;
struct {
char expression[TEXT_LEN];
int frameId;
char context[TEXT_LEN];
} EvaluateRequest;
} u;
} Request;
struct {
int response_type;
int64_t request_seq;
int success;
char command[COMMAND_LEN];
char message[TEXT_LEN];
union {
struct {
char error[TEXT_LEN];
} ErrorResponse;
struct {
Capabilities body;
} InitializeResponse;
struct {
Breakpoint breakpoints[MAX_BREAKPOINTS];
} SetBreakpointsResponse;
struct {
Breakpoint breakpoints[MAX_BREAKPOINTS];
} SetFunctionBreakpointsResponse;
struct {
StackFrame stackFrames[MAX_STACK_FRAMES];
int totalFrames;
} StackTraceResponse;
struct {
Scope scopes[MAX_SCOPES];
} ScopesResponse;
struct {
Variable variables[MAX_VARIABLES+1];
} VariablesResponse;
struct {
char content[SOURCE_LEN];
} SourceResponse;
struct {
Thread threads[MAX_THREADS];
} ThreadResponse;
struct {
char result[TEXT_LEN];
int64_t variablesReference;
} EvaluateResponse;
} u;
} Response;
} u;
} ProtocolMessage;
extern int vscode_parse_message(char *buf, size_t len, ProtocolMessage *msg,
FILE *log);
extern void vscode_make_error_response(ProtocolMessage *req,
ProtocolMessage *res, int restype,
const char *errormsg);
extern void vscode_make_success_response(ProtocolMessage *req,
ProtocolMessage *res, int restype);
extern void vscode_serialize_response_new(membuff_t *mb, ProtocolMessage *res);
extern void vscode_serialize_event_new(membuff_t *mb, ProtocolMessage *res);
extern void vscode_make_initialized_event(ProtocolMessage *res);
extern void vscode_make_stopped_event(ProtocolMessage *res, const char *reason);
extern void vscode_make_thread_event(ProtocolMessage *res, bool started);
extern void vscode_make_terminated_event(ProtocolMessage *res);
extern void vscode_send(ProtocolMessage *msg, FILE *out, FILE *log);
extern void vscode_send_stopped_event(ProtocolMessage *res, const char *msg,
FILE *out, FILE *log);
extern void vscode_send_thread_event(ProtocolMessage *res, bool started,
FILE *out, FILE *log);
extern void vscode_send_terminated_event(ProtocolMessage *res, FILE *out,
FILE *log);
extern void vscode_send_output_event(ProtocolMessage *res, const char *category, const char *msg,
FILE *out, FILE *log);
extern void vscode_send_error_response(ProtocolMessage *req,
ProtocolMessage *res, int responseType,
const char *msg, FILE *out, FILE *log);
extern void vscode_send_success_response(ProtocolMessage *req,
ProtocolMessage *res, int responseType,
FILE *out, FILE *log);
extern int vscode_get_request(FILE *in, membuff_t *mb, ProtocolMessage *req, FILE *log);
extern void vscode_json_stringify(const char *src, char *dest, size_t len);
extern int64_t vscode_pack(PackedInteger *pi);
extern void vscode_unpack(int64_t i, PackedInteger *pi);
#endif