fordon_greeman / sfetch

Branch: 5e2bd5d
Switch branches/tags
main
theidioticdev feat: new penguin, quotes, mem fetching, update readme 5e2bd5d 4d ago
186 lines · 4.8 KB Raw Blame History
1 #include <stdio.h>
2 #include <sys/utsname.h>
3 #include <string.h>
4 #include <libgen.h>
5 #include <unistd.h>
6 #include <stdlib.h>
7
8 #define C_RESET "\033[0m"
9 #define C_BOLD "\033[1m"
10 #define C_ORANGE "\033[38;5;208m"
11 #define C_BLUE "\033[1;34m"
12 #define C_YELLOW "\033[1;33m"
13 #define C_CYAN "\033[1;36m"
14 #define C_GREEN "\033[1;32m"
15 #define C_RED "\033[1;31m"
16 #define C_PURPLE "\033[1;35m"
17
18 #define ENABLE_ASCII 1
19 #define ENABLE_QUOTE 1
20
21 const char *version = "0.1.6";
22
23 void
24 print_text (void)
25 {
26 #if ENABLE_QUOTE
27 printf ("\n " C_PURPLE "\"the quick fox jumps somewhere, idk.\"\n\n" C_RESET);
28 #endif
29 }
30 void
31 print_ascii (void)
32 {
33 #if ENABLE_ASCII
34
35 static const char asciiArt[] =
36 "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⠤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \n"
37 "⠀⠀⠀⠀⠀⠀⠀⠀⣤⣶⠿⠉⠉⠉⠀⠉⠉⠿⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \n"
38 "⠀⠀⠀⠀⠀⠀⣀⣿⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠿⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \n"
39 "⠀⠀⠀⠀⠀⠀⣿⠉⠀⠀⠀⠀⠶⣶⣶⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀ \n"
40 "⠀⠀⠀⠀⠀⣿⠛⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣤⣤⣿⣿⣤⣀⠀⠀⠀⠀⠀⠀ \n"
41 "⠀⠀⠀⠀⣀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠿⣿⣉⣉⠀⠀⠀⠀⠉⣶⠀⠀⠀⠀⠀ \n"
42 "⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⣿⣿⣤⣤⣤⠛⠀⠀⠀⠀⠀ \n"
43 "⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⣀⣶⠶⠶⠿⠉⠉⠿⠿⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀ \n"
44 "⠀⠀⠀⠀⣿⠀⠀⠀⠀⣤⣿⠉⠀⠀⠀⠀⠀⠀⠀⠛⣿⠀⠀⠀⠀⠀⠀⠀⠀ \n"
45 "⠀⠀⠀⠀⣿⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⣿⠀⠀⠀⠀⠀⠀⠀ \n"
46 "⠀⠀⠀⠀⣿⣶⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⠛⣤⣤⠀⠀⠀⠀⠀ \n"
47 "⠀⣶⣿⠛⠛⠀⠛⠶⠶⣿⠶⠶⠶⠶⠶⠶⠶⠶⣛⣛⠛⠀⠀⠛⠿⣶⠀⠀⠀ \n"
48 "⠀⠉⠛⠒⣶⣤⣤⣶⠒⠛⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠒⣶⣤⣤⣶⠛⠀⠀⠀";
49
50 printf (C_GREEN "%s" C_RESET "\n\n", asciiArt);
51 #endif
52 }
53
54 /* generic way of getting ram, sadly sysinfo sucks ass */
55 void
56 get_mem (unsigned long *total, unsigned long *avail)
57 {
58 FILE *fp = fopen ("/proc/meminfo", "r");
59 if (!fp)
60 return;
61 char line[255];
62 while (fgets (line, sizeof (line), fp))
63 {
64 if (strncmp (line, "MemTotal:", 9) == 0)
65 sscanf (line + 9, "%lu", total);
66 else if (strncmp (line, "MemAvailable:", 13) == 0)
67 sscanf (line + 13, "%lu", avail);
68
69 if (*total && *avail)
70 break;
71 }
72 fclose (fp);
73 }
74
75 /* ty "bugs in nixmania" on tonybtw discord */
76 void
77 print_os (void)
78 {
79 #ifdef __linux__
80 FILE *fp = fopen ("/etc/os-release", "r");
81 if (fp)
82 {
83 static const char key[] = "PRETTY_NAME=";
84 const size_t klen = sizeof key - 1;
85 char buf[256];
86 while (fgets (buf, sizeof buf, fp))
87 {
88 if (strncmp (buf, key, klen) != 0)
89 continue;
90 buf[strcspn (buf, "\n")] = '\0';
91 char *val = buf + klen;
92 size_t len = strlen (val);
93 if (len >= 2 && (val[0] == '"' || val[0] == '\'') &&
94 val[len - 1] == val[0])
95 {
96 val[len - 1] = '\0';
97 val++;
98 }
99 printf (C_CYAN "OS: " C_RESET "%s\n", val);
100 fclose (fp);
101 return;
102 }
103 fclose (fp);
104 }
105 printf (C_CYAN "OS: " C_RESET "Generic Linux\n");
106 #else
107 struct utsname other_os;
108 if (uname (&other_os) != 0)
109 {
110 perror ("uname");
111 return;
112 }
113 printf (C_CYAN "OS: " C_RESET "%s\n", other_os.sysname);
114 #endif
115 }
116
117 int
118 print_stats (void)
119 {
120 /* preparing the remaining stats */
121 char *shell = getenv ("SHELL");
122
123 char *term = getenv ("TERM_PROGRAM");
124 if (!term)
125 {
126 term = getenv ("TERM");
127 }
128
129 char *wm = getenv ("XDG_CURRENT_DESKTOP");
130 if (!wm)
131 {
132 wm = getenv ("DESKTOP_SESSION");
133 }
134
135 struct utsname info;
136 if (uname (&info) != 0)
137 {
138 perror ("uname");
139 return 1;
140 }
141
142 /* actual printing */
143 print_os ();
144
145 printf (C_RED "Shell: " C_RESET "%s\n", basename (shell));
146
147 printf (C_ORANGE "Kernel: " C_RESET "%s %s\n", info.sysname, info.release);
148
149 printf (C_YELLOW "WM: " C_RESET "%s\n", wm ? wm : "unknown/tty" );
150
151 printf (C_GREEN "Host: " C_RESET "%s\n", info.nodename);
152
153 printf (C_BLUE "Term: " C_RESET "%s\n", term ? term : "unknown");
154
155 unsigned long total_kb = 0, avail_kb = 0;
156 get_mem (&total_kb, &avail_kb);
157
158 if (total_kb > 0)
159 {
160 unsigned long used_mb = (total_kb - avail_kb) / 1024;
161 unsigned long total_mb = total_kb / 1024;
162 printf (C_PURPLE "Mem: " C_RESET "%luMiB / %luMiB\n", used_mb,
163 total_mb);
164 }
165
166 return 0;
167 }
168
169 int
170 main (int argc, char **argv)
171 {
172 for (int i = 1; i < argc; i++)
173 {
174 if (strcmp (argv[i], "-v") == 0 || strcmp (argv[i], "--version") == 0)
175 {
176 printf ("sfetch-%s\n", version);
177 return 0;
178 }
179 fprintf (stderr, "Unknown argument: %s\nUsage: %s [-v]\n", argv[i], argv[0]);
180 return 1;
181 }
182 print_text ();
183 print_ascii ();
184 print_stats ();
185 return 0;
186 }