1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
--
-- This is file `expl3.lua',
-- generated with the docstrip utility.
--
-- The original source files were:
--
-- l3luatex.dtx (with options: `package,lua')
--
-- Copyright (C) 1990-2017 The LaTeX3 Project
--
-- It may be distributed and/or modified under the conditions of
-- the LaTeX Project Public License (LPPL), either version 1.3c of
-- this license or (at your option) any later version. The latest
-- version of this license is in the file:
--
-- https://www.latex-project.org/lppl.txt
--
-- This file is part of the "l3kernel bundle" (The Work in LPPL)
-- and all files in that bundle must be distributed together.
--
-- File: l3luatex.dtx Copyright (C) 2010-2018 The LaTeX3 Project
l3kernel = l3kernel or { }
local io = io
local kpse = kpse
local lfs = lfs
local math = math
local md5 = md5
local os = os
local string = string
local tex = tex
local unicode = unicode
local abs = math.abs
local byte = string.byte
local floor = math.floor
local format = string.format
local gsub = string.gsub
local kpse_find = kpse.find_file
local lfs_attr = lfs.attributes
local md5_sum = md5.sum
local open = io.open
local os_date = os.date
local setcatcode = tex.setcatcode
local str_format = string.format
local sprint = tex.sprint
local write = tex.write
local utf8_char = unicode.utf8.char
local function escapehex(str)
write((gsub(str, ".",
function (ch) return format("%02X", byte(ch)) end)))
end
local charcat_table = l3kernel.charcat_table or 1
local function charcat(charcode, catcode)
setcatcode(charcat_table, charcode, catcode)
sprint(charcat_table, utf8_char(charcode))
end
l3kernel.charcat = charcat
local function filemdfivesum(name)
local file = kpse_find(name, "tex", true)
if file then
local f = open(file, "rb")
if f then
local data = f:read("*a")
escapehex(md5_sum(data))
f:close()
end
end
end
l3kernel.filemdfivesum = filemdfivesum
local function filemoddate(name)
local file = kpse_find(name, "tex", true)
if file then
local date = lfs_attr(file, "modification")
if date then
local d = os_date("*t", date)
if d.sec >= 60 then
d.sec = 59
end
local u = os_date("!*t", date)
local off = 60 * (d.hour - u.hour) + d.min - u.min
if d.year ~= u.year then
if d.year > u.year then
off = off + 1440
else
off = off - 1440
end
elseif d.yday ~= u.yday then
if d.yday > u.yday then
off = off + 1440
else
off = off - 1440
end
end
local timezone
if off == 0 then
timezone = "Z"
else
local hours = floor(off / 60)
local mins = abs(off - hours * 60)
timezone = str_format("%+03d", hours)
.. "'" .. str_format("%02d", mins) .. "'"
end
write("D:"
.. str_format("%04d", d.year)
.. str_format("%02d", d.month)
.. str_format("%02d", d.day)
.. str_format("%02d", d.hour)
.. str_format("%02d", d.min)
.. str_format("%02d", d.sec)
.. timezone)
end
end
end
l3kernel.filemoddate = filemoddate
local function filesize(name)
local file = kpse_find(name, "tex", true)
if file then
local size = lfs_attr(file, "size")
if size then
write(size)
end
end
end
l3kernel.filesize = filesize
local function strcmp(A, B)
if A == B then
write("0")
elseif A < B then
write("-1")
else
write("1")
end
end
l3kernel.strcmp = strcmp
|