| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | // Copyright 2009 The Go Authors.  All rights reserved. | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style | 
					
						
							|  |  |  | // license that can be found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package Platform | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | import IO "io" | 
					
						
							|  |  |  | import OS "os" | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | import Utils "utils" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------- | 
					
						
							|  |  |  | // Environment | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:40:40 -08:00
										 |  |  | var | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | 	GOARCH, | 
					
						
							|  |  |  | 	GOOS, | 
					
						
							|  |  |  | 	GOROOT, | 
					
						
							|  |  |  | 	USER string; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func init() { | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | 	var e *OS.Error; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GOARCH, e = OS.Getenv("GOARCH"); | 
					
						
							|  |  |  | 	GOOS, e = OS.Getenv("GOOS"); | 
					
						
							|  |  |  | 	GOROOT, e = OS.Getenv("GOROOT"); | 
					
						
							|  |  |  | 	USER, e = OS.Getenv("USER"); | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------- | 
					
						
							|  |  |  | // I/O | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:40:40 -08:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2008-10-26 21:32:30 -07:00
										 |  |  | 	MAGIC_obj_file = "@gri-go.7@v0";  // make it clear that it cannot be a source file | 
					
						
							| 
									
										
										
										
											2009-01-15 17:16:41 -08:00
										 |  |  | 	Src_file_ext = ".go"; | 
					
						
							|  |  |  | 	Obj_file_ext = ".7"; | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-02 20:27:09 -08:00
										 |  |  | func readfile(filename string) ([]byte, *OS.Error) { | 
					
						
							| 
									
										
										
										
											2009-03-11 12:51:10 -07:00
										 |  |  | 	f, err := OS.Open(filename, OS.O_RDONLY, 0); | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2009-03-03 16:00:06 -08:00
										 |  |  | 		return []byte{}, err; | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	var buf [1<<20]byte; | 
					
						
							| 
									
										
										
										
											2009-03-11 12:51:10 -07:00
										 |  |  | 	n, err1 := IO.Readn(f, buf); | 
					
						
							|  |  |  | 	f.Close(); | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | 	if err1 == IO.ErrEOF { | 
					
						
							|  |  |  | 		err1 = nil; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-03-02 20:27:09 -08:00
										 |  |  | 	return buf[0:n], err1; | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func writefile(name, data string) *OS.Error { | 
					
						
							|  |  |  | 	fd, err := OS.Open(name, OS.O_WRONLY, 0); | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	n, err1 := IO.WriteString(fd, data); | 
					
						
							|  |  |  | 	fd.Close(); | 
					
						
							|  |  |  | 	return err1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-02 20:27:09 -08:00
										 |  |  | func ReadObjectFile(filename string) ([]byte, bool) { | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | 	data, err := readfile(filename + Obj_file_ext); | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | 	magic := MAGIC_obj_file;  // TODO remove once len(constant) works | 
					
						
							| 
									
										
										
										
											2009-03-02 20:27:09 -08:00
										 |  |  | 	if err == nil && len(data) >= len(magic) && string(data[0 : len(magic)]) == magic { | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | 		return data, true; | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-03-03 16:00:06 -08:00
										 |  |  | 	return []byte{}, false; | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-02 20:27:09 -08:00
										 |  |  | func ReadSourceFile(name string) ([]byte, bool) { | 
					
						
							| 
									
										
										
										
											2009-01-15 17:16:41 -08:00
										 |  |  | 	name = Utils.TrimExt(name, Src_file_ext) + Src_file_ext; | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | 	data, err := readfile(name); | 
					
						
							|  |  |  | 	return data, err == nil; | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:40:40 -08:00
										 |  |  | func WriteObjectFile(name string, data string) bool { | 
					
						
							| 
									
										
										
										
											2009-01-15 17:16:41 -08:00
										 |  |  | 	name = Utils.TrimExt(Utils.BaseName(name), Src_file_ext) + Obj_file_ext; | 
					
						
							| 
									
										
										
										
											2009-01-16 14:58:14 -08:00
										 |  |  | 	return writefile(name, data) != nil; | 
					
						
							| 
									
										
										
										
											2008-09-18 16:58:37 -07:00
										 |  |  | } |