#!/bin/env python3
# Script to read a GDS file, modify the given string, and rewrite the GDS file.
# The string may be a substring;  the GDS file will be parsed completely for
# library name, structure name, instance name, and other strings, and the
# replacement made everywhere it occurs, finding the bounds of the entire
# string around the search text, and adjusting the record bounds accordingly.

import os
import sys

def usage():
    print('change_gds_string.py <old_string> <new_string> <path_to_gds_in> [<path_to_gds_out>]')

if __name__ == '__main__':
    debug = False

    if len(sys.argv) == 1:
        print("No options given to change_gds_string.py.")
        usage()
        sys.exit(0)

    optionlist = []
    arguments = []

    for option in sys.argv[1:]:
        if option.find('-', 0) == 0:
            optionlist.append(option)
        else:
            arguments.append(option)

    if len(arguments) < 3 or len(arguments) > 4:
        print("Wrong number of arguments given to change_gds_string.py.")
        usage()
        sys.exit(0)

    if '-debug' in optionlist:
        debug = True

    oldstring = arguments[0]
    newstring = arguments[1]
    source = arguments[2]

    # If only three arguments are provided, then overwrite the source file.
    if len(arguments) == 4:
        dest = arguments[3]
    else:
        dest = arguments[2]

    sourcedir = os.path.split(source)[0]
    gdsinfile = os.path.split(source)[1]

    destdir = os.path.split(dest)[0]
    gdsoutfile = os.path.split(dest)[1]

    with open(source, 'rb') as ifile:
        gdsdata = ifile.read()

    # To be done:  Allow the user to select a specific record type or types
    # in which to restrict the string substitution.  If no restrictions are
    # specified, then substitue in library name, structure name, and strings.

    recordtypes = ['libname', 'strname', 'sname', 'string']
    recordfilter = [2, 6, 18, 25]
    bsearch = bytes(oldstring, 'ascii')
    brep = bytes(newstring, 'ascii')

    datalen = len(gdsdata)
    if debug:
        print('Original data length = ' + str(datalen))
    dataptr = 0
    while dataptr < datalen:
        # Read stream records up to any string, then search for search text.
        bheader = gdsdata[dataptr:dataptr + 2]
        reclen = int.from_bytes(bheader, 'big')
        newlen = reclen
        if newlen == 0:
            print('Error: found zero-length record at position ' + str(dataptr))
            break

        rectype = gdsdata[dataptr + 2]
        datatype = gdsdata[dataptr + 3]

        if rectype in recordfilter:
            # Datatype 6 is STRING
            if datatype == 6:
                if debug:
                    print('Record type = ' + str(rectype) + ' data type = ' + str(datatype) + ' length = ' + str(reclen))

                bstring = gdsdata[dataptr + 4: dataptr + reclen]
                repstring = bstring.replace(bsearch, brep)
                if repstring != bstring:
                    before = gdsdata[0:dataptr]
                    after = gdsdata[dataptr + reclen:]
                    newlen = len(repstring) + 4
                    # Record sizes must be even
                    if newlen % 2 != 0:
                        # Was original string padded with null byte?  If so,
                        # remove the null byte and reduce newlen.  Otherwise,
                        # add a null byte and increase newlen.
                        if bstring[-1] == 0:
                            repstring = repstring[0:-1]
                            newlen -= 1
                        else:
                            repstring += b'\x00'
                            newlen += 1
                            
                    bnewlen = newlen.to_bytes(2, byteorder='big')
                    brectype = rectype.to_bytes(1, byteorder='big')
                    bdatatype = datatype.to_bytes(1, byteorder='big')

                    # Assemble the new record
                    newrecord = bnewlen + brectype + bdatatype + repstring
                    # Reassemble the GDS data around the new record
                    gdsdata = before + newrecord[0:newlen] + after
                    # Adjust the data end location
                    datalen += (newlen - reclen)

                    if debug:
                        print('Replaced ' + str(bstring) + ' with ' + str(repstring)) 

        # Advance the pointer past the data
        dataptr += newlen

    with open(dest, 'wb') as ofile:
        ofile.write(gdsdata)

    exit(0)
