// initw read a file .LIF and configure the world with it func initw(f *os.File) bool { var r *strings.Reader var b byte var x, y, oldy int input := bufio.NewScanner(f) input.Scan() if input.Text() != "#Life 1.05" { fmt.Fprintf(os.Stderr, "ERROR: The file for initialization the world is not a valid .LIF format\n") return false } header: // Read header of .LIF for input.Scan() { r = strings.NewReader(input.Text()) b, _ = r.ReadByte() if b != '#' { fmt.Println(input.Text()) } else { b, _ = r.ReadByte() switch b { case 'D': { fmt.Println("Description") } case 'N': { fmt.Println("Rules Conway R 23/3") } case 'R': { fmt.Fprintf(os.Stderr, "ERROR: 'R' option not implemented\n") return false } case 'P': { s := strings.Split(input.Text(), " ") x, _ = strconv.Atoi(s[1]) y, _ = strconv.Atoi(s[2]) x += (M / 2) y += (N / 2) oldy = y break header // Exit loop, now only blocks of position and cells } default: { fmt.Fprintf(os.Stderr, "ERROR: Option in header not implemented\n") return false } } } } var p Point m := map[Point]int{} // Read patterns and positions for input.Scan() { r = strings.NewReader(input.Text()) b, _ = r.ReadByte() if b == '#' { b, _ = r.ReadByte() if b == 'P' { s := strings.Split(input.Text(), " ") x, _ = strconv.Atoi(s[1]) y, _ = strconv.Atoi(s[2]) x += (M / 2) y += (N / 2) oldy = y } else { fmt.Fprintf(os.Stderr, "ERROR: Expected Position or blocks not config parameters\n") return false } } else { p.x = x for cells := int(r.Size()); cells > 0; cells-- { p.y = y switch b { case '.': { //m[p] = 0 } case '*': { m[p] = 1 } default: { fmt.Fprintf(os.Stderr, "ERROR: Character not valid, only '.' or '*'\n") return false } } b, _ = r.ReadByte() y++ } } x++ y = oldy } w.Matrix[0] = m return true // NOTE: ignoring potential errors from input.Err() }