Skip to content

Commit 1b8e1a8

Browse files
committed
support markdown reloading
1 parent 25f4d10 commit 1b8e1a8

File tree

3 files changed

+91
-24
lines changed

3 files changed

+91
-24
lines changed

lib/markdown.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ markdown_parse(
4747
int c;
4848

4949
memset(res, 0, sizeof(*res));
50+
res->path = xstrdup(path);
5051

5152
fin = fopen(path, "r");
5253
if (!fin) goto done;
@@ -67,7 +68,6 @@ markdown_parse(
6768
}
6869
fclose(fhtml); fhtml = NULL;
6970

70-
res->path = xstrdup(path);
7171
res->data = bhtml; bhtml = NULL;
7272
res->size = zhtml; zhtml = 0;
7373
retval = 0;

lib/new_server_html.c

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10569,7 +10569,19 @@ priv_problem_status_json(
1056910569
}
1057010570

1057110571
// whether statement is available
10572-
if (variant > 0 && prob->xml.a[variant - 1]) {
10572+
if (prob->variant_num > 0 && variant > 0 && prob->md_size > 0 && variant <= prob->md_size) {
10573+
struct md_content *mdp = &prob->md_files[variant - 1];
10574+
if (mdp->size > 0) {
10575+
cJSON_AddTrueToObject(jp, "is_statement_avaiable");
10576+
cJSON_AddNumberToObject(jp, "est_stmt_size", mdp->size);
10577+
}
10578+
} else if (prob->variant_num <= 0 && variant <= 0 && prob->md_size == 1) {
10579+
struct md_content *mdp = &prob->md_files[0];
10580+
if (mdp->size > 0) {
10581+
cJSON_AddTrueToObject(jp, "is_statement_avaiable");
10582+
cJSON_AddNumberToObject(jp, "est_stmt_size", mdp->size);
10583+
}
10584+
} else if (variant > 0 && prob->xml.a[variant - 1]) {
1057310585
cJSON_AddTrueToObject(jp, "is_statement_avaiable");
1057410586
// FIXME: calculate size estimate?
1057510587
cJSON_AddNumberToObject(jp, "est_stmt_size", 4096);
@@ -17657,7 +17669,19 @@ unpriv_problem_status_json(
1765717669
fprintf(fout, ",\n \"max_rss_size\": \"%llu\"", prob->max_rss_size);
1765817670
}
1765917671
// whether statement is available
17660-
if (variant > 0 && prob->xml.a[variant - 1]) {
17672+
if (prob->variant_num > 0 && variant > 0 && prob->md_size > 0 && variant <= prob->md_size) {
17673+
struct md_content *pmd = &prob->md_files[variant - 1];
17674+
if (pmd->size > 0) {
17675+
fprintf(fout, ",\n \"is_statement_avaiable\": %s", to_json_bool(1));
17676+
fprintf(fout, ",\n \"est_stmt_size\": %zu", pmd->size);
17677+
}
17678+
} else if (prob->variant_num <= 0 && variant <= 0 && prob->md_size == 1) {
17679+
struct md_content *pmd = &prob->md_files[0];
17680+
if (pmd->size > 0) {
17681+
fprintf(fout, ",\n \"is_statement_avaiable\": %s", to_json_bool(1));
17682+
fprintf(fout, ",\n \"est_stmt_size\": %zu", pmd->size);
17683+
}
17684+
} else if (variant > 0 && prob->xml.a[variant - 1]) {
1766117685
fprintf(fout, ",\n \"is_statement_avaiable\": %s", to_json_bool(1));
1766217686
// FIXME: calculate size estimate?
1766317687
fprintf(fout, ",\n \"est_stmt_size\": %d", 4096);
@@ -17849,15 +17873,25 @@ unpriv_problem_statement_json(
1784917873
}
1785017874

1785117875
problem_xml_t px = NULL;
17852-
if (variant > 0 && prob->xml.a && prob->xml.a[variant - 1]) {
17853-
px = prob->xml.a[variant - 1];
17854-
} else if (variant <= 0 && prob->xml.p) {
17855-
px = prob->xml.p;
17856-
}
17857-
if (!px || !px->stmts) {
17858-
goto fail;
17876+
struct md_content *pmd = NULL;
17877+
if (prob->variant_num > 0 && variant > 0 && prob->md_size > 0 && variant <= prob->md_size) {
17878+
pmd = &prob->md_files[variant - 1];
17879+
} else if (prob->variant_num <= 0 && variant <= 0 && prob->md_size == 1) {
17880+
pmd = &prob->md_files[0];
17881+
}
17882+
if (pmd && pmd->size > 0) {
17883+
fwrite_unlocked(pmd->data, 1, pmd->size, fout);
17884+
} else {
17885+
if (variant > 0 && prob->xml.a && prob->xml.a[variant - 1]) {
17886+
px = prob->xml.a[variant - 1];
17887+
} else if (variant <= 0 && prob->xml.p) {
17888+
px = prob->xml.p;
17889+
}
17890+
if (!px || !px->stmts) {
17891+
goto fail;
17892+
}
17893+
ns_unparse_statement(fout, phr, cnts, extra, prob, 0, px, NULL, 0);
1785917894
}
17860-
ns_unparse_statement(fout, phr, cnts, extra, prob, 0, px, NULL, 0);
1786117895

1786217896
cleanup:
1786317897
html_armor_free(&ab);

lib/new_server_html_2.c

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* -*- mode: c -*- */
22

3-
/* Copyright (C) 2006-2024 Alexander Chernov <[email protected]> */
3+
/* Copyright (C) 2006-2025 Alexander Chernov <[email protected]> */
44

55
/*
66
* This program is free software; you can redistribute it and/or modify
@@ -9540,6 +9540,7 @@ struct ReloadStatementContext
95409540
int prob_id;
95419541
int variant;
95429542
const unsigned char *xml_path;
9543+
const unsigned char *md_path;
95439544
};
95449545

95459546
static void
@@ -9553,10 +9554,16 @@ do_reload_statement(
95539554
for (int prob_id = 1; prob_id <= cs->max_prob; ++prob_id) {
95549555
struct section_problem_data *prob = cs->probs[prob_id];
95559556
if (!prob) continue;
9556-
95579557
if (prob->variant_num <= 0) {
95589558
if (extra->contest_id == cntx->contest_id && prob_id == cntx->prob_id)
95599559
continue;
9560+
if (cntx->md_path && prob->md_size == 1 && !strcmp(prob->md_files[0].path, cntx->md_path)) {
9561+
struct md_content *mdp = &prob->md_files[0];
9562+
free(mdp->data);
9563+
free(mdp->path);
9564+
markdown_parse(cntx->md_path, mdp);
9565+
continue;
9566+
}
95609567
if (!prob->xml_file_path || strcmp(prob->xml_file_path, cntx->xml_path) != 0)
95619568
continue;
95629569
prob->xml.p = problem_xml_free(prob->xml.p);
@@ -9567,6 +9574,13 @@ do_reload_statement(
95679574
&& prob_id == cntx->prob_id
95689575
&& variant == cntx->variant)
95699576
continue;
9577+
if (cntx->md_path && variant <= prob->md_size && !strcmp(prob->md_files[variant - 1].path, cntx->md_path)) {
9578+
struct md_content *mdp = &prob->md_files[variant - 1];
9579+
free(mdp->data);
9580+
free(mdp->path);
9581+
markdown_parse(cntx->md_path, mdp);
9582+
continue;
9583+
}
95709584
if (!prob->var_xml_file_paths || !prob->var_xml_file_paths[variant - 1])
95719585
continue;
95729586
if (strcmp(prob->var_xml_file_paths[variant - 1], cntx->xml_path) != 0)
@@ -9607,18 +9621,37 @@ ns_reload_statement(
96079621
};
96089622

96099623
if (prob->variant_num <= 0) {
9610-
if (!prob->xml.p) return;
9611-
if (!prob->xml_file_path) return;
9612-
prob->xml.p = problem_xml_free(prob->xml.p);
9613-
prob->xml.p = problem_xml_parse_safe(NULL, prob->xml_file_path);
9614-
cntx.xml_path = prob->xml_file_path;
9624+
if (prob->md_size == 1) {
9625+
struct md_content *mdp = &prob->md_files[0];
9626+
unsigned char *saved_path = mdp->path;
9627+
free(mdp->data);
9628+
markdown_parse(saved_path, mdp);
9629+
cntx.md_path = mdp->path;
9630+
free(saved_path);
9631+
} else {
9632+
if (!prob->xml.p) return;
9633+
if (!prob->xml_file_path) return;
9634+
prob->xml.p = problem_xml_free(prob->xml.p);
9635+
prob->xml.p = problem_xml_parse_safe(NULL, prob->xml_file_path);
9636+
cntx.xml_path = prob->xml_file_path;
9637+
}
96159638
} else {
9616-
if (!prob->xml.a[variant - 1]) return;
9617-
if (!prob->var_xml_file_paths) return;
9618-
if (!prob->var_xml_file_paths[variant - 1]) return;
9619-
prob->xml.a[variant - 1] = problem_xml_free(prob->xml.a[variant - 1]);
9620-
prob->xml.a[variant - 1] = problem_xml_parse_safe(NULL, prob->var_xml_file_paths[variant - 1]);
9621-
cntx.xml_path = prob->var_xml_file_paths[variant - 1];
9639+
if (prob->md_size > 0 && variant <= prob->md_size) {
9640+
struct md_content *mdp = &prob->md_files[variant - 1];
9641+
unsigned char *saved_path = mdp->path;
9642+
free(mdp->data);
9643+
markdown_parse(saved_path, mdp);
9644+
cntx.md_path = mdp->path;
9645+
free(saved_path);
9646+
} else {
9647+
if (!prob->xml.a) return;
9648+
if (!prob->xml.a[variant - 1]) return;
9649+
if (!prob->var_xml_file_paths) return;
9650+
if (!prob->var_xml_file_paths[variant - 1]) return;
9651+
prob->xml.a[variant - 1] = problem_xml_free(prob->xml.a[variant - 1]);
9652+
prob->xml.a[variant - 1] = problem_xml_parse_safe(NULL, prob->var_xml_file_paths[variant - 1]);
9653+
cntx.xml_path = prob->var_xml_file_paths[variant - 1];
9654+
}
96229655
}
96239656

96249657
if (reload_all) {

0 commit comments

Comments
 (0)