"If you let the child go, it will act like a parent" "If child equals 0 that means we are in a child" "First thing you try to do, you try to fork a child, and if you successfully fork the child, you try and execute the child." -Tsoding, 2021
For checking if execvp was OK or not you can even avoid writing if statement and check for -1, because if everything was OK it will not move to the next line, cause the process will be changed and if something went wrong then it will continue. So you could write something like this: execvp(argv[0], argv); error(...); function which also exits with a non-zero status code.
28:07 That's me with the const keyword. When I try to do things half good with const, I end up with lots of compilation error until I say "fuck it" and unconst everything.
The documentation plugin looks very convenient. Each time I watch one of your videos, I am given the impression that my setup is relatively deprived. You appear to have every potentially useful resource hot-keyed.
That scratch buffer is very neat, feels useful, more sane and better compared to whatever I was doing with strcat() and realloc()s. 56:47 memcpy reading from empty string is as far as I understand it undefined behaviour, instead would add a function like: char *tmp_append_null(void) { char *result = tmp_alloc(1); memset(result, 0, 1); return result; } This communicates the end a bit better. Also with a few rewinds deep they are nice to jump to and make sense of what is happening. Just to be safe. char tmp[TMP_CAP + 1] = {0}; For when the entire TMP_CAP range might be filled so it still terminates with 0. Played with tmp_rewind() a bit more it will block the current concatenation. Found it useful for debugging to flag functionality into the rewind that memset()s with specific char per rewind called. In the example used base64 as 64 different tmp_rewind()s till a tmp_clean() seems more than enough? As more seems a bit excessive? But this way stepping through it and showing memory helps a bit to make sense on rewinds used nested or used in loops. // . . . #define RW_DEBUG #ifdef RW_DEBUG char rw_b64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; short int rw_tally = 0; // tmp_clean() resets to 0 char rw_pad(){ assert (rw_tally+1 < 64); // more than 64 rewinds deep till a tmp_clean() is a bit much? return rw_b64[rw_tally++]; } #endif // RW_DEBUG // . . . void tmp_clean() { #ifdef RW_DEBUG rw_tally = 0; // resets rewinding tally #endif tmp_size = 0; } // . . . void tmp_rewind(char *saved_end) { #ifdef RW_DEBUG { char * p_to_end = tmp + tmp_size; size_t rewind_region = p_to_end - saved_end; memset( saved_end, rw_pad(), rewind_region ); printf(" [RW_DEBUG] Rewind fill: %s ", saved_end + 1 ); } #endif tmp_size = saved_end - tmp; }
I would love to see you write some kind of client/server application, your insights on memory management especially remote are super interesting, and are the main reasons I avoid C/C++ for remote services
Wouldn't calling `tmp_clean()` (or rewind) inside the loop after printf be better? That way each of your arguments can be 8MB instead of the escaped total.
Quite impressive and very pleasant. I was wondering what else do you have (in case this is not enough) and bang! I need a couple of lifetime vacations of my current unemployment situation to stay up to date (did someone said C). Absolutely wonderful management of time. I don't usually see that much but technically this is unusal
Seems wasteful to create / write the dot file to disk. "dot" can read from stdin, which means that if you fork the dot command first (and do the proper pipe duping and closing) you can print your dotfile straight to the generator.
Hey, thanks for the video. Btw, I really don't like this `tmp_clean()` impl. I am sure, you need to clean the buffer with something like memset, or bzero, even if we are talking about demo purpose... Otherwise someone could copy this code, forgot about the important part and got security problem.
I think the real problem here is people copying random code from the Internet into security critical applications without thinking, not me just chilling and coding some stuff for fun. I disclaim any responsibility for the actions of such people. Not my problem, sorry.
you can actually add something like this at the beginning of a c file make it executable and it works like a shebang :D #if 0 cc -Wall -Wextra -std=c17 "$0"; exit #endif
Reusing tools and glueing them together via shell script preferred. This is too much effort practically speaking... Aesthetics: What's the point of text mode when using the mouse all the time? Also, consider using vim for efficiency. 👍
Look at the video id gachiGASM
this must be a sign
me when i have a gachigasm
Betudidnexpectet
www.youtube.com/watch?v=gachiGASM
According to TH-cam this video is not available any more.
"If you let the child go, it will act like a parent"
"If child equals 0 that means we are in a child"
"First thing you try to do, you try to fork a child, and if you successfully fork the child, you try and execute the child."
-Tsoding, 2021
lmao
Starts proper then goes south fast.
In vim, you can just press ctrl-x on a number and it will decrease its value automagically :)
And ctrl+a increase that number by one.
and emacs has a package for that too (not to start a fight, I use both)
I thought he switched to vim... didn't he?
@@alessandroias ngl it looks like evil emacs
ctrl+a for opposite direction
I really like your C programming stream.
Your good at explaining the thinking behind the code.
Thanks for your work.
For checking if execvp was OK or not you can even avoid writing if statement and check for -1, because if everything was OK it will not move to the next line, cause the process will be changed and if something went wrong then it will continue. So you could write something like this:
execvp(argv[0], argv);
error(...); function which also exits with a non-zero status code.
"Not all of my recreational activity is actually watchable."
Not if you don't switch your platform.
28:07 That's me with the const keyword. When I try to do things half good with const, I end up with lots of compilation error until I say "fuck it" and unconst everything.
24:53 don't know how he said it with a straight face
Years of practice
@@TsodingDaily ah yes
The documentation plugin looks very convenient. Each time I watch one of your videos, I am given the impression that my setup is relatively deprived. You appear to have every potentially useful resource hot-keyed.
That scratch buffer is very neat, feels useful, more sane and better compared to whatever I was doing with strcat() and realloc()s. 56:47 memcpy reading from empty string is as far as I understand it undefined behaviour, instead would add a function like:
char *tmp_append_null(void)
{
char *result = tmp_alloc(1);
memset(result, 0, 1);
return result;
}
This communicates the end a bit better. Also with a few rewinds deep they are nice to jump to and make sense of what is happening.
Just to be safe. char tmp[TMP_CAP + 1] = {0}; For when the entire TMP_CAP range might be filled so it still terminates with 0.
Played with tmp_rewind() a bit more it will block the current concatenation. Found it useful for debugging to flag functionality into the rewind that memset()s with specific char per rewind called. In the example used base64 as 64 different tmp_rewind()s till a tmp_clean() seems more than enough? As more seems a bit excessive? But this way stepping through it and showing memory helps a bit to make sense on rewinds used nested or used in loops.
// . . .
#define RW_DEBUG
#ifdef RW_DEBUG
char rw_b64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
short int rw_tally = 0; // tmp_clean() resets to 0
char rw_pad(){
assert (rw_tally+1 < 64); // more than 64 rewinds deep till a tmp_clean() is a bit much?
return rw_b64[rw_tally++];
}
#endif // RW_DEBUG
// . . .
void tmp_clean()
{
#ifdef RW_DEBUG
rw_tally = 0; // resets rewinding tally
#endif
tmp_size = 0;
}
// . . .
void tmp_rewind(char *saved_end)
{
#ifdef RW_DEBUG
{
char * p_to_end = tmp + tmp_size;
size_t rewind_region = p_to_end - saved_end;
memset( saved_end, rw_pad(), rewind_region );
printf(" [RW_DEBUG] Rewind fill: %s
", saved_end + 1 );
}
#endif
tmp_size = saved_end - tmp;
}
man I don't understand shit, but still keep watching
I would love to see you write some kind of client/server application, your insights on memory management especially remote are super interesting, and are the main reasons I avoid C/C++ for remote services
I was thinking the same thing!
hey tsoding, you're missing a colon on the third line of the description. Lol!
Check again
@@TsodingDaily hey tsoding, you're missing a colon on the second line of the description. Lol!
pull requests be like
Wouldn't calling `tmp_clean()` (or rewind) inside the loop after printf be better? That way each of your arguments can be 8MB instead of the escaped total.
Sure, you have a lot of flexibility with this approach.
🐴
I like the idea that a zero urgency todo is just a Tod. I have 1000s of Tods I will never get around to.
nice video, it helped me to learn a lot thanks
This was awesome lecture.
Noice video. But where was the intro? I didn't expect no intro. :(
Quite impressive and very pleasant. I was wondering what else do you have (in case this is not enough) and bang!
I need a couple of lifetime vacations of my current unemployment situation to stay up to date (did someone said C).
Absolutely wonderful management of time. I don't usually see that much but technically this is unusal
This was probably recommended to me because the channel has TS in the name, but no TS in the channel, which is sad.
But good content. Big fan
back to emacs
you probably know it, but just in case graphviz is usable as c library too. hope you are fine and smh have still access to the internet. stay safe
Seems wasteful to create / write the dot file to disk. "dot" can read from stdin, which means that if you fork the dot command first (and do the proper pipe duping and closing) you can print your dotfile straight to the generator.
Подскажите, пжл, имя темы для емакса :) Could you tell me , please, the emacs's theme name? Thanks!
It's gruber darker I think
"I'am literally copying code from python" ... just alike modern history of c++
Hey, thanks for the video.
Btw, I really don't like this `tmp_clean()` impl. I am sure, you need to clean the buffer with something like memset, or bzero, even if we are talking about demo purpose... Otherwise someone could copy this code, forgot about the important part and got security problem.
I think the real problem here is people copying random code from the Internet into security critical applications without thinking, not me just chilling and coding some stuff for fun.
I disclaim any responsibility for the actions of such people. Not my problem, sorry.
@@TsodingDaily ok, thanks for the response.
The name "trie" comes from the word "reTRIEval".
и ни одного комментария на русском(
I am trailing behind oOoooo. Still on vim, what am I waiting for! Close the windows.
you can actually add something like this at the beginning of a c file make it executable and it works like a shebang :D
#if 0
cc -Wall -Wextra -std=c17 "$0"; exit
#endif
Reusing tools and glueing them together via shell script preferred. This is too much effort practically speaking... Aesthetics: What's the point of text mode when using the mouse all the time? Also, consider using vim for efficiency. 👍
Yay first
Pretty cool!