| // 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 strconv |
| |
| import ( |
| "utf8"; |
| ) |
| |
| const ldigits = "0123456789abcdef" |
| const udigits = "0123456789ABCDEF" |
| |
| export func Quote(s string) string { |
| t := `"`; |
| for i := 0; i < len(s); i++ { |
| switch { |
| case s[i] == '"': |
| t += `\"`; |
| case s[i] == '\\': |
| t += `\\`; |
| case ' ' <= s[i] && s[i] <= '~': |
| t += string(s[i]); |
| case s[i] == '\a': |
| t += `\a`; |
| case s[i] == '\b': |
| t += `\b`; |
| case s[i] == '\f': |
| t += `\f`; |
| case s[i] == '\n': |
| t += `\n`; |
| case s[i] == '\r': |
| t += `\r`; |
| case s[i] == '\t': |
| t += `\t`; |
| case s[i] == '\v': |
| t += `\v`; |
| |
| case utf8.FullRuneInString(s, i): |
| r, size := utf8.DecodeRuneInString(s, i); |
| if r == utf8.RuneError && size == 1 { |
| goto EscX; |
| } |
| i += size-1; // i++ on next iteration |
| if r < 0x10000 { |
| t += `\u`; |
| for j:=uint(0); j<4; j++ { |
| t += string(ldigits[(r>>(12-4*j))&0xF]); |
| } |
| } else { |
| t += `\U`; |
| for j:=uint(0); j<8; j++ { |
| t += string(ldigits[(r>>(28-4*j))&0xF]); |
| } |
| } |
| |
| default: |
| EscX: |
| t += `\x`; |
| t += string(ldigits[s[i]>>4]); |
| t += string(ldigits[s[i]&0xF]); |
| } |
| } |
| t += `"`; |
| return t; |
| } |
| |
| export func CanBackquote(s string) bool { |
| for i := 0; i < len(s); i++ { |
| if s[i] < ' ' || s[i] == '`' { |
| return false; |
| } |
| } |
| return true; |
| } |
| |