loc is a tool for counting lines of code. It's a rust implementation of cloc, but it's more than 100x faster.

Overview

2019-10-07: I really haven't been on top of accepting pull requests or looking at issues, you guy should definitely look at SCC. It's faster and more accurate than this, and Boyter has written a great series of blog posts detailing how it got this way: https://boyter.org/posts/sloc-cloc-code/

2018-03-08: I saw a bunch of stars pop up and thought I should mention that tokei is smarter and more accurate so please give that a look and see if there are any wild discrepancies (mostly for your benefit but please let me know if so). Tokei is linked below but it's also rust so cargo install tokei is all you need. Also these benchmarks are quite old. I doubt cloc has changed but tokei probably has.

loc is a tool for counting lines of code. It's a rust implementation of cloc, but it's more than 100x faster. There's another rust code counting tool called tokei, loc is ~2-10x faster than tokei, depending on how many files are being counted.

I can count my 400k file src directory (thanks npm) in just under 7 seconds with loc, in a 1m14s with tokei, and I'm not even willing to try with cloc.

Counting just the dragonflybsd codebase (~9 million lines):

  • loc: 1.09 seconds
  • tokei: 5.3 seconds
  • cloc: 1 minute, 50 seconds

Installation

There are binaries available on the releases page, thanks to the wonderful rust-everywhere project and travisci. For anyone familiar with Rust there's cargo install loc. If you want to install Rust/Cargo, this is probably the easiest way: https://www.rustup.rs/.

Windows

loc should now compile on Windows, but you can also run it under Windows using linux emulation:

You can run loc on Windows 10 Anniversary Update build 14393 or later using the Windows Subsystem for Linux. Simply download the Linux distribution from the releases page, and run it in bash using a WSL-compatible path (e.g. /mnt/c/Users/Foo/Repo/ instead of C:\Users\Foo\Repo).

Usage

By default, loc will count lines of code in a target directory:

$ loc
--------------------------------------------------------------------------------
 Language             Files        Lines        Blank      Comment         Code
--------------------------------------------------------------------------------
 Lua                      2       387088        24193       193544       169351
 Rust                     4         1172          111           31         1030
 C                        4          700           75          155          470
 Markdown                 2          249           39            0          210
 Bourne Shell             4          228           41           27          160
 Ada                      2           53           12            9           32
 Toml                     1           26            4            2           20
 Gherkin                  1           12            2            2            8
 OCaml                    1           13            4            6            3
 Ruby                     1            4            0            2            2
 Handlebars               1            4            0            2            2
--------------------------------------------------------------------------------
 Total                   23       389549        24481       193780       171288
--------------------------------------------------------------------------------

You can also pass one or many targets for it to inspect

$ loc ci benches
--------------------------------------------------------------------------------
 Language             Files        Lines        Blank      Comment         Code
--------------------------------------------------------------------------------
 Bourne Shell             4          228           41           27          160
 Rust                     1           17            4            0           13
--------------------------------------------------------------------------------
 Total                    5          245           45           27          173
--------------------------------------------------------------------------------

To see stats for each file parsed, pass the --files flag:

$ loc --files src
--------------------------------------------------------------------------------
 Language             Files        Lines        Blank      Comment         Code
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
 Rust                     2         1028           88           29          911
--------------------------------------------------------------------------------
|src/lib.rs                         677           54           19          604
|src/main.rs                        351           34           10          307

By default, the columns will be sorted by Code counted in descending order. You can select a different column to sort using the --sort flag:

$ loc --files --sort Comment ci
--------------------------------------------------------------------------------
 Language             Files        Lines        Blank      Comment         Code
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
 Bourne Shell             4          228           41           27          160
--------------------------------------------------------------------------------
|ci/before_deploy.sh                 68           15           13           40
|ci/install.sh                       60           13            6           41
|ci/script.sh                        41            8            8           25
|ci/utils.sh                         59            5            0           54

loc can also be called with regexes to match and/or exclude files.

$ loc --include 'count'
--------------------------------------------------------------------------------
 Language             Files        Lines        Blank      Comment         Code
--------------------------------------------------------------------------------
 Rust                     2          144           23            2          119
--------------------------------------------------------------------------------
 Total                    2          144           23            2          119
loc --exclude 'sh$'
--------------------------------------------------------------------------------
 Language             Files        Lines        Blank      Comment         Code
--------------------------------------------------------------------------------
 Lua                      2       387088        24193       193544       169351
 Rust                     4         1172          111           31         1030
 C                        4          700           75          155          470
 Markdown                 2          275           38            0          237
 Ada                      2           53           12            9           32
 Toml                     1           26            4            2           20
 Gherkin                  1           12            2            2            8
 OCaml                    1           13            4            6            3
 Handlebars               1            4            0            2            2
 Ruby                     1            4            0            2            2
--------------------------------------------------------------------------------
 Total                   19       389347        24439       193753       171155
--------------------------------------------------------------------------------

Known Issues

Fortran has a rule that comments must start with the first character of a line. I only check if it's the first non-whitespace character of a line. I don't know how often this is a problem in real code. I would think not often.

Comments inside string literals: You can get incorrect counts if your code has something like this:

x = "/* I haven't slept \
for 10 days \
because that would be too long \
*/";

loc counts the first line and last lines correctly as code, but the middle lines will be incorrectly counted as comments.

Ignored and hidden files:

By default, loc respects .gitignore/.ignore files, and ignores hidden files and directories. You can count disregard ignore files with loc -u, and include hidden files/dirs with loc -uu.

Supported Languages

  • ActionScript
  • Ada
  • Agda
  • AmbientTalk
  • ASP
  • ASP.NET
  • Assembly
  • Autoconf
  • Awk
  • Batch
  • Bourne Shell
  • C
  • C Shell
  • C/C++ Header
  • C#
  • C++
  • Clojure
  • CoffeeScript
  • ColdFusion
  • ColdFusionScript
  • Coq
  • CSS
  • CUDA
  • CUDA Header
  • D
  • Dart
  • DeviceTree
  • Erlang
  • Forth
  • FORTRAN Legacy
  • FORTRAN Modern
  • F# (Fsharp)
  • GLSL
  • Go
  • Groovy
  • Handlebars
  • Haskell
  • Hex
  • HTML
  • Idris
  • INI
  • Intel Hex
  • Isabelle
  • Jai
  • Java
  • JavaScript
  • JSON
  • Jsx
  • Julia
  • Kotlin
  • Lean
  • Less
  • LinkerScript
  • Lisp
  • Lua
  • Make
  • Makefile
  • Markdown
  • Mustache
  • Nim
  • Nix
  • Objective-C
  • Objective-C++
  • OCaml
  • OpenCL
  • Oz
  • Pascal
  • Perl
  • PHP
  • Plain Text
  • Polly
  • PowerShell
  • Prolog
  • Protobuf
  • Pyret
  • Python
  • Qcl
  • QML
  • R
  • Razor
  • reStructuredText
  • Ruby
  • RubyHtml
  • Rust
  • SaltStack
  • Sass
  • Scala
  • SML
  • Solidity
  • SQL
  • Stylus
  • Swift
  • Tcl
  • Terraform
  • TeX
  • Toml
  • TypeScript
  • Tsx
  • UnrealScript
  • VimL
  • Wolfram
  • XML
  • Yacc
  • YAML
  • Zig
  • Z Shell

Attributions

This project contains code from Tokei by Aaronepower and ripgrep by BurntSushi.

Contributors

Comments
  • Git files include in lines of count

    Git files include in lines of count

    First, I want to say that I'm really impressed with the speed of loc! Now on to the issue:

    I noticed that when I run "loc ." in the project root that the directory's git directory is included in the results. I propose either disabling git directories or disabling hidden directories from the results. Thoughts?

    bug 
    opened by mandeep 7
  • mmap build failure on windows

    mmap build failure on windows

    Tried installing twice. Build fails with E0432 and E0061 errors [log gist]. There aren't any issues in mmap's repo that point to a similar problem, but the project's been dormant for 2 years.

    opened by zackschuster 5
  • implement support for Gherkin

    implement support for Gherkin

    Gherkin is a language commonly used for writing BDD style tests, with parsers in a dozen+ different languages. It is part of the Cucumber project.

    https://github.com/cucumber/cucumber/wiki/Gherkin

    opened by mroth 4
  • polyglot slightly faster than loc

    polyglot slightly faster than loc

    From: https://github.com/vmchale/polyglot

    polyglot: 143.2 ms loc: 171.8 ms tokei: 304.6 ms

    It might be interesting to look at which optimizations they are using.

    opened by gnzlbg 3
  • Improved handling of --sort flag and it's interaction with --files

    Improved handling of --sort flag and it's interaction with --files

    Invalid values of --sort will now be caught and reported. Added a
    dependency on the edit_distance crate to catch typos and offer
    suggestions. These are basically usability improvements.
    
    opened by ConnorGray 3
  • Use list file

    Use list file

    Sometimes it is more convenient to preprocess a list of files to remove complicated patterns that are annoying or impossible to specify via the --include --exclude regexes as well as use different sources for which files are interesting (eg. running a Powershell script to retrieve all of the files in a VS solution).

    This PR adds support for letting you pass a file path via -l, --list-file which should just contain a path per line that will be used instead of the normal target argument to fill out the list of files to count.

    opened by Jake-Shadle 3
  • Integer overflow issue?

    Integer overflow issue?

    When running loc as loc . --files on the phpSimpleSAML project I get the following output

    --------------------------------------------------------------------------------
     Language             Files        Lines        Blank      Comment         Code
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
     Bourne Shell             2           86           19            6           61
    --------------------------------------------------------------------------------
    |./bin/build-release.sh              62           15            3           44
    |./bin/check-syntax.sh               24            4            3           17
    --------------------------------------------------------------------------------
     PHP                    473        65104        10377        18319        36408
    --------------------------------------------------------------------------------
    |templates/authsources.php          402           58          461   4294967179
    |es/saml/lib/IdP/SAML2.php         1149          180          188          781
    |L/Metadata/SAMLParser.php         1498          267          493          738
    |tlibinc/base_facebook.php         1437          140          561          736
    |pleSAML/Configuration.php         1369          205          528          636
    ...
    

    There seems to be something going wrong with 4294967179

    This is on: MacOS El Capitan loc version 0.3.4 rustc 1.12.1 (d4f39402a 2016-10-19)

    bug 
    opened by Posnet 3
  • Add docker support

    Add docker support

    Example of it running:

    loc (lang/docker) # cargo run -- ../test
        Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
         Running `target/debug/loc ../test`
    --------------------------------------------------------------------------------
     Language             Files        Lines        Blank      Comment         Code
    --------------------------------------------------------------------------------
     Docker                   1            4            1            1            2
    --------------------------------------------------------------------------------
     Total                    1            4            1            1            2
    --------------------------------------------------------------------------------
    

    Contents of file:

    loc (lang/docker) # cat ../test/Dockerfile
    # This is a testing comment
    
    FROM ubuntu
    RUN echo "Hello world!"
    

    Closes #95

    opened by Innectic 2
  • Nested comments not handled for Haskell or Rust files

    Nested comments not handled for Haskell or Rust files

    Cool tool! Just found it because sloccount refuses to work any more. This is far faster!

    With the .rs file example here, tokei correctly reports 1 line of code, whereas loc incorrectly reports 14 lines of code.

    Haskell also has nestable block comments:

    {-
    
    {-
    Nested comment
    -}
    
    -- Note: still commented
    fibs :: [Int]
    fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
    
    -}
    
    main :: IO ()
    main = print [1..]
    

    tokei correctly reports 2 lines of code, whereas loc incorrectly reports 5 lines.

    bug 
    opened by mgsloan 2
  • `loc` returns a count of 0 for files without an extension

    `loc` returns a count of 0 for files without an extension

    This may be by design, but:

    Write the following to a file named e.g. foo.py:

    #!/bin/python
    
    hello = "Count me!"
    

    Run loc foo.py. You'll get the expected result, 1 line of Python. Now run mv foo.py foo and run loc foo. The result shows 0 lines of anything.

    This may be out of scope for loc (detecting filetypes without an extension can be hard), but it does mess up counts for codebases with scripts named without extensions, e.g. run_task, etc.

    What would be required for loc to return counts for files without extensions?

    opened by wbthomason 2
  • New release?

    New release?

    At the moment the Cargo.lock of the current release does not contain hashes - this is currently breaking our package in nixpkgs, where we need them for offline builds.

    opened by Mic92 2
  • Bump regex from 1.5.4 to 1.5.5

    Bump regex from 1.5.4 to 1.5.5

    Bumps regex from 1.5.4 to 1.5.5.

    Changelog

    Sourced from regex's changelog.

    1.5.5 (2022-03-08)

    This releases fixes a security bug in the regex compiler. This bug permits a vector for a denial-of-service attack in cases where the regex being compiled is untrusted. There are no known problems where the regex is itself trusted, including in cases of untrusted haystacks.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Performance issue with the redundancy load

    Performance issue with the redundancy load

    https://github.com/cgag/loc/blob/1e0c7f434ddfd51439e1d4eb126f31b7a04229d9/src/lib.rs#L668

    According to my tests, the vector multis in this line of code has only one element in most cases. Calling the iter() function on a vector with only one element results in having a lot of redundant load operations. If we create a fast path for a vector with only one element, we can eliminate a lot of computation and memory operations, which in turn improves the performance of the program. Execution time decreased from 7.05s to 5.74s with my test input, which is a 22.8% speedup.

    Here's the modified code for this count() function. (src/lib.rs: 597-714)

    ` pub fn count(filepath: &str) -> Count { let lang = lang_from_ext(filepath); let (singles, multis) = counter_config_for_lang(lang);

    let mfile = File::open(filepath);
    let mut file = match mfile {
        Ok(file) => file,
        Err(_) => {
            return Count::default();
        }
    };
    // TODO(cgag): set the size of this vec to size of the file + a byte? a reddit comment
    // somewhere says fs::read will do this ofr you.
    let mut bytes = vec![];
    file.read_to_end(&mut bytes).expect("nani?!");
    
    let mut c = Count::default();
    let mut multi_stack: Vec<(&str, &str)> = vec![];
    
    //***YYZ note: The fast path for vecotr with only one element
    if multis.len() == 1 {
        let (start, end) = &multis[0];
        let start_len = start.len();
        let end_len   = end.len();
        'line: for byte_line in ByteLines(&bytes).lines() {
            let line = match std::str::from_utf8(byte_line) {
                Ok(s) => s,
                Err(_) => return Count::default(),
            };
            c.lines += 1;
    
            let line = line.trim_start();
            if line.is_empty() {
                c.blank += 1;
                continue;
            };
    
            if multi_stack.is_empty() {
                for single_start in singles.iter() {
                    if line.starts_with(single_start) {
                        if multis.iter().any(|(m_start, _)| line.starts_with(m_start)) {
                            break;
                        }
    
                        c.comment += 1;
                        continue 'line;
                    }
                }
    
                if multis.is_empty() {
                    c.code += 1;
                    continue 'line;
                }
            }
    
            if multi_stack.is_empty() && !multis.iter().any(|(start, end)| line.contains(start) || line.contains(end)) {
                c.code += 1;
                continue 'line;
            }
    
            let mut pos = 0;
            let mut found_code = 0;
            let line_len = line.len();
            let contains_utf8 = (0..line_len).any(|i| !line.is_char_boundary(i));
    
            'outer: while pos < line_len {
                    if contains_utf8 {
                        for i in pos..pos + min(max(start_len, end_len) + 1, line_len - pos) {
                            if !line.is_char_boundary(i) {
                                pos += 1;
                                continue 'outer;
                            }
                        }
                    }
    
                    if pos + start_len <= line_len && &line[pos..pos + start_len] == *start {
                        pos += start_len;
                        multi_stack.push(multis[0]);
                        continue;
                    }
    
                    if !multi_stack.is_empty() {
                        let (_, mut end) = multi_stack.last().expect("stack last");
                        if pos+end.len() <= line_len && &line[pos..pos+end.len()] == end {
                            let _ = multi_stack.pop();
                            pos += end.len();
                        }
                    } else if multi_stack.is_empty() && pos < line_len && !&line[pos..pos + 1].chars().next().expect("whitespace check").is_whitespace() {
                        found_code += 1;
                    }
                // }
                pos += 1;
            }
    
            // TODO(cgag): can this ever be greater or was that just defensive coding
            if found_code >= multis.len() {
                c.code += 1;
            } else {
                c.comment += 1;
            }
        }
    // ***YYZ note: Will run the original code if it has more than one element
    }else{
        'line: for byte_line in ByteLines(&bytes).lines() {
            let line = match std::str::from_utf8(byte_line) {
                Ok(s) => s,
                // TODO(cgag): should we report when this happens?
                Err(_) => return Count::default(),
            };
            c.lines += 1;
    
            let line = line.trim_start();
            // should blanks within a comment count as blank or comment? This counts them as blank.
            if line.is_empty() {
                c.blank += 1;
                continue;
            };
    
            // if we match a single line comment, count it and go onto next line
            // TODO(cgag): is the multiline comment start symbol ever the shorter one?
            // if multi_stack.is_empty, then we're not currently in a multiline comment
            if multi_stack.is_empty() {
                for single_start in singles.iter() {
                    if line.starts_with(single_start) {
                        // if this single_start is a prefix of a multi_start,
                        // make sure that the line doesn't actually start with the multi_start
                        // TODO(cgag): donm't do this check here
                        // TODO(cgag): this assumption that the multi-line comment is always the longer one
                        //             may well be a terrible one
                        if multis.iter().any(|(m_start, _)| line.starts_with(m_start)) {
                            break;
                        }
    
                        c.comment += 1;
                        continue 'line;
                    }
                }
    
                if multis.is_empty() {
                    c.code += 1;
                    continue 'line;
                }
            }
    
            if multi_stack.is_empty() && !multis.iter().any(|(start, end)| line.contains(start) || line.contains(end)) {
                c.code += 1;
                continue 'line;
            }
    
            let mut pos = 0;
            let mut found_code = 0;
            let line_len = line.len();
            let contains_utf8 = (0..line_len).any(|i| !line.is_char_boundary(i));
    
            'outer: while pos < line_len {
                for multi in multis.iter() {
                    let (start, end) = multi;
                    let start_len = start.len();
                    let end_len   = end.len();
    
                    // TODO(cgag): this is almost ceratinly giving us incorrect results.  Say the
                    // first multi is the longest.  If we advance position because the final byte
                    // position of that multi hits unicode, we might have skipped over a perfectly
                    // valid comment start that was unaffected by the unicode.
                    if contains_utf8 {
                        for i in pos..pos + min(max(start_len, end_len) + 1, line_len - pos) {
                            if !line.is_char_boundary(i) {
                                pos += 1;
                                continue 'outer;
                            }
                        }
                    }
    
                    if pos + start_len <= line_len && &line[pos..pos + start_len] == *start {
                        pos += start_len;
                        multi_stack.push(*multi);
                        continue;
                    }
    
                    if !multi_stack.is_empty() {
                        let (_, mut end) = multi_stack.last().expect("stack last");
                        if pos+end.len() <= line_len && &line[pos..pos+end.len()] == end {
                            let _ = multi_stack.pop();
                            pos += end.len();
                        }
                    } else if multi_stack.is_empty() && pos < line_len && !&line[pos..pos + 1].chars().next().expect("whitespace check").is_whitespace() {
                        found_code += 1;
                    }
                }
                pos += 1;
            }
    
            // TODO(cgag): can this ever be greater or was that just defensive coding
            if found_code >= multis.len() {
                c.code += 1;
            } else {
                c.comment += 1;
            }
        }
    }
    
    c
    

    } `

    opened by yyzdtccjdtc 2
  • When there are special characters in xml, vue, html, etc., loc will panic, causing the process to exit and statistics to fail. The patch ignores the error file.

    When there are special characters in xml, vue, html, etc., loc will panic, causing the process to exit and statistics to fail. The patch ignores the error file.

    When there are special characters in xml, vue, html, etc., loc will panic, causing the process to exit and statistics to fail. The patch ignores only the error file.

    opened by caofx0418 0
  • Does loc will have options to compare and provide the difference between files/directories

    Does loc will have options to compare and provide the difference between files/directories

    Is there a way to view the differences between files/directories in loc like there is in Cloc? In Cloc, we can compare two directories/files and see how many codes have been added, deleted, or modified. Is that option available in loc? If so, could you please show me how to do it?

    opened by mageshsankar 0
Owner
cgag
cgag
⚙️ A curated list of dynamic analysis tools for all programming languages, binaries, and more.

This repository lists dynamic analysis tools for all programming languages, build tools, config files and more. The official website, analysis-tools.d

Analysis Tools 650 Jan 4, 2023
A cryptographically verifiable code review system for the cargo (Rust) package manager.

image credit cargo-crev A cryptographically verifiable code review system for the cargo (Rust) package manager. Introduction Crev is a language and ec

crev - Code REView system 1.8k Jan 5, 2023
A Linter for bevy code

Bevy Lint What is Bevy Lint? This crates provides Lints for Bevy Code using dylint.

null 39 Dec 21, 2022
Source code spell checker

eztd is meant to close the ergonomics gap between Rust and Python.

Ed Page 9 Aug 14, 2022
Find the ideal fuzz targets in a Rust codebase

Siderophile Siderophile finds the "most unsafe" functions in your Rust codebase, so you can fuzz them or refactor them out entirely. It checks the cal

Trail of Bits 162 Dec 23, 2022
Rust Memory Safety & Undefined Behavior Detection

Rudra is a static analyzer to detect common undefined behaviors in Rust programs. It is capable of analyzing single Rust packages as well as all the packages on crates.io.

gts3.org (SSLab@Gatech) 1.2k Dec 31, 2022
Cloc - cloc counts blank lines, comment lines, and physical lines of source code in many programming languages.

cloc Count Lines of Code cloc counts blank lines, comment lines, and physical lines of source code in many programming languages. Latest release: v1.9

null 15.3k Jan 8, 2023
a cargo subcommand for counting lines of code in Rust projects

cargo-count Linux: A cargo subcommand for displaying line counts of source code in projects, including a niave unsafe counter for Rust source files. T

Kevin K. 125 Dec 1, 2022
Code for blog post "{n} times faster than C, where n = 128"

Code for {n} times faster than C, where n = 128 Actually, n = 290 ?? Benchmark Setup Rust version: rustc 1.70.0 (90c541806 2023-05-31) Run test: cargo

Thomas Ip 9 Jul 24, 2023
Explain semver requirements by converting them into less than, greater than, and/or equal to form.

semver-explain Convert SemVer requirements to their most-obvious equivalents. semver-explain is a CLI tool to explain Semantic Versioning requirements

Andrew Lilley Brinker 27 Oct 29, 2022
Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

null 294 Dec 23, 2022
Scriptable tool to read and write UEFI variables from EFI shell. View, save, edit and restore hidden UEFI (BIOS) Setup settings faster than with the OEM menu forms.

UEFI Variable Tool (UVT) UEFI Variable Tool (UVT) is a command-line application that runs from the UEFI shell. It can be launched in seconds from any

null 4 Dec 11, 2023
📈 The fastest map possible in Rust, where keys are integers and the capacity is fixed (faster than Vec!)

It is an alternative on-heap implementation of a map with keys of type usize and a fixed capacity. It works much faster than a standard HashMap becaus

Yegor Bugayenko 6 Apr 26, 2023
A reasonable web framework. Others are faster, but this is likely to be more economical.

intercity A web framework for people wanting to build microservices good and build other stuff good too. Intercity is a reasonable web framework. Othe

Tim McNamara 3 Nov 2, 2023
Count your code by tokens, types of syntax tree nodes, and patterns in the syntax tree. A tokei/scc/cloc alternative.

tcount (pronounced "tee-count") Count your code by tokens, types of syntax tree nodes, and patterns in the syntax tree. Quick Start Simply run tcount

Adam P. Regasz-Rethy 48 Dec 7, 2022
A CHIP-8 emulator for Rust in ~350 LOC

chip8 An implementation of the CHIP-8 for Rust in ~350 lines of code. What is CHIP-8? CHIP-8 is a virtual machine (along with a supporting programming

Daniel Gatis 8 Apr 23, 2022
More than safe rust abstractions over rytm-sys, an unofficial SDK for writing software for Analog Rytm running on firmware 1.70.

rytm-rs More than safe rust abstractions over rytm-sys, an unofficial SDK for writing software for Analog Rytm running on firmware 1.70. On top of CC

Ali Somay 5 Dec 22, 2023
Build smaller, faster, and more secure desktop applications with a web frontend.

TAURI Tauri Apps footprint: minuscule performance: ludicrous flexibility: gymnastic security: hardened Current Releases Component Descrip

Tauri 56.3k Jan 3, 2023
A Faster(⚡) formatter, linter, bundler, and more for JavaScript, TypeScript, JSON, HTML, Markdown, and CSS Lapce Plugin

Lapce Plugin for Rome Lapce-rome is a Lapce plugin for rome, The Rome is faster ⚡ , A formatter, linter, compiler, bundler, and more for JavaScript, T

xiaoxin 7 Dec 16, 2022
A drop-in replacement for std::time::Instant that is faster and more accurate.

Fastant A drop-in replacement for std::time::Instant that measures time with high performance and high accuracy powered by Time Stamp Counter (TSC). U

FastLabs 8 Sep 15, 2024