34 void RecordingMacro::write_dated_comment(
const char *what)
const {
43 : stop_action_name(strdup(stop_action_name_)),
44 application_id(strdup(application_id_)),
49 path = (filename[0] ==
'/')
64 if (expand_existing) {
66 char *close = strstr(content,
"ARB::close");
67 if (close) close[0] = 0;
73 out = fopen(path,
"w");
77 write_dated_comment(expand_existing ?
"recording resumed" :
"recording started");
88 void RecordingMacro::write_as_perl_string(
const char *value)
const {
89 const char SQUOTE =
'\'';
91 for (
int i = 0; value[i]; ++i) {
105 bool handled =
false;
111 static int MACRO_START_LEN = strlen(MACRO_ACTION_START);
112 const char *sub_action = action_name+MACRO_START_LEN;
114 int playbackType = 0;
122 write(
"BIO::macro_execute(");
123 write_as_perl_string(macroName);
125 write(
'0'+(playbackType-1));
137 write(
"BIO::remote_action($gb_main");
138 write(
','); write_as_perl_string(app_id);
139 write(
','); write_as_perl_string(action_name);
145 write(
"BIO::remote_awar($gb_main");
146 write(
','); write_as_perl_string(app_id);
147 write(
','); write_as_perl_string(awar_name);
148 write(
','); write_as_perl_string(content);
154 write(
"ARB::notify_and_wait(");
155 write_as_perl_string(displayed_text);
166 else if (action_id[0] ==
'$') {
170 bool silently_ignore =
171 (strcmp(action_id, stop_action_name) == 0) ||
174 if (!silently_ignore) {
192 if (!silently_ignore) {
201 write_dated_comment(
"recording stopped");
202 write(
"ARB::close($gb_main);\n");
219 const char *found = strchr(str, qchar);
221 if (found[-1] ==
'\\') {
233 while (isspace(line[0])) ++
line;
234 if (line[0] ==
'\"' || line[0] ==
'\'') {
238 line = other_quote+1;
239 while (isspace(line[0])) ++
line;
253 while (isspace(line[0])) ++
line;
255 const char cmd[] =
"BIO::remote_awar($gb_main,";
258 if (strncmp(line, cmd, cmd_len) == 0) {
262 bool app_id_differs = strcmp(app_id,
id) != 0;
264 if (app_id_differs)
return NULp;
269 if (line[0] ==
',') {
280 return strcmp(line,
"BIO::remote_action($gb_main,\'ARB_NT\',\'macros\');") == 0;
284 return strcmp(line,
"ARB::close($gb_main);") == 0;
289 while (isspace(line[i])) ++i;
290 return line[i] ==
'#';
293 void RecordingMacro::post_process() {
297 error = macro.has_error();
299 StrArray&
line = macro.lines();
302 for (
size_t i = 0; i<line.size(); ++i) {
306 for (
size_t n = i+1; n<line.size(); ++n) {
310 if (strcmp(mod_awar, mod_next_awar) == 0) {
327 bool isLastCommand =
true;
328 for (
size_t n = i+1; n<line.size() && isLastCommand; ++n) {
330 isLastCommand =
false;
339 error = macro.save();
351 #define TEST_PARSE_QUOTED_STRING(in,res_exp,out_exp) do { \
352 const char *line = (in); \
353 char *res =parse_quoted_string(line); \
354 TEST_EXPECT_EQUAL(res, res_exp); \
355 TEST_EXPECT_EQUAL(line, out_exp); \
359 #define TEST_MODIFIES_AWAR(cmd,app_exp,awar_exp,app_in) do { \
360 char *app = app_in; \
361 char *awar = modifies_awar(cmd, app); \
362 TEST_EXPECTATION(all().of(that(awar).is_equal_to(awar_exp), \
363 that(app).is_equal_to(app_exp))); \
369 const char *null =
NULp;
370 TEST_PARSE_QUOTED_STRING(
"", null,
"");
371 TEST_PARSE_QUOTED_STRING(
"\"str\"",
"str",
"");
372 TEST_PARSE_QUOTED_STRING(
"\"part\", rest",
"part",
", rest");
373 TEST_PARSE_QUOTED_STRING(
"\"\"",
"",
"");
374 TEST_PARSE_QUOTED_STRING(
"\"\"rest",
"",
"rest");
375 TEST_PARSE_QUOTED_STRING(
"\"unmatched", null,
"\"unmatched");
377 TEST_MODIFIES_AWAR(
"# BIO::remote_awar($gb_main,\"app\", \"awar_name\", \"value\");", null, null,
NULp);
378 TEST_MODIFIES_AWAR(
"BIO::remote_awar($gb_main,\"app\", \"awar_name\", \"value\");",
"app",
"awar_name",
NULp);
379 TEST_MODIFIES_AWAR(
"BIO::remote_awar($gb_main,\"app\", \"awar_name\", \"value\");",
"app",
"awar_name", strdup(
"app"));
380 TEST_MODIFIES_AWAR(
"BIO::remote_awar($gb_main,\"app\", \"awar_name\", \"value\");",
"diff", null, strdup(
"diff"));
382 TEST_MODIFIES_AWAR(
" \t BIO::remote_awar($gb_main,\"app\", \"awar_name\", \"value\");",
"app",
"awar_name",
NULp);
385 void TEST_post_process() {
387 const char *source =
"general/pp.amc";
388 const char *dest =
"general/pp_out.amc";
389 const char *expected =
"general/pp_exp.amc";
void track_action(const char *action_id)
#define implicated(hypothesis, conclusion)
void track_awar_change(AW_awar *awar)
long GB_mode_of_file(const char *path)
RecordingMacro(const char *filename, const char *application_id_, const char *stop_action_name_, bool expand_existing)
GB_ERROR GB_IO_error(const char *action, const char *filename)
const char * ARB_date_string()
const char * GBS_global_string(const char *templat,...)
char * AW_get_selected_fullname(AW_root *awr, const char *awar_prefix)
char * ARB_strpartdup(const char *start, const char *end)
int GB_unlink(const char *path)
char * parse_quoted_string(const char *&line)
#define ARRAY_ELEMS(array)
GB_ERROR GB_await_error()
static AW_root * SINGLETON
#define TEST_EXPECT(cond)
static void error(const char *msg)
GB_CSTR GB_path_in_ARBHOME(const char *relative_path)
bool opens_macro_dialog(const char *line)
char * read_as_string() const
#define TEST_EXPECT_ZERO_OR_SHOW_ERRNO(iocond)
const char * GBT_relativeMacroname(const char *macro_name)
void write_awar_change(const char *app_id, const char *awar_name, const char *content)
GB_CSTR GB_path_in_ARBLIB(const char *relative_path)
GB_ERROR GB_set_mode_of_file(const char *path, long mode)
void write_planned_interruption(const char *displayed_text)
GB_CSTR GB_concat_path(GB_CSTR anypath_left, GB_CSTR anypath_right)
const char * closing_quote(const char *str, char qchar)
#define NEVER_RECORDED_ID
void write_action(const char *app_id, const char *action_name)
#define TEST_EXPECT_NO_ERROR(call)
bool is_end_of_macro(const char *line)
void aw_message(const char *msg)
bool GB_is_readablefile(const char *filename)
bool ARB_strBeginsWith(const char *str, const char *with)
#define TEST_EXPECT_TEXTFILE_DIFFLINES(fgot, fwant, diff)
bool is_comment(const char *line)
void warn_unrecordable(const char *what)
#define MACRO_PLAYBACK_MARKED_ID
GB_CSTR GB_getenvARBMACROHOME(void)
static const char * action_name[]
#define MACRO_PLAYBACK_ID
char * modifies_awar(const char *line, char *&app_id)
char * GBS_global_string_copy(const char *templat,...)
char * GB_read_file(const char *path)