mirror of https://github.com/Hilbis/Hilbish
80 lines
1.6 KiB
Go
80 lines
1.6 KiB
Go
|
//go:build !windows
|
||
|
// +build !windows
|
||
|
|
||
|
package readline
|
||
|
|
||
|
import (
|
||
|
"crypto/md5"
|
||
|
"encoding/hex"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// writeTempFile - This function optionally accepts a filename (generally specified with an extension).
|
||
|
func (rl *Instance) writeTempFile(content []byte, filename string) (string, error) {
|
||
|
// The final path to the buffer on disk
|
||
|
var path string
|
||
|
|
||
|
// If the user has not provided any filename (including an extension)
|
||
|
// we generate a random filename with no extension.
|
||
|
if filename == "" {
|
||
|
fileID := strconv.Itoa(time.Now().Nanosecond()) + ":" + string(rl.line)
|
||
|
|
||
|
h := md5.New()
|
||
|
_, err := h.Write([]byte(fileID))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
name := "readline-" + hex.EncodeToString(h.Sum(nil)) + "-" + strconv.Itoa(os.Getpid())
|
||
|
path = filepath.Join(rl.TempDirectory, name)
|
||
|
} else {
|
||
|
// Else, still use the temp/ dir, but with the provided filename
|
||
|
path = filepath.Join(rl.TempDirectory, filename)
|
||
|
}
|
||
|
|
||
|
file, err := os.Create(path)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
defer file.Close()
|
||
|
|
||
|
_, err = file.Write(content)
|
||
|
return path, err
|
||
|
}
|
||
|
|
||
|
func readTempFile(name string) ([]byte, error) {
|
||
|
file, err := os.Open(name)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
b, err := ioutil.ReadAll(file)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if len(b) > 0 && b[len(b)-1] == '\n' {
|
||
|
b = b[:len(b)-1]
|
||
|
}
|
||
|
|
||
|
if len(b) > 0 && b[len(b)-1] == '\r' {
|
||
|
b = b[:len(b)-1]
|
||
|
}
|
||
|
|
||
|
if len(b) > 0 && b[len(b)-1] == '\n' {
|
||
|
b = b[:len(b)-1]
|
||
|
}
|
||
|
|
||
|
if len(b) > 0 && b[len(b)-1] == '\r' {
|
||
|
b = b[:len(b)-1]
|
||
|
}
|
||
|
|
||
|
err = os.Remove(name)
|
||
|
return b, err
|
||
|
}
|