C プログラミング サンプル(文字操作例)


html ファイルから特定のタグを削除します。
<script ....> 〜 </script>、 <noscript ....> 〜 </noscript>、
<iframe ....> 〜 </iframe>、 http を含む <link ...> タグ
(CSSを含むすべての link を削除するなら、link_print_flag = NOFAVOR で再コンパイルする)

完成したプログラムを 送る(SendTo) に登録して、マウスの右クリックから簡単に操作
出来るようにします。

ソースをコンパイルし、実行形式を作成して利用してください。



1、cygwin がインストールされており、gcc が利用できる状態にあることが前提です。
  (実行環境に、
cygwin は必要ありません


2、コマンド プロンプトを起動します。 
コマンドプロンプト内で次の手順で行います。

C:¥Documents and Settings¥anonymous>mkdir ¥removetag

C:¥Documents and Settings¥anonymous>cd ¥removetag

C:¥removescript>notepad removetag.c


C:¥removescript>gcc -mno-cygwin -mwindows -o removetag removetag.c


C:¥removescript>ls
removetag.c  removetag.exe

C:¥removescript>explorer.exe .

C:¥removescript>



3、explorer.exe . により、次の画面が立ち上がります。



4、ショットカットの作成先の SendTo フォルダーを開く


「スタート」ボタン →
「ファイル名を指定して実行」
 を選択
 名前(O): フィールドに半角で「sendto」と入力する




5、プログラムのショットカットを SendTo フォルダーに作成する
プログラムのあるウインドウで、対象プログラムのアイコン上にマウスカーサーを移動させて、
右クリックしポップアックメニューを開き、コピーを選択する。
SendTo のウインドウの背景部(白い部分)で、マウスを右クリックしポップアップメニューを開き、
ショートカットの貼り付けを選択する。
SendTo に プログラムのシュートカットが作成されましたので、マウスの右クリックから
アプリケーションの起動が可能になりました。
必要にあわせて、名前を変更します。


6、メニューの送るから、プログラムを呼び出す。


一度 web page を保存します。 再度保存しようとすると先ほど保存した web page が表示されますので、
web page のアイコン上で、マウスを右クリックするとポップアップメニューが現れます。
送る(N) にマウスカーサを合わせるとサブメニューが表示され、先ほど登録した removetag.exe が
選択出来るようになっていますので、マウスカーサを removetag.exe へのシュートカット に移動し、
マウスの左ボタンをクリックすれば html 内のタグが削除されます。
removetag.exe は、オリジナルの html ファイルのバックアップは作成しませんので注意してください。



サンプルプログラムのソースコード (removetag.c: Obsolete. See rmtags.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
// gcc -mno-cygwin -mwindows -o removetag removetag.c
// gcc -mno-cygwin -o removetag removetag.c

#define TAG_MAX_SIZE      2048
#define TOKEN_MAX_SIZE    512
#define FAVOR     1
#define NOFAVOR   (!FAVOR)

int     link_print_flag = FAVOR ;

unsigned char *buffer ;
struct stat   fileInfo;

unsigned char     getToken(unsigned char *buff, unsigned char *token, int n)
{
register int     i, c ;

    for( i=0, *token='¥0'; (c=*(buff+i)) != '¥0' && i<=n; i++ ) {
        if( c != ' ' && c != '>'&& c != '¥r' && c != '¥n' ) {
            *(token+i) = tolower(c) ; *(token+i+1) = '¥0' ;
        } else return(c) ;
    }
}

int    seekEndToken(unsigned char *buff, unsigned char *token)
{
unsigned char tkn[TOKEN_MAX_SIZE] ;
register int     i, c ;

    for( i=1; (c=*(buff+i)) != '¥0'; i++ ) {
        if ( c == '<' ) {
            getToken((buff+i), tkn, strlen(token)) ;
            strcat( tkn, ">") ;
            if( strcmp( token, tkn ) == 0 ) {
                return( i + strlen(token) -1 ) ;
            }
        }
    }
    return( i ) ;
}

unsigned char *checkStringsInTag(unsigned char *tag, unsigned char *strings)
{
unsigned char lowercase[TAG_MAX_SIZE] ;
register int     i, length = (TAG_MAX_SIZE -1) > strlen(tag) ? strlen(tag) : TAG_MAX_SIZE -1 ;

    for( i=0; i<length; i++ ) {
        lowercase[i] = tolower(*(tag +i)) ; lowercase[i+1] = '¥0';
    }
    return( strstr(lowercase, strings) ) ;
}

int    linkTagOperation(unsigned char *buff, int size, int flag, FILE *fpo)
{
unsigned char link[TAG_MAX_SIZE] ;
register int     i, j ;

    link[0] = '¥0' ;
    for(i=j=0; *(buff+i) != '>' && *(buff+i) != '¥0' && !(j>0 && *(buff+i)=='<'); i++) {
        if( j < TAG_MAX_SIZE -3 ) {
            link[j] = *(buff+i); link[j+1] = '>'; link[j+2] = '¥0';
            j++;
        }
    }
    if( *(buff+i) == '<' || *(buff+i) == '¥0' ) {
        fprintf( stderr, "Bad file format!¥n" );
        if( *(buff+i) == '¥0' ) {
            exit(1);
        }
    } else if( checkStringsInTag(link, "http") == NULL && flag == FAVOR) {
        fprintf( fpo, "%s", link ) ;
    }
    return( i ) ;
}

execution(unsigned char *buff, int size, FILE *fpo)
{
unsigned char token[TOKEN_MAX_SIZE], link[TAG_MAX_SIZE] ;
register int     i, j ;

    for( i=0; i<size; i++ ) {
        if( *(buff+i) == '<' &&  *(buff+i+1) != '/' ) {
            getToken((buff+i), token, sizeof(token)-1) ;
            if( strcmp( token, "<script") == 0 ) {
                i += seekEndToken( (buff+i), "</script>") ;
            } else if( strcmp( token, "<noscript") == 0 ) {
                i += seekEndToken( (buff+i), "</noscript>") ;
            } else if( strcmp( token, "<iframe") == 0 ) {
                i += seekEndToken( (buff+i), "</iframe>") ;
            } else if( strcmp( token, "<link") == 0 ) {
                i += linkTagOperation( buff+i,  size -i+1, link_print_flag, fpo ) ;
            } else     fputc( *(buff+i), fpo ) ;
        } else    fputc( *(buff+i), fpo ) ;
    }
}

read_data(unsigned char *buff, int size, FILE *fpi)
{
register int     i, c ;

    for( i=0; i<size ; i++ ) {
        if((c=fgetc(fpi)) == EOF ) {
            fprintf( stderr, "Unexpected EOF was found.¥n" );
        } else *(buff+i) = c ;
    }
    *(buff+size) = '¥0' ;
}

main( int argc, char *argv[])
{
FILE    *fpi, *fpo ;
register int     data_size = 0 ;

    if( argc != 2 ) {
        fprintf( stderr, "usage: %s html_file¥n", argv[0] );
        exit( 1 ) ;
    } else if( (fpi=fopen(argv[1],"rb")) == NULL ) {
        fprintf( stderr, "File '%s' open error!¥n", argv[1] );
        exit( 1 ) ;
    }
    if ( fstat(fileno(fpi), &fileInfo) != 0 ) {
        fprintf( stderr, "fstat failed!¥n" );
        exit( 1 ) ;
    } else data_size = fileInfo.st_size ;

    buffer = (unsigned char *)malloc(data_size +1) ;
    if(buffer == NULL) {
        fprintf( stderr, "Could not allocate memory!¥n" );
        exit( 1 ) ;
    } else read_data(buffer, data_size, fpi) ;
    fclose(fpi) ;

    if((fpo=fopen(argv[1],"wb")) == NULL ) {
        fprintf( stderr, "File '%s' open error!", argv[1] );
        exit( 1 ) ;
    } else execution(buffer, data_size, fpo);
    fclose(fpo) ;

    free(buffer);
    return 0 ;
}
注意事項: windows のライブラリーのみを使用するために fopen 時にバイナリーモードの指定 ”b” も行う。


go to TopPage go to CategoryTop