History

D'oh

After a decade (plus change) less prudent side finally won internal struggle.

malc committed 6 years ago

Commit bc370591 parent 42ce7f52 files · +86 −55Browse files

Unified · Split

2 files
  1. link.c +49 −35
  2. main.ml +37 −20
link.c+49−35
@@ -1366,7 +1366,12 @@ ML (mbtoutf8 (value s_v)) · 1365 unmodified lines
13661366 CAMLreturn (ret_v);
13671367 }
13681368
1369−static void * mainloop (void UNUSED_ATTR *unused)
1369+enum {
1370+ Copen, Ccs, Cfreepage, Cfreetile, Csearch, Cgeometry, Creqlayout,
1371+ Cpage, Ctile, Ctrimset, Csettrim, Csliceh, Cinterrupt
1372+};
1373+
1374+static void *mainloop (void UNUSED_ATTR *unused)
13701375 {
13711376 char *p = NULL;
13721377 int len, ret, oldlen = 0;
@@ -1389,9 +1394,8 @@ static void * mainloop (void UNUSED_ATTR *unused) · 16 unmodified lines
13891394 readdata (state.csock, p, len);
13901395 p[len] = 0;
13911396
1392−#define CASE(n) else if (!strncmp (#n, p, sizeof (#n) - 1))
1393− if (0) ;
1394− CASE (open) {
1397+ switch (p[len-1]) {
1398+ case Copen: {
13951399 int off, usedoccss, ok = 0, layouth;
13961400 char *password;
13971401 char *filename;
@@ -1399,12 +1403,12 @@ static void * mainloop (void UNUSED_ATTR *unused) · 1 unmodified line
13991403 size_t filenamelen;
14001404
14011405 fz_var (ok);
1402− ret = sscanf (p + 5, " %d %d %n", &usedoccss, &layouth, &off);
1406+ ret = sscanf (p, " %d %d %n", &usedoccss, &layouth, &off);
14031407 if (ret != 2) {
14041408 errx (1, "malformed open `%.*s' ret=%d", len, p, ret);
14051409 }
14061410
1407− filename = p + 5 + off;
1411+ filename = p + off;
14081412 filenamelen = strlen (filename);
14091413 password = filename + filenamelen + 1;
14101414
@@ -1431,11 +1435,12 @@ static void * mainloop (void UNUSED_ATTR *unused) · 20 unmodified lines
14311435 }
14321436 unlock ("open");
14331437 state.needoutline = ok;
1438+ break;
14341439 }
1435− CASE (cs) {
1440+ case Ccs: {
14361441 int i, colorspace;
14371442
1438− ret = sscanf (p + 2, " %d", &colorspace);
1443+ ret = sscanf (p, " %d", &colorspace);
14391444 if (ret != 1) {
14401445 errx (1, "malformed cs `%.*s' ret=%d", len, p, ret);
14411446 }
@@ -1446,41 +1451,44 @@ static void * mainloop (void UNUSED_ATTR *unused) · 4 unmodified lines
14461451 state.tex.owners[i].slice = NULL;
14471452 }
14481453 unlock ("cs");
1454+ break;
14491455 }
1450− CASE (freepage) {
1456+ case Cfreepage: {
14511457 void *ptr;
14521458
1453− ret = sscanf (p + 8, " %" SCNxPTR, (uintptr_t *) &ptr);
1459+ ret = sscanf (p, " %" SCNxPTR, (uintptr_t *) &ptr);
14541460 if (ret != 1) {
14551461 errx (1, "malformed freepage `%.*s' ret=%d", len, p, ret);
14561462 }
14571463 lock ("freepage");
14581464 freepage (ptr);
14591465 unlock ("freepage");
1466+ break;
14601467 }
1461− CASE (freetile) {
1468+ case Cfreetile: {
14621469 void *ptr;
14631470
1464− ret = sscanf (p + 8, " %" SCNxPTR, (uintptr_t *) &ptr);
1471+ ret = sscanf (p, " %" SCNxPTR, (uintptr_t *) &ptr);
14651472 if (ret != 1) {
14661473 errx (1, "malformed freetile `%.*s' ret=%d", len, p, ret);
14671474 }
14681475 lock ("freetile");
14691476 freetile (ptr);
14701477 unlock ("freetile");
1478+ break;
14711479 }
1472− CASE (search) {
1480+ case Csearch: {
14731481 int icase, pageno, y, len2, forward;
14741482 char *pattern;
14751483 regex_t re;
14761484
1477− ret = sscanf (p + 6, " %d %d %d %d,%n",
1485+ ret = sscanf (p, " %d %d %d %d,%n",
14781486 &icase, &pageno, &y, &forward, &len2);
14791487 if (ret != 4) {
14801488 errx (1, "malformed search `%s' ret=%d", p, ret);
14811489 }
14821490
1483− pattern = p + 6 + len2;
1491+ pattern = p + len2;
14841492 ret = regcomp (&re, pattern,
14851493 REG_EXTENDED | (icase ? REG_ICASE : 0));
14861494 if (ret) {
@@ -1496,12 +1504,13 @@ static void * mainloop (void UNUSED_ATTR *unused) · 9 unmodified lines
14961504 unlock ("search");
14971505 regfree (&re);
14981506 }
1507+ break;
14991508 }
1500− CASE (geometry) {
1509+ case Cgeometry: {
15011510 int w, h, fitmodel;
15021511
15031512 printd ("clear");
1504− ret = sscanf (p + 8, " %d %d %d", &w, &h, &fitmodel);
1513+ ret = sscanf (p, " %d %d %d", &w, &h, &fitmodel);
15051514 if (ret != 3) {
15061515 errx (1, "malformed geometry `%.*s' ret=%d", len, p, ret);
15071516 }
@@ -1521,16 +1530,16 @@ static void * mainloop (void UNUSED_ATTR *unused) · 13 unmodified lines
15211530 state.gen++;
15221531 unlock ("geometry");
15231532 printd ("continue %d", state.pagecount);
1533+ break;
15241534 }
1525− CASE (reqlayout) {
1535+ case Creqlayout: {
15261536 char *nameddest;
15271537 int rotate, off, h;
15281538 int fitmodel;
15291539 pdf_document *pdf;
15301540
15311541 printd ("clear");
1532− ret = sscanf (p + 9, " %d %d %d %n",
1533− &rotate, &fitmodel, &h, &off);
1542+ ret = sscanf (p, " %d %d %d %n", &rotate, &fitmodel, &h, &off);
15341543 if (ret != 3) {
15351544 errx (1, "bad reqlayout line `%.*s' ret=%d", len, p, ret);
15361545 }
@@ -1545,7 +1554,7 @@ static void * mainloop (void UNUSED_ATTR *unused) · 8 unmodified lines
15451554 layout ();
15461555 process_outline ();
15471556
1548− nameddest = p + 9 + off;
1557+ nameddest = p + off;
15491558 if (pdf && nameddest && *nameddest) {
15501559 fz_point xy;
15511560 struct pagedim *pdim;
@@ -1559,13 +1568,14 @@ static void * mainloop (void UNUSED_ATTR *unused) · 7 unmodified lines
15591568 state.gen++;
15601569 unlock ("reqlayout");
15611570 printd ("continue %d", state.pagecount);
1571+ break;
15621572 }
1563− CASE (page) {
1573+ case Cpage: {
15641574 double a, b;
15651575 struct page *page;
15661576 int pageno, pindex;
15671577
1568− ret = sscanf (p + 4, " %d %d", &pageno, &pindex);
1578+ ret = sscanf (p, " %d %d", &pageno, &pindex);
15691579 if (ret != 2) {
15701580 errx (1, "bad page line `%.*s' ret=%d", len, p, ret);
15711581 }
@@ -1577,15 +1587,16 @@ static void * mainloop (void UNUSED_ATTR *unused) · 5 unmodified lines
15771587 unlock ("page");
15781588
15791589 printd ("page %" PRIxPTR " %f", (uintptr_t) page, b - a);
1590+ break;
15801591 }
1581− CASE (tile) {
1592+ case Ctile: {
15821593 int x, y, w, h;
15831594 struct page *page;
15841595 struct tile *tile;
15851596 double a, b;
15861597 void *data;
15871598
1588− ret = sscanf (p + 4, " %" SCNxPTR " %d %d %d %d %" SCNxPTR,
1599+ ret = sscanf (p, " %" SCNxPTR " %d %d %d %d %" SCNxPTR,
15891600 (uintptr_t *) &page, &x, &y, &w, &h,
15901601 (uintptr_t *) &data);
15911602 if (ret != 6) {
@@ -1602,12 +1613,13 @@ static void * mainloop (void UNUSED_ATTR *unused) · 10 unmodified lines
16021613 x, y, (uintptr_t) (tile),
16031614 tile->w * tile->h * tile->pixmap->n,
16041615 b - a);
1616+ break;
16051617 }
1606− CASE (trimset) {
1618+ case Ctrimset: {
16071619 fz_irect fuzz;
16081620 int trimmargins;
16091621
1610− ret = sscanf (p + 7, " %d %d %d %d %d",
1622+ ret = sscanf (p, " %d %d %d %d %d",
16111623 &trimmargins, &fuzz.x0, &fuzz.y0, &fuzz.x1, &fuzz.y1);
16121624 if (ret != 5) {
16131625 errx (1, "malformed trimset `%.*s' ret=%d", len, p, ret);
@@ -1620,12 +1632,13 @@ static void * mainloop (void UNUSED_ATTR *unused) · 6 unmodified lines
16201632 state.trimfuzz = fuzz;
16211633 }
16221634 unlock ("trimset");
1635+ break;
16231636 }
1624− CASE (settrim) {
1637+ case Csettrim: {
16251638 fz_irect fuzz;
16261639 int trimmargins;
16271640
1628− ret = sscanf (p + 7, " %d %d %d %d %d",
1641+ ret = sscanf (p, " %d %d %d %d %d",
16291642 &trimmargins, &fuzz.x0, &fuzz.y0, &fuzz.x1, &fuzz.y1);
16301643 if (ret != 5) {
16311644 errx (1, "malformed settrim `%.*s' ret=%d", len, p, ret);
@@ -1646,11 +1659,12 @@ static void * mainloop (void UNUSED_ATTR *unused) · 14 unmodified lines
16461659 process_outline ();
16471660 unlock ("settrim");
16481661 printd ("continue %d", state.pagecount);
1662+ break;
16491663 }
1650− CASE (sliceh) {
1664+ case Csliceh: {
16511665 int h;
16521666
1653− ret = sscanf (p + 6, " %d", &h);
1667+ ret = sscanf (p, " %d", &h);
16541668 if (ret != 1) {
16551669 errx (1, "malformed sliceh `%.*s' ret=%d", len, p, ret);
16561670 }
@@ -1662,12 +1676,12 @@ static void * mainloop (void UNUSED_ATTR *unused) · 5 unmodified lines
16621676 state.tex.owners[i].slice = NULL;
16631677 }
16641678 }
1679+ break;
16651680 }
1666− CASE (interrupt) {
1681+ case Cinterrupt:
16671682 printd ("vmsg interrupted");
1668− }
1669−#undef CASE
1670− else {
1683+ break;
1684+ default:
16711685 errx (1, "unknown command %.*s", len, p);
16721686 }
16731687 }
main.ml+37−20
@@ -184,10 +184,27 @@ let intentry_with_suffix text key = · 183 unmodified lines
184184 TEcont text
185185 ;;
186186
187−let wcmd fmt =
187+module C = struct
188+ let dopen = '\000';;
189+ let cs = '\001';;
190+ let freepage = '\002';;
191+ let freetile = '\003';;
192+ let search = '\004';;
193+ let geometry = '\005';;
194+ let reqlayout = '\006';;
195+ let page = '\007';;
196+ let tile = '\008';;
197+ let trimset = '\009';;
198+ let settrim = '\010';;
199+ let sliceh = '\011';;
200+ let interrupt = '\012';;
201+end;;
202+
203+let wcmd cmd fmt =
188204 let b = Buffer.create 16 in
189205 Printf.kbprintf
190206 (fun b ->
207+ Buffer.add_char b cmd;
191208 let b = Buffer.to_bytes b in
192209 Ffi.wcmd state.ss b @@ Bytes.length b
193210 ) b fmt
@@ -521,7 +538,7 @@ let tilepage n p layout = · 327 unmodified lines
521538 then Ffi.getpbo w h conf.colorspace
522539 else ~< "0"
523540 in
524− wcmd "tile %s %d %d %d %d %s" (~> p) x y w h (~> pbo);
541+ wcmd C.tile "%s %d %d %d %d %s" (~> p) x y w h (~> pbo);
525542 state.currently <-
526543 Tiling (
527544 l, p, conf.colorspace, conf.angle,
@@ -554,7 +571,7 @@ let load pages = · 26 unmodified lines
554571 | l :: rest ->
555572 begin match getopaque l.pageno with
556573 | None ->
557− wcmd "page %d %d" l.pageno l.pagedimno;
574+ wcmd C.page "%d %d" l.pageno l.pagedimno;
558575 state.currently <- Loading (l, state.gen);
559576 | Some opaque ->
560577 tilepage l.pageno opaque pages;
@@ -730,7 +747,7 @@ let invalidate s f = · 169 unmodified lines
730747 ;;
731748
732749 let flushpages () =
733− Hashtbl.iter (fun _ opaque -> wcmd "freepage %s" (~> opaque)) state.pagemap;
750+ Hashtbl.iter (fun _ opaque -> wcmd C.freepage "%s" (~> opaque)) state.pagemap;
734751 Hashtbl.clear state.pagemap;
735752 ;;
736753
@@ -738,7 +755,7 @@ let flushtiles () = · 1 unmodified line
738755 if not (Queue.is_empty state.tilelru)
739756 then (
740757 Queue.iter (fun (k, p, s) ->
741− wcmd "freetile %s" (~> p);
758+ wcmd C.freetile "%s" (~> p);
742759 state.memused <- state.memused - s;
743760 Hashtbl.remove state.tilemap k;
744761 ) state.tilelru;
@@ -782,12 +799,12 @@ let opendoc path password = · 37 unmodified lines
782799 else state.origin
783800 in
784801 Wsi.settitle ("llpp " ^ mbtoutf8 (Filename.basename titlepath));
785− wcmd "open %d %d %s\000%s\000%s\000"
802+ wcmd C.dopen "%d %d %s\000%s\000%s\000"
786803 (btod conf.usedoccss) !layouth
787804 path password conf.css;
788805 invalidate "reqlayout"
789806 (fun () ->
790− wcmd "reqlayout %d %d %d %s\000"
807+ wcmd C.reqlayout " %d %d %d %s\000"
791808 conf.angle (FMTE.to_int conf.fitmodel)
792809 (stateh state.winh) state.nameddest
793810 );
@@ -987,7 +1004,7 @@ let reshape ?(firsttime=false) w h = · 193 unmodified lines
9871004 | Cmulti ((c, _, _), _) -> (w - (c-1)*conf.interpagespace) / c
9881005 | Csplit (c, _) -> w * c
9891006 in
990− wcmd "geometry %d %d %d" w (stateh h) (FMTE.to_int conf.fitmodel)
1007+ wcmd C.geometry "%d %d %d" w (stateh h) (FMTE.to_int conf.fitmodel)
9911008 );
9921009 ;;
9931010
@@ -1016,7 +1033,7 @@ let gctiles () = · 22 unmodified lines
10161033 then Queue.push lruitem state.tilelru
10171034 else (
10181035 Ffi.freepbo p;
1019− wcmd "freetile %s" (~> p);
1036+ wcmd C.freetile "%s" (~> p);
10201037 state.memused <- state.memused - s;
10211038 state.uioh#infochanged Memused;
10221039 Hashtbl.remove state.tilemap k;
@@ -1214,7 +1231,7 @@ let act cmds = · 191 unmodified lines
12141231 Hashtbl.fold (fun ((pageno, _) as key) opaque accu ->
12151232 if not (IntSet.mem pageno set)
12161233 then (
1217− wcmd "freepage %s" (~> opaque);
1234+ wcmd C.freepage "%s" (~> opaque);
12181235 key :: accu
12191236 )
12201237 else accu
@@ -1279,7 +1296,7 @@ let act cmds = · 58 unmodified lines
12791296 Ffi.unmappbo opaque;
12801297 if tilew != conf.tilew || tileh != conf.tileh
12811298 then (
1282− wcmd "freetile %s" (~> opaque);
1299+ wcmd C.freetile "%s" (~> opaque);
12831300 state.currently <- Idle;
12841301 load state.layout;
12851302 )
@@ -1424,7 +1441,7 @@ let search pattern forward = · 138 unmodified lines
14241441 | [] -> 0, 0
14251442 | l :: _ -> l.pageno, (l.pagey + if forward then 0 else 0*l.pagevh)
14261443 in
1427− wcmd "search %d %d %d %d,%s\000"
1444+ wcmd C.search "%d %d %d %d,%s\000"
14281445 (btod conf.icase) pn py (btod forward) pattern;
14291446 ;;
14301447
@@ -1488,7 +1505,7 @@ let reqlayout angle fitmodel = · 57 unmodified lines
14881505 );
14891506 conf.fitmodel <- fitmodel;
14901507 invalidate "reqlayout"
1491− (fun () -> wcmd "reqlayout %d %d %d"
1508+ (fun () -> wcmd C.reqlayout "%d %d %d"
14921509 conf.angle (FMTE.to_int conf.fitmodel) (stateh state.winh));
14931510 ;;
14941511
@@ -1499,7 +1516,7 @@ let settrim trimmargins trimfuzz = · 4 unmodified lines
14991516 conf.trimfuzz <- trimfuzz;
15001517 let x0, y0, x1, y1 = trimfuzz in
15011518 invalidate "settrim"
1502− (fun () -> wcmd "settrim %d %d %d %d %d"
1519+ (fun () -> wcmd C.settrim "%d %d %d %d %d"
15031520 (btod conf.trimmargins) x0 y0 x1 y1);
15041521 flushpages ();
15051522 ;;
@@ -1985,7 +2002,7 @@ let gotohist (path, c, bookmarks, x, anchor, origin) = · 479 unmodified lines
19852002 setconf conf c;
19862003 Ffi.setdcf conf.dcf;
19872004 let x0, y0, x1, y1 = conf.trimfuzz in
1988− wcmd "trimset %d %d %d %d %d" (btod conf.trimmargins) x0 y0 x1 y1;
2005+ wcmd C.trimset "%d %d %d %d %d" (btod conf.trimmargins) x0 y0 x1 y1;
19892006 Wsi.reshape c.cwinw c.cwinh;
19902007 opendoc path origin;
19912008 setzoom c.zoom;
@@ -2503,7 +2520,7 @@ let enterinfomode = · 511 unmodified lines
25032520 (fun () -> conf.sliceheight)
25042521 (fun v ->
25052522 conf.sliceheight <- v;
2506− wcmd "sliceh %d" conf.sliceheight;
2523+ wcmd C.sliceh "%d" conf.sliceheight;
25072524 );
25082525 src#int "anti-aliasing level"
25092526 (fun () -> conf.aalevel)
@@ -2566,7 +2583,7 @@ let enterinfomode = · 56 unmodified lines
25662583 (fun () -> CSTE.to_string conf.colorspace)
25672584 (fun v ->
25682585 conf.colorspace <- CSTE.of_int v;
2569− wcmd "cs %d" v;
2586+ wcmd C.cs "%d" v;
25702587 load state.layout;
25712588 );
25722589 src#paxmark "pax mark method"
@@ -2870,7 +2887,7 @@ let enterannotmode opaque slinkindex = · 297 unmodified lines
28702887 else split accu b (i+1)
28712888 in
28722889 let cleanup () =
2873− wcmd "freepage %s" (~> opaque);
2890+ wcmd C.freepage "%s" (~> opaque);
28742891 let keys =
28752892 Hashtbl.fold (fun key opaque' accu ->
28762893 if opaque' = opaque'
@@ -3948,7 +3965,7 @@ let linknavkeyboard key mask linknav = · 1071 unmodified lines
39483965
39493966 let keyboard key mask =
39503967 if (key = Char.code 'g' && Wsi.withctrl mask) && not (istextentry state.mode)
3951− then wcmd "interrupt"
3968+ then wcmd C.interrupt ""
39523969 else state.uioh <- state.uioh#key key mask
39533970 ;;
39543971
@@ -4273,7 +4290,7 @@ let annot inline x y = · 318 unmodified lines
42734290 | Some (opaque, n, ux, uy) ->
42744291 let add text =
42754292 Ffi.addannot opaque ux uy text;
4276− wcmd "freepage %s" (~> opaque);
4293+ wcmd C.freepage "%s" (~> opaque);
42774294 Hashtbl.remove state.pagemap (n, state.gen);
42784295 flushtiles ();
42794296 gotoxy state.x state.y

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t