syscall: allow for mksyscall_windows.go to be used outside of syscall

Fixes #8398.

LGTM=chines
R=golang-codereviews, chines, josharian
CC=golang-codereviews
https://golang.org/cl/114140043
diff --git a/src/pkg/syscall/mksyscall_windows.go b/src/pkg/syscall/mksyscall_windows.go
index 4225588..3b483ec 100644
--- a/src/pkg/syscall/mksyscall_windows.go
+++ b/src/pkg/syscall/mksyscall_windows.go
@@ -47,6 +47,8 @@
 	"errors"
 	"flag"
 	"fmt"
+	"go/parser"
+	"go/token"
 	"io"
 	"log"
 	"os"
@@ -61,6 +63,19 @@
 	return strings.Trim(s, " \t")
 }
 
+var packageName string
+
+func packagename() string {
+	return packageName
+}
+
+func syscalldot() string {
+	if packageName == "syscall" {
+		return ""
+	}
+	return "syscall."
+}
+
 // Param is function parameter
 type Param struct {
 	Name      string
@@ -243,20 +258,20 @@
 		if e1 != 0 {
 			err = error(e1)
 		} else {
-			err = EINVAL
+			err = %sEINVAL
 		}
 	}`
 	cond := retvar + " == 0"
 	if r.FailCond != "" {
 		cond = strings.Replace(r.FailCond, "failretval", retvar, 1)
 	}
-	return fmt.Sprintf(code, cond)
+	return fmt.Sprintf(code, cond, syscalldot())
 }
 
 // SetErrorCode returns source code that sets return parameters.
 func (r *Rets) SetErrorCode() string {
 	const code = `if r0 != 0 {
-		%s = Errno(r0)
+		%s = %sErrno(r0)
 	}`
 	if r.Name == "" && !r.ReturnsError {
 		return ""
@@ -265,7 +280,7 @@
 		return r.useLongHandleErrorCode("r1")
 	}
 	if r.Type == "error" {
-		return fmt.Sprintf(code, r.Name)
+		return fmt.Sprintf(code, r.Name, syscalldot())
 	}
 	s := ""
 	if r.Type[0] == '*' {
@@ -475,9 +490,9 @@
 func (f *Fn) Syscall() string {
 	c := f.SyscallParamCount()
 	if c == 3 {
-		return "Syscall"
+		return syscalldot() + "Syscall"
 	}
-	return "Syscall" + strconv.Itoa(c)
+	return syscalldot() + "Syscall" + strconv.Itoa(c)
 }
 
 // SyscallParamList returns source code for SyscallX parameters for function f.
@@ -502,9 +517,9 @@
 // StrconvFunc returns name of Go string to OS string function for f.
 func (f *Fn) StrconvFunc() string {
 	if f.IsUTF16() {
-		return "UTF16PtrFromString"
+		return syscalldot() + "UTF16PtrFromString"
 	}
-	return "BytePtrFromString"
+	return syscalldot() + "BytePtrFromString"
 }
 
 // StrconvType returns Go type name used for OS string for f.
@@ -582,12 +597,29 @@
 		return err
 	}
 	src.Files = append(src.Files, path)
+
+	// get package name
+	fset := token.NewFileSet()
+	_, err = file.Seek(0, 0)
+	if err != nil {
+		return err
+	}
+	pkg, err := parser.ParseFile(fset, "", file, parser.PackageClauseOnly)
+	if err != nil {
+		return err
+	}
+	packageName = pkg.Name.Name
+
 	return nil
 }
 
 // Generate output source file from a source set src.
 func (src *Source) Generate(w io.Writer) error {
-	t := template.Must(template.New("main").Parse(srcTemplate))
+	funcMap := template.FuncMap{
+		"syscalldot":  syscalldot,
+		"packagename": packagename,
+	}
+	t := template.Must(template.New("main").Funcs(funcMap).Parse(srcTemplate))
 	err := t.Execute(w, src)
 	if err != nil {
 		return errors.New("Failed to execute template: " + err.Error())
@@ -623,9 +655,10 @@
 {{define "main"}}// go build mksyscall_windows.go && ./mksyscall_windows{{range .Files}} {{.}}{{end}}
 // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
 
-package syscall
+package {{packagename}}
 
-import "unsafe"
+import "unsafe"{{if syscalldot}}
+import "syscall"{{end}}
 
 var (
 {{template "dlls" .}}
@@ -635,7 +668,7 @@
 
 {{/* help functions */}}
 
-{{define "dlls"}}{{range .DLLs}}	mod{{.}} = NewLazyDLL("{{.}}.dll")
+{{define "dlls"}}{{range .DLLs}}	mod{{.}} = {{syscalldot}}NewLazyDLL("{{.}}.dll")
 {{end}}{{end}}
 
 {{define "funcnames"}}{{range .Funcs}}	proc{{.DLLFuncName}} = mod{{.DLLName}}.NewProc("{{.DLLFuncName}}")