Skip to main content


Showing posts from March, 2023

C is Not a Subset of C++

I came across an absurd article. A well-written C program is a C++ program. Therefore, a well-written C program should be compilable with a C++ compiler. This statement was undoubtedly true before 1999. Bjarne Stroustrup definitely took C compatibility into account when creating C++. At that time, well-written C code that adhered to the ANSI C standard was correctly compiled with a C++ compiler. However, that's limited to the time before the release of C99. C99 introduced various new features, which C++ had already implemented differently or did not consider necessary. Moreover, the release of the new C11 standard and the new C++ standards(C++03, C++11, and more) have widened the gap between the two languages to a point where it is practically impossible to bridge. Code that follows the C89 standard can still be compiled with a C++ compiler. But how many programs nowadays use C89? Try to find an actively developed project that uses C89. I have never tried to find one. So,

[C++] Object slicing

Object slicing refers to the loss of information from a derived class instance when it is copied to a parent class instance, due to the nature of value types that assign values to the stack instead of the heap. This is a bug that occurs in languages like Java, which only have reference types that allocate values to the heap. Upcasting should not be used for value types due to the issue of object slicing. In most cases where upcasting is needed, there is already an issue with the code that needs to be fixed. If upcasting must be used under certain circumstances, values must be assigned to the heap. This article is a translation of a Korean post written in 2015. If you would like to view the original, please refer to this link .

What Is RAII

RAII is a frequently used idiom in C++ that ensures the safe usage of resources by releasing them when an object's scope ends. In C++, resources allocated on the heap are not released unless explicitly done so, but those allocated on the stack are automatically released when their scope ends, triggering their destructor. Originally, RAII was used to guard against unexpected changes in control flow, such as exceptions. In the above code example, the unsafeFunction() function is not safe. If the thisFunctionCanThrowException() throws an exception, the resource may not be released. The unmaintanableFunction releases the resource , but it is not easy to read and maintain. The safeFunction example uses unique_ptr , a smart pointer introduced at C++11, for RAII. unique_ptr automatically releases the memory it holds when it is destroyed, ensuring that the resource is released when the function exits. The resource does not only refer to heap memory but also includes files, d

Cursor Movement with CSI Sequences

Code Abbr Name CSI # A CUU CUrsor Up CSI # B CUD CUrsor Down CSI # C CUF CUrsor Forward CSI # D CUB CUrsor Backward CSI # E CNL CUrsor Next Line CSI # F CPL CUrsor Previous Line CSI # I CHT Cursor Horizontal forward Tabulation CSI # Z CBT Cursor Backward Tabulation CSI # G CHA Cursor Horizontal Absolute CSI # ; # H CUP CUrsor Position Today, we will continue from the  previous article to explore how to move the cursor using CSI sequences. The types of CSI sequences for moving the cursor can be summarized as follows. CUU, CUD, CUF, CUB These are the abbreviations for CUrsor Up, CUrsor Down, CUrsor Forward, and CUrsor Backward; as the names suggest, they move the cursor up, down, forward, and backward. They take a single number as an argument; if the argument is omitted, it is treated as 1. Thus, 0x1b[A is equivalent to 0x1b[1A . In this case, CUF and CUB move only within the same line. In other words, CUB received

Use Carriage Return for Simple Progress Bar in Text Applications

Since most systems, including Unix, use LF ( \n , 0x0A ) as a newline character, using of CR ( \r , 0x0D ) is quite rare. One of the few cases where CR is used in modern computers is when creating progress bars in text applications. Using CR allows for a simple implementation of progress bars in terminals. The code above draws a progress bar with # and ' '(space). For convenience, I fixed the progress bar's length at 20 characters, adding one # for every 5% increase in progress. When using CR to draw a progress bar like this, there are three points to consider. The first point is to draw the progress bar on stderr instead of stdout . One of the significant differences between stdout and stderr is that stdout buffers output rather than immediately displaying it on the screen. Typically, stdout buffers output until it encounters a newline character. Therefore, if you print a progress bar without a newline character on stdout , the screen will not be updated unti

Handling Terminal Output with Termios

As I explained in the previous article , Unix-like operating systems, for instance, OS X and Linux, use LF (line feed, 0x0A , \n ) as the newline character which moves the cursor to the beginning of the next line. However, the standard-defined behavior of LF only moves the cursor down to the next line, not to the beginning of the line. This difference is acceptable if files are always accessed through operating system-dependent applications. However, Unix-like systems have no distinction between files and input/output; this difference can be problematic when file and process input/output interact. To handle this difference, a terminal emulator post-processes the output appropriately. The c_oflag in the termios structure defined by the POSIX.1 standard controls this. The c_oflag is a flag for what post-processing the terminal should perform before displaying the received characters. The most important flag in c_oflag is OPOST . This flag determines whether or not to post-pro

CR, LF, and CRLF

One of the confusing aspects for people working across multiple platforms is the newline character. Mac OS, Windows, and Linux all use different characters for newline. Even Mac OS behaves differently between older and newer versions. In this article, we will explore the reasons behind the different newline characters used across systems. According to the ISO 6429 standard, LF (line feed, \n) moves the cursor to the next line while maintaining the current column, and CR (carriage return, \r ) moves the cursor to the beginning of the current line. To achieve the newline function, both CR and LF should be used together. This distinction was made to mimic the behavior of early printers and typewriters that separated the line-changing action from the action of moving the cursor to the beginning. A B For instance, a string " A\nB " should not result in B directly below A , but rather B should appear diagonally below A , like in the above example. However, systems usin

Understanding Escape Codes and Control Sequences

The exact term of escape code defined in ISO 6429 is a control function. Escape code is commonly used to refer to the code or sequence that represents control functions. Control codes defined by ISO 6429 are divided into two categories; C0 codes and C1 codes. C0 codes correspond to non-printing characters in ASCII . These codes are familiar to developers. It includes line feed ( \n ), carriage return ( \r ), tab ( \t ), and null character ( \0 ). There are 32 codes in C1. They are represented by one-byte values between 0x80 and 0x9F . Unlike C0 codes, C1 codes are not defined in ASCII . They can only be used in terminals that support ASCII . In other words, they are available in 7-bit environments. In modern 8-bit environments, C1 codes cannot be used directly and must be expressed as escape sequences. Therefore, most modern terminals use escape sequences to represent C1 codes when needed. An escape sequence is a series of characters that begins with ESC ( 0x1B ). Sequences t

Brief History of Escape Codes

When installing Linux on a computer, I always install a program called sl . This program displays a train when you execute sl . It is not a practical program but rather a program that gives you time to think when you make a typo with the commonly used ls command in the terminal. Showing a train on the screen helps you calm down and not make other mistakes when you are in a hurry to type. That's why I install this program. source: The terminal is a program that receives and displays two streams, stdout, and stderr, from a program. These outputs are sequential outputs and typically flow from the top left to the bottom right. However, to draw new characters on an already-used screen, a special method is needed. This special method is called escape codes . Escape codes are a kind of promise defined in the terminal. Currently, these promises follow the standards defined in ISO 6429 . However, in the past, there was no unified consensus, and each term