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