Skip to content

Commit 105dbeb

Browse files
committed
randomise
1 parent b2be695 commit 105dbeb

File tree

11 files changed

+396
-9
lines changed

11 files changed

+396
-9
lines changed

Makefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
GO=go
2+
3+
4+
test:
5+
6+
bench:
7+
8+
clean:
9+
rm -f *.out

README.md

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +0,0 @@
1-
GO=go
2-
3-
4-
test:
5-
6-
bench:
7-
8-
clean:
9-
rm -f *.out

main

2.12 MB
Binary file not shown.

main.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package main
2+
3+
import (
4+
"github.com/oyamo/rmx/src"
5+
)
6+
7+
func main () {
8+
engine, err := src.NewEngine()
9+
if err != nil {
10+
panic(err)
11+
}
12+
13+
engine.Run()
14+
}

src/deletion.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package src
2+
3+
import (
4+
"errors"
5+
"os"
6+
"path/filepath"
7+
)
8+
9+
const (
10+
RE_REGEXP = `^((?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$`
11+
)
12+
13+
func (e *Engine)DeleteFolder(folder string) error {
14+
err := filepath.WalkDir(folder, func(path string, d os.DirEntry, err error) error {
15+
if err != nil {
16+
return err
17+
}
18+
if d.IsDir() {
19+
return nil
20+
}
21+
22+
// if it is a file, delete it
23+
24+
e.DeleteFile(path)
25+
return nil
26+
})
27+
28+
if err != nil {
29+
return err
30+
}
31+
32+
return os.Remove(folder)
33+
}
34+
35+
func (e *Engine)DeleteFile(file string) error{
36+
// Open the file
37+
fd, err := os.OpenFile(file, os.O_RDWR, 0666)
38+
if err != nil {
39+
return err
40+
}
41+
defer fd.Close()
42+
// Write random bytes to the file
43+
err = RandomiseFile(fd)
44+
45+
if err != nil {
46+
return err
47+
}
48+
49+
return os.Remove(file)
50+
51+
}
52+
53+
func (e *Engine)UnlinkFile(file string) {
54+
55+
}
56+
57+
func (e *Engine)DeleteItem(item string) error {
58+
files, err := e.MatchWildCard(item)
59+
if err != nil {
60+
return err
61+
}
62+
63+
if len(files) == 0 {
64+
return errors.New("no files found")
65+
}
66+
67+
for _, file := range files {
68+
// get the file descriptor
69+
fd, err := os.Stat(file)
70+
if err != nil {
71+
return err
72+
}
73+
74+
// check if it is a directory
75+
if fd.IsDir() {
76+
if e.Input.HasFlag(FLAG_R) || e.Input.HasFlag(FLAG_D) {
77+
e.DeleteFolder(file)
78+
} else {
79+
return errors.New("cannot remove " + file + ": Is a directory")
80+
}
81+
} else {
82+
e.DeleteFile(file)
83+
}
84+
}
85+
86+
return nil
87+
}
88+
89+
func (e *Engine) MatchWildCard(wildcard string) ([]string,error) {
90+
return filepath.Glob(wildcard)
91+
}

src/engine.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package src
2+
3+
import "os"
4+
5+
const (
6+
VERSION = "0.0.1"
7+
)
8+
9+
type Engine struct {
10+
Input *Input
11+
Cwd string
12+
}
13+
14+
15+
func NewEngine() (*Engine, error) {
16+
cwd, err := os.Getwd()
17+
if err != nil {
18+
return nil, err
19+
}
20+
return &Engine{
21+
Input: nil,
22+
Cwd: cwd,
23+
} , nil
24+
}
25+
26+
func (e *Engine) Run () error {
27+
input, err := NewInput()
28+
29+
if err != nil {
30+
UsageError()
31+
return err
32+
}
33+
34+
e.Input = input
35+
36+
if input.HasFlag(FLAG_HELP) {
37+
Usage()
38+
return nil
39+
}
40+
41+
if input.HasFlag(FLAG_V) {
42+
Version()
43+
return nil
44+
}
45+
46+
return e.delete()
47+
}
48+
49+
func (e *Engine) delete() error {
50+
for _, file := range e.Input.Files {
51+
err := e.DeleteItem(file)
52+
if err != nil {
53+
return err
54+
}
55+
}
56+
57+
return nil
58+
}

src/input.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package src
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
)
8+
9+
const (
10+
FLAG_F = iota // -f, --force
11+
FLAG_I // -i
12+
FLAG_R // -r, -R, --recursive
13+
FLAG_D // -d, --dir
14+
FLAG_V // -v, --verbose
15+
FLAG_HELP // --help, -h
16+
)
17+
18+
type Input struct {
19+
Files []string
20+
Flags []uint8 // tiny for less mem
21+
}
22+
23+
24+
type InputParser interface {
25+
HasFlag(uint8) bool
26+
}
27+
28+
29+
// NewInput creates a new Input struct and parses the command line arguments.
30+
// It returns the Input struct and an error if there is one.
31+
func NewInput() (*Input, error) {
32+
args := os.Args[1:]
33+
34+
if len(args) == 0 {
35+
return nil, fmt.Errorf("no arguments")
36+
}
37+
38+
input := &Input{
39+
Files: make([]string, 0),
40+
Flags: make([]uint8, 0),
41+
}
42+
43+
// set flag usage
44+
flag.Usage = Usage
45+
46+
var help = flag.Bool("help", false, "")
47+
var version = flag.Bool("version", false, "")
48+
var force = flag.Bool("f", false, "")
49+
var forceShort = flag.Bool("force", false, "")
50+
var recursive = flag.Bool("recursive", false, "")
51+
var recursiveShort = flag.Bool("r", false, "")
52+
var dir = flag.Bool("dir", false, "dir")
53+
var dirShort = flag.Bool("d", false, "dir")
54+
var verbose = flag.Bool("verbose", false, "")
55+
var verboseShort = flag.Bool("v", false, "")
56+
var i = flag.Bool("i", false, "i")
57+
58+
flag.Parse()
59+
60+
if *help {
61+
input.Flags = append(input.Flags, FLAG_HELP)
62+
return input, nil
63+
}
64+
65+
if *version {
66+
input.Flags = append(input.Flags, FLAG_V)
67+
return input, nil
68+
}
69+
70+
if *force || *forceShort {
71+
input.Flags = append(input.Flags, FLAG_F)
72+
}
73+
74+
if *recursive || *recursiveShort {
75+
input.Flags = append(input.Flags, FLAG_R)
76+
}
77+
78+
if *dir || *dirShort {
79+
input.Flags = append(input.Flags, FLAG_D)
80+
}
81+
82+
if *verbose || *verboseShort {
83+
input.Flags = append(input.Flags, FLAG_V)
84+
}
85+
86+
if *i {
87+
input.Flags = append(input.Flags, FLAG_I)
88+
}
89+
90+
input.Files = flag.Args()
91+
92+
return input, nil
93+
}
94+
95+
// HasFlag returns true if the input has the flag.
96+
func (i *Input) HasFlag(flag uint8) bool {
97+
for _, f := range i.Flags {
98+
if f == flag {
99+
return true
100+
}
101+
}
102+
return false
103+
}

src/printer.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package src
2+
import(
3+
"fmt"
4+
"os"
5+
)
6+
7+
// PrintErr prints the error message to stderr.
8+
func PrintErr (err string) {
9+
fmt.Fprintf(os.Stderr, "rmx: %s", err)
10+
fmt.Fprintln(os.Stderr)
11+
}
12+
13+
// PrintErrf prints the error message to stderr.
14+
func PrintErrf (format string, args ...interface{}) {
15+
fmt.Fprintf(os.Stderr, "rmx: " + format + "", args...)
16+
fmt.Fprintln(os.Stderr)
17+
}
18+
19+
// PrintErr prints the info message to stdout.
20+
func PrintInfof(format string, args ...interface{}) {
21+
fmt.Fprintf(os.Stdout, format, args...)
22+
fmt.Fprintln(os.Stdout)
23+
}
24+
25+
// PrintErr prints info message to stdout.
26+
func PrintInfo (info string) {
27+
fmt.Fprint(os.Stdout, info)
28+
fmt.Fprintln(os.Stdout)
29+
}
30+

src/rand.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Writes pseudo-random bytes into a file or zeroes it.
3+
*
4+
**/
5+
6+
package src
7+
8+
import (
9+
"bufio"
10+
"crypto/rand"
11+
"io"
12+
"os"
13+
)
14+
15+
const (
16+
BUFFER_SIZE = 1024
17+
)
18+
19+
func ZeroFile(file string) {
20+
21+
}
22+
23+
24+
func RandomiseFile(file *os.File) error {
25+
// use io.CopyN to write random bytes to the file
26+
fb := bufio.NewWriter(file)
27+
defer fb.Flush()
28+
29+
// Get the block size of the file
30+
stat, err := file.Stat()
31+
if err != nil {
32+
return err
33+
}
34+
35+
//
36+
size := stat.Size()
37+
38+
_, err = io.CopyN(fb, rand.Reader, size)
39+
40+
return err
41+
}

src/tenary.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package src
2+
3+
func If[T any](cond bool, v1, v0 T) T {
4+
if cond {
5+
return v1
6+
}
7+
return v0
8+
}

0 commit comments

Comments
 (0)