\ stdin slurp-fid 2constant bib s" data/nopages.bib" slurp-file 2constant bib s" data/proceedings.toc" slurp-file 2constant toc : search-rest ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag ) \ search for c-addr2 u2 in c-addr1 u1, caddr3 u3 is the part after \ the found string dup >r search if r> /string true else rdrop false then ; : skip-blanks ( c-addr end -- c-addr1 ) begin 2dup u< while over c@ bl = while swap 1+ swap repeat then drop ; : string-prefix?-b ( c-addr1 u1 c-addr2 u2 - false | c-addr3 true ) \ like string-prefix?, but ignore blanks; c-addr3 is the first \ char after the match in c-addr1 over + { end2 } >r over + { end1 } begin ( c-addr1 r: c-addr2 ) r> end2 skip-blanks >r end1 skip-blanks r@ end2 = if rdrop true exit then dup end1 = if drop rdrop false exit then dup c@ r@ c@ <> if drop rdrop false exit then 1+ r> 1+ >r again ; : search-rest-b { c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag } \ like SEARCH-REST, but ignore blanks c-addr1 u1 u1 0 ?do ( c-addr1 u1 ) 2dup c-addr2 u2 string-prefix?-b if 2 pick - /string true unloop exit then 1 /string loop 2drop c-addr1 u1 ; : .pages ( n1 n2 -- ) 1- 2dup = if 0 .r drop else swap 0 .r ." --" 0 .r then ; : get-page { title title-e -- n ) toc title title-e over - search-rest-b 0= abort" title in toc missing" 2 /string 0. 2swap ~~ >number 2drop drop ; : get-#pages ( -- n ) 0. s" pdfinfo data/proceedings.pdf|awk '/^Pages:/ {print $2}'" r/o open-pipe throw slurp-fid >number 2drop drop ; : addpages ( -- ) bib over 0 begin ( c-addr u last-from last-page ) { from last-page } s\" @InProceedings{" search-rest while ( c-addr1 u1 ) s\" \n title = {" search-rest 0= abort" no title" over { title } s\" },\n" search 0= abort" end of title" over { title-e } s\" \n pages = {" search-rest 0= abort" pages" title title-e get-page { page } from bib drop <> if last-page page .pages then from 2 pick over - type over page repeat last-page get-#pages .pages type ;