init
This commit is contained in:
		
							
								
								
									
										24
									
								
								COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								COPYING
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
This is free and unencumbered software released into the public domain.
 | 
			
		||||
 | 
			
		||||
Anyone is free to copy, modify, publish, use, compile, sell, or
 | 
			
		||||
distribute this software, either in source code form or as a compiled
 | 
			
		||||
binary, for any purpose, commercial or non-commercial, and by any
 | 
			
		||||
means.
 | 
			
		||||
 | 
			
		||||
In jurisdictions that recognize copyright laws, the author or authors
 | 
			
		||||
of this software dedicate any and all copyright interest in the
 | 
			
		||||
software to the public domain. We make this dedication for the benefit
 | 
			
		||||
of the public at large and to the detriment of our heirs and
 | 
			
		||||
successors. We intend this dedication to be an overt act of
 | 
			
		||||
relinquishment in perpetuity of all present and future rights to this
 | 
			
		||||
software under copyright law.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | 
			
		||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 | 
			
		||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | 
			
		||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | 
			
		||||
OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
For more information, please refer to <http://unlicense.org/>
 | 
			
		||||
							
								
								
									
										19
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
# cpufreq
 | 
			
		||||
 | 
			
		||||
Display current CPU frequencies from `/proc/cpuinfo`. This is a sample of the Nim language.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
Usage: cpufreq [-b|--brief] [-t|--table] [-h|--help] [-v|--version]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
# Build from source
 | 
			
		||||
 | 
			
		||||
First install Nim language compiler. See instructions of [Nim site](https://nim-lang.org/install.html).
 | 
			
		||||
 | 
			
		||||
Compile programm:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
nim c cpufreq.nim
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Done! You can place `cpufreq` executable to your PATH, e.g. `/urs/local/bin`.
 | 
			
		||||
							
								
								
									
										116
									
								
								cpufreq.nim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								cpufreq.nim
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
#[
 | 
			
		||||
  cpufreq - display currrent CPU frequencies from /proc/cpuinfo
 | 
			
		||||
 | 
			
		||||
  This is free and unencumbered software released into the public domain.
 | 
			
		||||
 | 
			
		||||
  Anyone is free to copy, modify, publish, use, compile, sell, or
 | 
			
		||||
  distribute this software, either in source code form or as a compiled
 | 
			
		||||
  binary, for any purpose, commercial or non-commercial, and by any
 | 
			
		||||
  means.
 | 
			
		||||
 | 
			
		||||
  In jurisdictions that recognize copyright laws, the author or authors
 | 
			
		||||
  of this software dedicate any and all copyright interest in the
 | 
			
		||||
  software to the public domain. We make this dedication for the benefit
 | 
			
		||||
  of the public at large and to the detriment of our heirs and
 | 
			
		||||
  successors. We intend this dedication to be an overt act of
 | 
			
		||||
  relinquishment in perpetuity of all present and future rights to this
 | 
			
		||||
  software under copyright law.
 | 
			
		||||
 | 
			
		||||
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | 
			
		||||
  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 | 
			
		||||
  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | 
			
		||||
  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | 
			
		||||
  OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
  For more information, please refer to <http://unlicense.org/>
 | 
			
		||||
]#
 | 
			
		||||
 | 
			
		||||
import std/nre
 | 
			
		||||
import std/sequtils
 | 
			
		||||
import std/strutils
 | 
			
		||||
import std/parseopt
 | 
			
		||||
 | 
			
		||||
const Version: string = "0.1.0"
 | 
			
		||||
const Usage: string ="""
 | 
			
		||||
Display current CPU frequencies from /proc/cpuinfo
 | 
			
		||||
 | 
			
		||||
Usage: cpufreq [-b|--brief] [-t|--table] [-h|--help] [-v|--version]"""
 | 
			
		||||
 | 
			
		||||
proc countCPU(CPUInfo: string): int =
 | 
			
		||||
  # Count CPU cores. Return integer value, e.g. 8.
 | 
			
		||||
  var processors = CPUInfo.findAll(re"processor")
 | 
			
		||||
  result = count(processors, "processor")
 | 
			
		||||
 | 
			
		||||
proc getModelName(CPUInfo: string): string =
 | 
			
		||||
  # Return processor manufacturer and model name.
 | 
			
		||||
  var model = CPUInfo.find(re"(?<=model name)(.*)").get.captures[-1]
 | 
			
		||||
  result = model.find(re"(?<=: )(.*)").get.captures[-1]
 | 
			
		||||
 | 
			
		||||
proc getCPUFreq(CPUInfo: string): seq[string] =
 | 
			
		||||
  # Return sequence of stings with CPU frequencies. For example output:
 | 
			
		||||
  # @["1400.000", "1400.000", "2100.000", "1790.073"]
 | 
			
		||||
  var raw_freqs: seq[string] = CPUInfo.findAll(re"(?<=cpu MHz)(.*)(?i)")
 | 
			
		||||
  var freqs: seq[string] = @[]
 | 
			
		||||
  for freq in raw_freqs:
 | 
			
		||||
    freqs.add(freq.replace("\t\t: ", ""))
 | 
			
		||||
  result = freqs
 | 
			
		||||
 | 
			
		||||
iterator countTo(n: int): int =
 | 
			
		||||
  var i = 0
 | 
			
		||||
  while i <= n:
 | 
			
		||||
    yield i
 | 
			
		||||
    inc i
 | 
			
		||||
 | 
			
		||||
proc displayFreqsAsList(CPUFreqs: seq[string], CPUs: int) =
 | 
			
		||||
  for cpu in countTo(CPUs - 1):
 | 
			
		||||
    echo "CPU", cpu, ": ", CPUFreqs[cpu]
 | 
			
		||||
 | 
			
		||||
proc displayFreqsAsTable(CPUFreqs: seq[string], CPUs: int) =
 | 
			
		||||
  for cpu in countTo(CPUs - 1):
 | 
			
		||||
    stdout.write "CPU", cpu, "\t\t"
 | 
			
		||||
  echo "\n", CPUFreqs.join("\t")
 | 
			
		||||
 | 
			
		||||
# Toggles for '--brief' and '--table' options
 | 
			
		||||
var brief: bool = false
 | 
			
		||||
var table: bool = false
 | 
			
		||||
 | 
			
		||||
# Parse command line options
 | 
			
		||||
var optparser = initOptParser()
 | 
			
		||||
while true:
 | 
			
		||||
  optparser.next()
 | 
			
		||||
  case optparser.kind
 | 
			
		||||
  of cmdEnd: break
 | 
			
		||||
  of cmdShortOption, cmdLongOption:
 | 
			
		||||
    case optparser.key
 | 
			
		||||
    of "help", "h": echo Usage; system.quit(0)
 | 
			
		||||
    of "version", "v": echo Version; system.quit(0)
 | 
			
		||||
    of "brief", "b": brief = true
 | 
			
		||||
    of "table", "t": table = true
 | 
			
		||||
    else:
 | 
			
		||||
      echo "Unknown option: ", optparser.key
 | 
			
		||||
      echo Usage
 | 
			
		||||
      system.quit(1)
 | 
			
		||||
  of cmdArgument:
 | 
			
		||||
    discard
 | 
			
		||||
 | 
			
		||||
# Read /proc/cpuinfo and display info
 | 
			
		||||
let CPUInfo = readFile("/proc/cpuinfo")
 | 
			
		||||
let CPUModel: string = getModelName(CPUInfo)
 | 
			
		||||
let CPUs: int = countCPU(CPUInfo)
 | 
			
		||||
let CPUFreqs: seq[string] = getCPUFreq(CPUInfo)
 | 
			
		||||
 | 
			
		||||
if brief == false:
 | 
			
		||||
  echo "CPU model: ", CPUModel
 | 
			
		||||
  echo "CPU cores: ", CPUs
 | 
			
		||||
  echo ""
 | 
			
		||||
 | 
			
		||||
if isEmptyOrWhitespace(CPUFreqs.join) == true:
 | 
			
		||||
  echo "Sorry, frequencies info is not available for your CPU :("
 | 
			
		||||
  system.quit(1)
 | 
			
		||||
 | 
			
		||||
if table == false:
 | 
			
		||||
  displayFreqsAsList(CPUFreqs, CPUs)
 | 
			
		||||
else:
 | 
			
		||||
  displayFreqsAsTable(CPUFreqs, CPUs)
 | 
			
		||||
		Reference in New Issue
	
	Block a user