|
| 1 | +package unfoldcpp |
| 2 | + |
| 3 | +import ( |
| 4 | + "os" |
| 5 | +) |
| 6 | + |
| 7 | +func Unfold(path string) (string, error) { |
| 8 | + // trace dependencies recursively |
| 9 | + founded_queue := make([]string, 0) |
| 10 | + founded_list := make([]string, 0) |
| 11 | + resolved_queue := make([]string, 0) |
| 12 | + founded_queue = append(founded_queue, path) |
| 13 | + founded_list = append(founded_list, path) |
| 14 | + err := unfold_recursively(&founded_queue, &resolved_queue, &founded_list) |
| 15 | + if err != nil { |
| 16 | + return "", err |
| 17 | + } |
| 18 | + // build single-file |
| 19 | + single_file := "#define UNFOLDED\n" |
| 20 | + for _, path := range resolved_queue { |
| 21 | + data, err := os.ReadFile(path) |
| 22 | + if err != nil { |
| 23 | + return "", err |
| 24 | + } |
| 25 | + single_file += string(data) + "\n" |
| 26 | + } |
| 27 | + return single_file, nil |
| 28 | +} |
| 29 | + |
| 30 | +func unfold_recursively(founded_queue *[]string, resolved_queue *[]string, founded_list *[]string) error { |
| 31 | + // pop |
| 32 | + path := (*founded_queue)[0] |
| 33 | + *founded_queue = (*founded_queue)[1:] |
| 34 | + // construct HppFile |
| 35 | + hpp := NewHppFile(path) |
| 36 | + // trace dependencies |
| 37 | + dependencies, err := hpp.TraceDependencies() |
| 38 | + if err != nil { |
| 39 | + return err |
| 40 | + } |
| 41 | + // add dependencies to founded_queue if not already in founded_list |
| 42 | + for _, dependency := range dependencies { |
| 43 | + founded_formerly := false |
| 44 | + for _, founded_path := range *founded_list { |
| 45 | + if founded_path == dependency { |
| 46 | + founded_formerly = true |
| 47 | + break |
| 48 | + } |
| 49 | + } |
| 50 | + if !founded_formerly { |
| 51 | + *founded_queue = append(*founded_queue, dependency) |
| 52 | + *founded_list = append(*founded_list, dependency) |
| 53 | + unfold_recursively(founded_queue, resolved_queue, founded_list) |
| 54 | + } |
| 55 | + } |
| 56 | + // add path to resolved_queue |
| 57 | + *resolved_queue = append(*resolved_queue, path) |
| 58 | + return nil |
| 59 | +} |
0 commit comments