#include #include #include #include "aa.h" // ASCIIアートのメモリ領域を解放 void FreeAa(Aa *a) { if (a == NULL) return; free(a->cell); free(a); } // ASCIIアートのメモリ領域を確保 Aa *NewAa(int sx, int sy) { Aa *a; a = (Aa *)malloc(sizeof(Aa)); if (a == NULL) return (NULL); a->cell = (char *)calloc(sx*sy, sizeof(char)); if (a->cell == NULL) { FreeAa(a); return (NULL); } a->sx = sx; a->sy = sy; return (a); } // ASCIIアートの第i行に文字列s を記入 int SetAaRow(Aa *a, int i, char *s) { char *p; if (i >= a->sy) return (1); if (strlen(s) != a->sx) return (1); p = a->cell + (a->sx)*i; while (*s != '\0') { *p = *s; p++; s++; } return (0); } // ASCIIアートのセル(x, y) に文字c を記入 char SetAaCell(Aa *a, int x, int y, char c) { if (x < 0) return (0); if (y < 0) return (0); if (x >= a->sx) return (0); if (y >= a->sy) return (0); a->cell[(a->sx)*y + x] = c; return (c); } // ASCIIアートのセル(x, y) から文字を取得 char GetAaCell(Aa *a, int x, int y) { if (x < 0) return (0); if (y < 0) return (0); if (x >= a->sx) return (0); if (y >= a->sy) return (0); return (a->cell[(a->sx)*y + x]); } // 位置(x0, y0) に ASCIIアートを表示 void MvDrawAa(int x0, int y0, Aa *a) { int x, y; char *p; p = a->cell; for (y = 0; y < a->sy; y++) { for (x = 0; x < a->sx; x++) { mvaddch(y0 + y, x0 + x, *p); p++; } } } // 現在のカーソル位置に ASCIIアートを表示 void DrawAa(Aa *a) { int x0, y0; // 画面上の基準位置 getyx(stdscr, y0, x0); // 現在のカーソル位置を取得 MvDrawAa(x0, y0, a); } // ASCIIアートのセルから文字c を検索 char *QueryAaCell(Aa *a, char c) { int x, y; char *p; // セルへのポインタ p = a->cell; for (y = 0; y < a->sy; y++) { for (x = 0; x < a->sx; x++) { if (*p == c) return (p); // 発見 p++; } } return (NULL); // 未発見 }