func areaDataEnd()

in imfg/imfg.go [85:135]


func areaDataEnd(area flash.FlashArea, man manifest.MfgManifest) (int, error) {
	end := 0

	// Updates `end` if the specified region extends beyond our current concept
	// of "the end".
	checkOne := func(offset int, size int) error {
		a := man.FindWithinFlashAreaDevOff(man.Device, offset)
		if a.Id != area.Id {
			// Data belongs to a different area.
			return nil
		}

		// Older manifests do not contain target size information.
		if size <= 0 {
			return errors.Errorf(
				"failed to calculate end offset of data at %d: "+
					"manifest lacks size",
				offset)
		}

		subEnd := offset - a.Offset + size
		if subEnd > end {
			end = subEnd
		}

		return nil
	}

	for _, t := range man.Targets {
		err := checkOne(t.Offset, t.Size)
		if err != nil {
			return 0, err
		}
	}

	for _, r := range man.Raws {
		err := checkOne(r.Offset, r.Size)
		if err != nil {
			return 0, err
		}
	}

	if man.Meta != nil {
		err := checkOne(man.Meta.EndOffset-1, 1)
		if err != nil {
			return 0, err
		}
	}

	return end, nil
}