Los siguientes ejemplos de "Scripts" pueden guardarse en archivos .TSI, editar los archivos con el editor de TEIMSI y compilarse en programas ".EXE". Los ejemplos se pueden ver situados dentro de dos renglones con líneas separadoras (que son cadenas de la forma "; //################# ... "), en el editor basta apretar el botón F9 para insertar una donde está el cursor en el texto.
Lista de ejemplos:
Programa para transformar un archivo cualquiera en notación db decimal
; //######################################################################################################## // En este ejemplo, el contenido del archivo de entrada se tiene que limitar al de caracteres legibles en textos. Los "Bytes" del archivo "archivo1.txt" serán // transformados a números de códigos ASCII en el rango de valores del 0 al 255, la lista generada se escribirá en el archivo "archivo2.txt". var archivo1="archivo1.txt" var archivo2="archivo2.txt" alert("Este programa cargará el archivo " + archivo1 + ", y guardará en el archivo " + archivo2 + ", el contenido del primero en una notación decimal de datos.") if(fileexists(archivo1)==false){ alert("No se hallo el archivo "+archivo1); sys.quit() } if(filesize(archivo1)>100000){ alert("El archivo no se cargará porque tiene más de 100 kb de tamaño."); sys.quit() } var datos=binary_read(archivo1) if(datos==false){ alert("Error al cargar "+archivo1); sys.quit() } var longitud=len(datos), puntero=0, bytes_por_renglon=50, texto_salida=""; while(puntero<longitud){ var cantidad_bytes=min((longitud-puntero),bytes_por_renglon) texto_salida+=" db " for(var c=0;c<cantidad_bytes;c++){ if(c>0){ texto_salida+=","; } texto_salida+=ascat(datos, puntero+c); } texto_salida+=_nl; // Observación: _nl = chr(13)+chr(10) puntero+=bytes_por_renglon } alert("Resultado de escritura en archivo2.txt = " + binary_write(archivo2, texto_salida)+_nl+"La tarea ha finalizado!.") @eof_file ; //########################################################################################################
Creador de Tabla de trigonometría
; //######################################################################################################## // Para este ejemplo se escribió la función "roundn" que redondea un número decimal. La tabla generada es escrita en un archivo y luego se llama al programa asociado // para archivos ".txt" que es tipicamente el bloc de notas. alert_ex("Se creará una Tabla de trigonometría.", "Información", _mb_iconinformation) var cp_index=0, cp_index_max=90, cp_index_inc=1 var list="Ángulo Radianes Seno Coseno Tangente"+_nl+_nl for(var cp_index=0;cp_index<=cp_index_max;cp_index+=cp_index_inc){ var cp_rads = cp_index * _PI / 180; list+= roundn(cp_index,3)+_c9+ roundn(cp_rads,3)+_c9+roundn(sin(cp_rads),3)+_c9+roundn(cos(cp_rads),3)+_c9+roundn(tan(cp_rads),3)+_nl } binary_write("tabla.txt", list) openapp("tabla.txt") function roundn(rx_elnum, rx_lascif0){ var rx_lascif=parseint(rx_lascif0) if(rx_lascif<=0){return ron(rx_elnum)} if(rx_lascif>14){return rx_elnum} var rx_tmp10ec=(10 ** rx_lascif) // halla 10 elevado a rx_lascif return ron(rx_elnum*rx_tmp10ec)/rx_tmp10ec } @eof_file ; //########################################################################################################
Numerador de líneas en archivos de texto
; //######################################################################################################## // El siguiente programa intenta modificar tres archivos de texto, agregando una numeración a sus renglones. var arr_files=array("texto1.txt","texto2.txt","texto3.txt") for(var t=0;t<count(arr_files);t++){ var file1=arr_files[t] if(fileexists(file1)==false){ alert_ex("No se hallo el archivo " + file1, "Información", _mb_iconinformation); continue; } if(filesize(file1)>10000000){ alert("El archivo " + file1 + " tiene más de 10 millones de bytes y no será procesado por limitar la cantidad de memoria física utilizada.") continue; } var arr_lines=explode(_nl,binary_read(file1)); for(var t2=0;t2<count(arr_lines);t2++){ arr_lines[t2]=(t2+1) + "- " + arr_lines[t2] } if(-binary_write(file1, implode(_nl,arr_lines))){ alert_ex("No se logró escribir en el archivo " + file1+ _nl+ "Descripción del error: "+err_description(err_number()) , "Información", _mb_iconerror); } } alert_ex("Se ha terminado de procesar los archivos de texto: " + implode(",", arr_files), "Información", _mb_iconinformation) @eof_file ; //########################################################################################################
Encriptación simétrica bit a bit
; //######################################################################################################## /* El siguiente es un ejemplo avanzado de programa que los principiantes pueden omitir leer. Es muy utilizada la encriptación simétrica Byte a Byte utilizando la instrucción xor. En el siguiente ejemplo sencillo se trabaja a nivel de Bits, lo cual en general incrementa la seguridad de cualquier algoritmo de encriptación. (Un Byte se compone de ocho Bits, un Bit (Binary digit) sólo puede valer cero o uno). */ includec(engine\internal\simple_rsrc.asm) main() function main(){ if(alert_ex("A continuación se realizará un encriptación simétrica de un archivo"+_nl+"Se deberá especificar la contraseña, el archivo a cargar y el archivo a guardar"+_nl+"¿continuar?", "Información", _mb_iconinformation+_mb_yesno)!=_mbret_yes){ return } var pass=inputdlgx("Contraseña ?", "Dato necesario:","1234") var filename1 = opfopen(".","","todo archivo *.*"+chr(0)+"*.*"); if(len(filename1)==0){ return } var filename2 = opfsave(".","","todo archivo *.*"+chr(0)+"*.*"); if(len(filename2)==0){ return } if(-fileexists(filename1)){alert("No se hallo el archivo "+filename1);return} if(fileexists(filename2)){ if(alert_ex("El archivo " + filename2 + "Ya existe, ¿sobrescribirlo?", "Información", _mb_iconinformation+_mb_yesno)!=_mbret_yes){ return } } if(filesize(filename1)>10000000){alert("El archivo " + filename1 + " tiene más de 10 millones de bytes y no será procesado por su tamaño.");return} var cont=binary_read(filename1) if(len(cont)==0){ alert("El archivo " + filename1 + " está vacío.") return } var hash1=hashver(pass) // hashver devuelve un "hash", un entero largo único en función de una cadena. hash1=(hash1 ^ hashver(parsestr(hash1))) // Se efectúa el cálculo de un entero único en función de la contraseña usando el operador Xor para enteros largos. var bitstr=binstrpack(cont) // La función binstrpack convierte una cadena cualquiera en otra de ocho veces su tamaño cuyos bytes son ceros y unos // que representan los bits de la cadena original. _direct{ mov ebx, [hash1+reg.vo] ; Se carga el entero único determinado según la contraseña en "ebx". mov eax, [bitstr+reg.vo] ; El manejador de la cadena es un entero largo (índice) situado en el desplazamiento "reg.vo" que es 8. NWPOS_eax ; La macro NWPOS_eax carga en "esi" el puntero en memoria al inicio de la cadena. mov edx, [bitstr+reg.nu] ; Carga en edx la longitud de la cadena, que en este caso es múltipla de 8 y no cero. lea edi, [esi+edx-1] ; Carga en edi el puntero al último byte de la cadena. shr edx, 1 ; Se divide "edx" a la mitad. enc_sample1: mov ah, [esi] mov al, [edi] mov cl, bl ; Pone en bit bajo de "cl" un bit utilizado para encriptar. shr cl, 3 xor cl, bl xor al, cl ; Se encripta el bit más bajo en memoria (los otros bits son ignorados por la función "binstrunpack"). xor ah, cl test bl, bl ; Si es par el conteo de bits 1 en "bl", intercambiar los bits actual y el simétrico respecto al centro de la cadena. jp @f xchg al, ah @@: mov [esi], ah mov [edi], al mov cl, bl ; En estas instrucciones se realiza una tarea cuya importancia radica (para nuestro ejemplo sencillo de encriptación) xor cl, dl ; en modificar el registro ebx "rotándo sus bits" hacia la izquierda en función de la posición del bit a encriptar y el mismo registro. rol ebx, cl ; and cl, 31 ; Es una instrucción redundante porque no altera el comportamiento de "rol". inc ebx ; Se asegura un poco más el algoritmo incrementando el registro "ebx". inc esi dec edi dec edx jnz enc_sample1 } var cont2=binstrunpack(bitstr) // La función "binstrunpack" realiza la tarea inversa a "binstrpack", toma una cadena con bytes ceros y unos (aunque se admiten // todos pues sólo utiliza el bit de menos valor) de longitud múltipla de 8 y crea una cadena con bytes cuyos bits // valen lo que los bytes de la cadena original. if(-binary_write(filename2, cont2)){ alert_ex("No se logró escribir en el archivo " + filename2+ _nl+ "Descripción del error: "+err_description(err_number()) , "Información", _mb_iconerror); }else{ alert_ex("Se ha escrito correctamente el archivo procesado en " + filename2, "Información", _mb_iconinformation) } } @eof_file ; //########################################################################################################