os: add basic OS functionality
Этот коммит содержится в:
		
							родитель
							
								
									f7b2a2c977
								
							
						
					
					
						коммит
						709a296150
					
				
					 6 изменённых файлов: 114 добавлений и 1 удалений
				
			
		
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -82,7 +82,7 @@ clean: | ||||||
| 	@rm -rf build | 	@rm -rf build | ||||||
| 
 | 
 | ||||||
| fmt: | fmt: | ||||||
| 	@go fmt . ./compiler ./interp ./loader ./ir ./src/device/arm ./src/examples/* ./src/machine ./src/runtime ./src/sync | 	@go fmt . ./compiler ./interp ./loader ./ir ./src/device/arm ./src/examples/* ./src/machine ./src/os ./src/runtime ./src/sync | ||||||
| 	@go fmt ./testdata/*.go | 	@go fmt ./testdata/*.go | ||||||
| 
 | 
 | ||||||
| test: | test: | ||||||
|  |  | ||||||
							
								
								
									
										40
									
								
								src/os/file.go
									
										
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										40
									
								
								src/os/file.go
									
										
									
									
									
										Обычный файл
									
								
							|  | @ -0,0 +1,40 @@ | ||||||
|  | // Package os implements a subset of the Go "os" package. See | ||||||
|  | // https://godoc.org/os for details. | ||||||
|  | // | ||||||
|  | // Note that the current implementation is blocking. This limitation should be | ||||||
|  | // removed in a future version. | ||||||
|  | package os | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Portable analogs of some common system call errors. | ||||||
|  | var ( | ||||||
|  | 	ErrUnsupported = errors.New("operation not supported") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Stdin, Stdout, and Stderr are open Files pointing to the standard input, | ||||||
|  | // standard output, and standard error file descriptors. | ||||||
|  | var ( | ||||||
|  | 	Stdin  = &File{0, "/dev/stdin"} | ||||||
|  | 	Stdout = &File{1, "/dev/stdout"} | ||||||
|  | 	Stderr = &File{2, "/dev/stderr"} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // File represents an open file descriptor. | ||||||
|  | type File struct { | ||||||
|  | 	fd   uintptr | ||||||
|  | 	name string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewFile returns a new File with the given file descriptor and name. | ||||||
|  | func NewFile(fd uintptr, name string) *File { | ||||||
|  | 	return &File{fd, name} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Fd returns the integer Unix file descriptor referencing the open file. The | ||||||
|  | // file descriptor is valid only until f.Close is called. | ||||||
|  | func (f *File) Fd() uintptr { | ||||||
|  | 	return f.fd | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								src/os/file_unix.go
									
										
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										24
									
								
								src/os/file_unix.go
									
										
									
									
									
										Обычный файл
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | // +build linux | ||||||
|  | 
 | ||||||
|  | package os | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"syscall" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Read reads up to len(b) bytes from the File. It returns the number of bytes | ||||||
|  | // read and any error encountered. At end of file, Read returns 0, io.EOF. | ||||||
|  | func (f *File) Read(b []byte) (n int, err error) { | ||||||
|  | 	return syscall.Read(int(f.fd), b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Write writes len(b) bytes to the File. It returns the number of bytes written | ||||||
|  | // and an error, if any. Write returns a non-nil error when n != len(b). | ||||||
|  | func (f *File) Write(b []byte) (n int, err error) { | ||||||
|  | 	return syscall.Write(int(f.fd), b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Close closes the File, rendering it unusable for I/O. | ||||||
|  | func (f *File) Close() error { | ||||||
|  | 	return syscall.Close(int(f.fd)) | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								src/os/file_wasm.go
									
										
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										34
									
								
								src/os/file_wasm.go
									
										
									
									
									
										Обычный файл
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | // +build wasm | ||||||
|  | 
 | ||||||
|  | package os | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	_ "unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Read is unsupported on this system. | ||||||
|  | func (f *File) Read(b []byte) (n int, err error) { | ||||||
|  | 	return 0, ErrUnsupported | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Write writes len(b) bytes to the output. It returns the number of bytes | ||||||
|  | // written or an error if this file is not stdout or stderr. | ||||||
|  | func (f *File) Write(b []byte) (n int, err error) { | ||||||
|  | 	switch f.fd { | ||||||
|  | 	case Stdout.fd, Stderr.fd: | ||||||
|  | 		for _, c := range b { | ||||||
|  | 			putchar(c) | ||||||
|  | 		} | ||||||
|  | 		return len(b), nil | ||||||
|  | 	default: | ||||||
|  | 		return 0, ErrUnsupported | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Close is unsupported on this system. | ||||||
|  | func (f *File) Close() error { | ||||||
|  | 	return ErrUnsupported | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //go:linkname putchar runtime.putchar | ||||||
|  | func putchar(c byte) | ||||||
							
								
								
									
										12
									
								
								testdata/stdlib.go
									
										
									
									
										предоставленный
									
									
										Обычный файл
									
								
							
							
						
						
									
										12
									
								
								testdata/stdlib.go
									
										
									
									
										предоставленный
									
									
										Обычный файл
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	fmt.Println("stdin: ", os.Stdin.Fd()) | ||||||
|  | 	fmt.Println("stdout:", os.Stdout.Fd()) | ||||||
|  | 	fmt.Println("stderr:", os.Stderr.Fd()) | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								testdata/stdlib.txt
									
										
									
									
										предоставленный
									
									
										Обычный файл
									
								
							
							
						
						
									
										3
									
								
								testdata/stdlib.txt
									
										
									
									
										предоставленный
									
									
										Обычный файл
									
								
							|  | @ -0,0 +1,3 @@ | ||||||
|  | stdin:  0 | ||||||
|  | stdout: 1 | ||||||
|  | stderr: 2 | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem