blob: 5e0f143a6f8cc0aecc8a98b3243674a1ca033694 [file] [log] [blame]
Tim Edwardsfa1b3ad2021-07-12 16:08:02 -04001#!/usr/bin/env python3
2# Script to read a GDS file and print out the timestamp(s).
3
4import os
5import sys
6import datetime
7
8def usage():
9 print('get_gds_date.py <path_to_gds_in> [-created | -modified]')
10
11if __name__ == '__main__':
12 debug = False
13
14 if len(sys.argv) == 1:
15 print("No options given to change_gds_date.py.")
16 usage()
17 sys.exit(0)
18
19 optionlist = []
20 arguments = []
21
22 for option in sys.argv[1:]:
23 if option.find('-', 0) == 0:
24 optionlist.append(option)
25 else:
26 arguments.append(option)
27
28 if len(arguments) != 1:
29 print("Wrong number of arguments given to get_gds_date.py.")
30 usage()
31 sys.exit(0)
32
33 created = True
34 modified = True
35
36 if '-debug' in optionlist:
37 debug = True
38 if '-created' in optionlist:
39 modified = False
40 if '-modified' in optionlist:
41 created = False
42
43 source = arguments[0]
44
45 sourcedir = os.path.split(source)[0]
46 gdsinfile = os.path.split(source)[1]
47
48 with open(source, 'rb') as ifile:
49 gdsdata = ifile.read()
50
51 datalen = len(gdsdata)
52 dataptr = 0
53 while dataptr < datalen:
54 # Read stream records up to any string, then search for search text.
55 bheader = gdsdata[dataptr:dataptr + 2]
56 reclen = int.from_bytes(bheader, 'big')
57 if reclen == 0:
58 print('Error: found zero-length record at position ' + str(dataptr))
59 break
60
61 rectype = gdsdata[dataptr + 2]
62 datatype = gdsdata[dataptr + 3]
63
64 brectype = rectype.to_bytes(1, byteorder='big')
65 bdatatype = datatype.to_bytes(1, byteorder='big')
66
67 if rectype == 1: # 1 = beginlib
68 # Datatype should be 2
69 if datatype != 2:
70 print('Error: Header data type is not 2-byte integer!')
71 if reclen != 28:
72 print('Error: Header record length is not 28!')
73 if debug:
74 print('Record type = ' + str(rectype) + ' data type = ' + str(datatype) + ' length = ' + str(reclen))
75
76 if created:
77 crec1 = gdsdata[dataptr + 4:dataptr + 6]
78 crec2 = gdsdata[dataptr + 6:dataptr + 8]
79 crec3 = gdsdata[dataptr + 8:dataptr + 10]
80 crec4 = gdsdata[dataptr + 10:dataptr + 12]
81 crec5 = gdsdata[dataptr + 12:dataptr + 14]
82 crec6 = gdsdata[dataptr + 14:dataptr + 16]
83
84 modyear = int.from_bytes(crec1, 'big')
85 year = modyear + 1900
86 month = int.from_bytes(crec2, 'big')
87 day = int.from_bytes(crec3, 'big')
88 hour = int.from_bytes(crec4, 'big')
89 minute = int.from_bytes(crec5, 'big')
90 second = int.from_bytes(crec6, 'big')
91
92 print('Created date: {}-{}-{}-{}-{}-{}'.format(year, month, day, hour, minute, second))
93
94 if modified:
95 mrec1 = gdsdata[dataptr + 16:dataptr + 18]
96 mrec2 = gdsdata[dataptr + 18:dataptr + 20]
97 mrec3 = gdsdata[dataptr + 20:dataptr + 22]
98 mrec4 = gdsdata[dataptr + 22:dataptr + 24]
99 mrec5 = gdsdata[dataptr + 24:dataptr + 26]
100 mrec6 = gdsdata[dataptr + 26:dataptr + 28]
101
102 modyear = int.from_bytes(mrec1, 'big')
103 year = modyear + 1900
104 month = int.from_bytes(mrec2, 'big')
105 day = int.from_bytes(mrec3, 'big')
106 hour = int.from_bytes(mrec4, 'big')
107 minute = int.from_bytes(mrec5, 'big')
108 second = int.from_bytes(mrec6, 'big')
109
110 print('Modified date: {}-{}-{}-{}-{}-{}'.format(year, month, day, hour, minute, second))
111 break
112
113 # Advance the pointer past the data
114 dataptr += reclen
115
116 exit(0)