nx_mvault_context_gate.nx source
↩ module page · 57 lines · 2310 B
1// nx_mvault_context_gate.nx -- proves contextual ingestion.
2// Load-bearing: the SAME jpeg is a loose IMAGE alone but a MANGA page when it
3// is part of a numbered image sequence ("looks like an image but is a book").
4// run-exit == 0 means GREEN.
5
6import "nx_syscalls.nx"
7import "nx_mvault_ingest.nx"
8import "nx_media_pool.nx"
9import "nx_mvault_context.nx"
10
11func fill_pdf(b: *u8) -> i64 {
12 b[0] = 0x25 as u8; b[1] = 0x50 as u8; b[2] = 0x44 as u8; b[3] = 0x46 as u8 // %PDF
13 return 4
14}
15func fill_zip(b: *u8) -> i64 {
16 b[0] = 0x50 as u8; b[1] = 0x4B as u8; b[2] = 0x03 as u8; b[3] = 0x04 as u8 // PK..
17 return 4
18}
19func fill_rar(b: *u8) -> i64 {
20 b[0] = 0x52 as u8; b[1] = 0x61 as u8; b[2] = 0x72 as u8; b[3] = 0x21 as u8 // Rar!
21 return 4
22}
23
24func main(argc: i64, argv: *i64) -> i64 {
25 var fails: i64 = 0
26 let b: *u8 = sys_mmap(16)
27
28 // container magic detectors
29 let pn: i64 = fill_pdf(b)
30 if mv_is_pdf(b, pn) != 1 { fails = fails + 1 }
31 if mv_is_zip(b, pn) == 1 { fails = fails + 1 }
32 let zn: i64 = fill_zip(b)
33 if mv_is_zip(b, zn) != 1 { fails = fails + 1 }
34 let rn: i64 = fill_rar(b)
35 if mv_is_rar(b, rn) != 1 { fails = fails + 1 }
36
37 // ctx -> type mappings
38 if mv_context_type(NX_MEDIA_TYPE_TEXT, MV_CTX_PDF) != MV_TYPE_BOOK { fails = fails + 1 }
39 if mv_context_type(NX_MEDIA_TYPE_TEXT, MV_CTX_EPUB) != MV_TYPE_BOOK { fails = fails + 1 }
40 if mv_context_type(NX_MEDIA_TYPE_IMAGE, MV_CTX_CBZ) != MV_TYPE_MANGA { fails = fails + 1 }
41 if mv_context_type(NX_MEDIA_TYPE_IMAGE, MV_CTX_CBR) != MV_TYPE_MANGA { fails = fails + 1 }
42
43 // ★ THE LOAD-BEARING CASE: a jpeg (sniff=IMAGE) in a numbered sequence is a
44 // MANGA page (a book), NOT a loose image; the same jpeg alone stays IMAGE.
45 if mv_context_type(NX_MEDIA_TYPE_IMAGE, MV_CTX_IMGSEQ) != MV_TYPE_MANGA { fails = fails + 1 }
46 if mv_context_type(NX_MEDIA_TYPE_IMAGE, MV_CTX_NONE) != MV_TYPE_IMAGE { fails = fails + 1 }
47
48 // no-context falls back to per-file type (video stays video)
49 if mv_context_type(NX_MEDIA_TYPE_VIDEO, MV_CTX_NONE) != MV_TYPE_VIDEO { fails = fails + 1 }
50
51 if fails == 0 {
52 sys_write(1, "MVAULT-CONTEXT-GATE GREEN 12/12\n" as *u8, 32)
53 return 0
54 }
55 sys_write(1, "MVAULT-CONTEXT-GATE RED\n" as *u8, 24)
56 return 1
57}