いつものあれです。
ltoa関数が使えない環境(Linuxとか)で動くように修正しました。[-]などを0の代入に置換えるようにしました。#include <stdio.h>
int main(void)
{
char array[3000] = "";
char *ptr = array;
*(ptr+2) = 8;
while(*(ptr+2)){
(*(ptr+2))--;
*(ptr+3) += 8;
}
*(ptr+6) += 9;
while(*(ptr+6)){
(*(ptr+6))--;
*(ptr+7) += 10;
}
while(*(ptr+7)){
*(ptr+5) = getc(stdin);
while(*(ptr+5)){
(*(ptr+5))--;
(*(ptr+6))++;
(*(ptr+4))++;
(*(ptr+2))++;
}
while(*(ptr+2)){
(*(ptr+2))--;
(*(ptr+5))++;
}
while(*(ptr+7)){
(*(ptr+7))--;
(*(ptr+8))++;
(*(ptr+10))++;
}
while(*(ptr+8)){
while(*(ptr+6)){
(*(ptr+6))--;
(*(ptr+7))++;
(*(ptr+9))++;
}
while(*(ptr+9)){
(*(ptr+9))--;
(*(ptr+6))++;
}
while(*(ptr+7)){
*(ptr+7) = 0;
(*(ptr+6))--;
}
(*(ptr+8))--;
}
while(*(ptr+10)){
(*(ptr+10))--;
(*(ptr+7))++;
}
while(*(ptr+3)){
(*(ptr+3))--;
(*(ptr+2))++;
(*ptr)++;
}
while(*(ptr+2)){
while(*(ptr+4)){
(*(ptr+4))--;
(*(ptr+3))++;
(*(ptr+1))++;
}
while(*(ptr+1)){
(*(ptr+1))--;
(*(ptr+4))++;
}
while(*(ptr+3)){
*(ptr+3) = 0;
(*(ptr+4))--;
}
(*(ptr+2))--;
}
while(*ptr){
(*ptr)--;
(*(ptr+3))++;
}
while(*(ptr+4)){
*(ptr+4) = 0;
*(ptr+5) += 32;
while(*(ptr+6)){
*(ptr+6) = 0;
*(ptr+5) -= 32;
}
}
*(ptr+6) = 0;
putc(*(ptr+5),stdout);
}
return 0;
}
何故か私の財布から7000円くらい消えた気がします。玄箱を買えるのは何時だろう……。
暇な時に読んでおきたい記事のメモ。多分試験が終わったら読む。
unsigned int division(unsigned int a,unsigned int b)
{
unsigned int count = 0;
unsigned int result = 0;
if(!b){
return 0;
}
while(a >= b<<count){
count++;
}
while(count){
count--;
if(a >= b<<count){
a = a-(b<<count);
result = result+(1<<count);
}
}
return result;
}
使う事は無いだろうけど、ビットシフトで除算関数を作ってみた。
良く考えてみるとこれ、機会語の仕様に良く似ている。そこまでは普通に作っていればそうなるのが当たり前だから良いのだけど、機能を増やす度に命令数が増えてオペレーションコードを割り振り直してソースコード全部書き直しってのはあまり良くないと思う。
明日の午後3時くらいから秋葉原でオフやります。参加したい人はoff_2007_10_21@hakurei.infoにメールを送ったり#Stricter.orgで連絡を取ろうとすると良いかも。
メールは私の携帯電話に転送するように設定されているので、集合10分前とかでも連絡が取れます。でも集合時間過ぎてから連絡を取ろうとするのは止めてください。
当日、私は朝から家にいないと思うので、IRCで連絡を取るのは無理だと思ってください。
場所が秋葉原なのでアレとかアレが嫌いな人は来ない方が良さそう。
QUERY_STRINGの解析前にも書いたと思うけど、バグの修正と速度の改善をしてみました。実際関数呼び出しの回数が多くなっているので速度が改善しているのかどうかは微妙ですが……。
char型の配列からQUERY_STRINGを読み込むようになっています。多分、ファイルから読み込むのも作ります。
#include<stdio.h>
#include<stdlib.h>
typedef struct query_string{
struct query_string *next;
struct query_string *prev;
char *tag;
char *data;
int tag_size;
int data_size;
} query_string_t;
int hex(char data){
if(data >= '0' && data <= '9'){
return data-'0';
}
else if(data|32 >= 'A' && data|32 <= 'F'){
return (data|32)-'A'+10;
}
else{
return -1;
}
}
query_string_t *decode_query_string(char *query_string){
query_string_t *pointer = (query_string_t *) calloc(1,sizeof(query_string_t));
int str_size;
if(pointer == NULL){
return NULL;
}
while(1){
str_size = 0;
while(1){
if(!str_size&63){
pointer->tag = (char *)realloc(pointer->tag,str_size+65);
if(!pointer->tag){
return NULL;
}
}
switch(*query_string){
case '=':
*(pointer->tag+str_size) = '\0';
query_string++;
pointer->tag_size = str_size+1;
goto tag_end;
case '&':
case '\0':
return NULL;
case '%':
if(hex(*(query_string+1)) == -1 | hex(*(query_string+2)) == -1){
return NULL;
}
*(pointer->tag+str_size) = (hex(*(query_string+1))<<4)+hex(*(query_string+2));
query_string = query_string+3;
break;
case '+':
*(pointer->tag+str_size) = ' ';
query_string++;
break;
default:
*(pointer->tag+str_size) = *query_string;
query_string++;
break;
}
str_size++;
}
tag_end:
str_size = 0;
while(1){
if(!str_size&63){
pointer->data = (char *)realloc(pointer->data,str_size+65);
if(!pointer->data){
return NULL;
}
}
switch(*query_string){
case '=':
return NULL;
case '&':
*(pointer->data+str_size) = '\0';
query_string++;
pointer->data_size = str_size+1;
goto data_end;
case '\0':
*(pointer->data+str_size) = '\0';
pointer->data_size = str_size+1;
goto end;
case '%':
if(hex(*(query_string+1)) == -1 | hex(*(query_string+2)) == -1){
return NULL;
}
*(pointer->data+str_size) = (hex(*(query_string+1))<<4)+hex(*(query_string+2));
query_string = query_string+3;
break;
case '+':
*(pointer->data+str_size) = ' ';
query_string++;
break;
default:
*(pointer->data+str_size) = *query_string;
query_string++;
break;
}
str_size++;
}
data_end:
pointer->next = (query_string_t *)calloc(1,sizeof(query_string_t));
if(!pointer->next){
return NULL;
}
pointer->next->prev = pointer;
pointer = pointer->next;
}
end:
while(pointer->prev){
pointer = pointer->prev;
}
return pointer;
}
Brainfuckのソースの最適化を書き直しているのだが、ループの中身が実行されるかどうかの判定で詰んだ。前のバージョンとポインタの管理方法が違うのが原因だと思うのだが、もしかしたら思考が停止しているだけかも知れない。
買う本を決めたのは良いのだが、金が無い。どうしよう。
この世界は全て入出力で成り立っているのだと思う。気の所為かも知れないけど。
自分は、この世は決定論だと思っています。いや、だから何って話ですが。
入力から出力を計算する関数の中身はブラックボックスですが、それが一定の物であれば未来は決まっている事になります。そもそもこの考え方が正しいのかどうかは分からないけど。
こんな物を買う金は無いのだけどどうしても気になってしまうので観察中。
この世界は全て入出力で成り立っているのだと思う。気の所為かも知れないけど。
本当はBrainfuck関連のツールは一つに纏めようかと思っていたのですが、コンパイラとか作ったらコマンドライン引数で制御するのが難しくなるだけなので、別々のツールとして改良を続ける予定。
とりあえず、GT5216jが家に届いたらpbfiの入出力用関数のアルゴリズムをどうにかします。多分。