UNIXv1における制御文字を用いたclearコマンドの作り方

はじめに

本記事は「日本陰キャ協会 Advent Calendar 2022」における12日目の記事になります。

qiita.com

目次

動作確認に関して

今回の方法はManjaroLinuxにおけるkonsoleにて動作確認を行いました。また、制御文字に依存しているため、全ての端末で動作するとは限りません。

UNIXv1とは

UNIXv1とは1971年に公開されたUNIXの1st Editionとなります。また、特徴としてマルチタスキング、マルチユーザー、階層型ファイルシステム持っており、現代のOSにつながる要素を持っています。

制御文字とは?

制御文字とは、文字コードで決められた周辺機器の制御などに用いる特殊な文字のことです。今回利用するのは、ターミナルを制御するエスケープシーケンスとなります。

clearコマンドとは?

端末の画面をクリアにするコマンドになります。

処理の流れ

処理の流れは以下のようになります。

last1120cを用いた実装

下記コードが全体のソースコードになります。

/* clear command */

main(){
  extern clear, rcur;
  clear();
  rcur();
  return;
}

/* clear:screen clear */
clear(){
  extern esc;
  esc("2J");
}

/* rcursor: reset curosor */
rcur(){
  extern esc;
  esc("H");
}

/* esc */
/* code:escape sequences code */
esc(code)
char code[];
{
  extern printf;
  printf("%c[%s", 033, code);
}

esc関数

エスケープシーケンスを発行する処理を行う関数です。033を1バイトの8進数として表示をし、文字列として続くcodeを出力します。

/* esc */
/* code:escape sequences code */
esc(code)
char code[];
{
  extern printf;
  printf("%c[%s", 033, code);
}

clear関数

画面をクリアするエスケープシーケンスを出力する処理を行う関数です。"\033[2J"を出力させます。

/* clear:screen clear */
clear(){
  extern esc;
  esc("2J");
}

rcur関数

カーソル位置を0行目の0文字目に移動する処理を行う関数です。 "\033[H"を出力させます。

/* rcursor: reset curosor */
rcur(){
  extern esc;
  esc("H");
}

使ってみる

おやなにかの木が...。

見ていると心が傷んでくるので消しておきましょう。

これで心の安寧は保たれました。

まとめ

クリスマスは消えました!!!

PS)
消しそこねた人は「クリスマス?なにそれ美味しいの?」を聞きながら当日を過ごしましょう。

www.nicovideo.jp

参考文献

The Restoration of Early UNIX Artifacts
https://www.usenix.org/legacy/event/usenix09/tech/full_papers/toomey/toomey.pdf:

FreeBSD Manual Pages - clear
https://www.freebsd.org/cgi/man.cgi?query=clear&apropos=0&sektion=0&manpath=FreeBSD+13.1-RELEASE+and+Ports&arch=default&format=html

プログラミング色々
http://7ujm.net/etc/esc.html