<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def prepread(sheet, header=True, startcell=None, stopcell=None):
 """Return four StartStop objects, defining the outer bounds of header row and data range, respectively. If header is False, the first two items will be None. --> [headstart, headstop, datstart, datstop] sheet: xlrd.sheet.Sheet instance Ready for use. header: bool or str True if the defined data range includes a header with field names. Else False - the whole range is data. If a string, it is spread sheet style notation of the startcell for the header ("F9"). The "width" of this record is the same as for the data. startcell: str or None If given, a spread sheet style notation of the cell where reading start, ("F9"). stopcell: str or None A spread sheet style notation of the cell where data end, ("F9"). startcell and stopcell can both be None, either one specified or both specified. Note to self: consider making possible to specify headers in a column. """

    datstart, datstop = _get_startstop(sheet, startcell, stopcell)
    headstart, headstop = StartStop(0, 0), StartStop(0, 0)  # Holders

    def typicalprep():
        headstart.row, headstart.col = datstart.row, datstart.col
        headstop.row, headstop.col = datstart.row + 1, datstop.col
        # Tick the data start row by 1:
        datstart.row += 1

    def offsetheaderprep():
        headstart.row, headstart.col = headrow, headcol
        headstop.row = headrow + 1
        headstop.col = headcol + (datstop.col - datstart.col)  # stop > start

    if header is True:          # Simply the toprow of the table.
        typicalprep()
        return [headstart, headstop, datstart, datstop]
    elif header:                # Then it is a string if not False. ("F9")
        m = re.match(XLNOT_RX, header)
        headrow = int(m.group(2)) - 1
        headcol = letter2num(m.group(1), zbase=True)
        if headrow == datstart.row and headcol == datstart.col:
            typicalprep()
            return [headstart, headstop, datstart, datstop]
        elif headrow == datstart.row:
            typicalprep()
            offsetheaderprep()
            return [headstart, headstop, datstart, datstop]
        else:
            offsetheaderprep()
            return [headstart, headstop, datstart, datstop]
    else:                       # header is False
        return [None, None, datstart, datstop]