Contiki 2.6

petsciiconv.c

00001 /*
00002  * Copyright (c) 2002, Adam Dunkels.
00003  * All rights reserved. 
00004  *
00005  * Redistribution and use in source and binary forms, with or without 
00006  * modification, are permitted provided that the following conditions 
00007  * are met: 
00008  * 1. Redistributions of source code must retain the above copyright 
00009  *    notice, this list of conditions and the following disclaimer. 
00010  * 2. Redistributions in binary form must reproduce the above
00011  *    copyright notice, this list of conditions and the following
00012  *    disclaimer in the documentation and/or other materials provided
00013  *    with the distribution. 
00014  * 3. The name of the author may not be used to endorse or promote
00015  *    products derived from this software without specific prior
00016  *    written permission.  
00017  *
00018  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
00019  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00020  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
00022  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00023  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
00024  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
00026  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00027  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00028  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
00029  *
00030  * This file is part of the Contiki desktop environment for the C64.
00031  *
00032  * $Id: petsciiconv.c,v 1.2 2010/01/31 23:46:19 oliverschmidt Exp $
00033  *
00034  */
00035 
00036 /*
00037 static unsigned char petscii2ascii[128] = {
00038   0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
00039   0x14,0x09,0x0d,0x11,0x93,0x0a,0x0e,0x0f,
00040   0x10,0x0b,0x12,0x13,0x08,0x15,0x16,0x17,
00041   0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
00042   0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
00043   0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
00044   0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
00045   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
00046   0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
00047   0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
00048   0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
00049   0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x7e,0x5f,
00050   0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
00051   0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
00052   0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
00053   0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0x7e,0xdf
00054 };
00055 */
00056 
00057 static unsigned char ascii2petscii[128] = {
00058   0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
00059   0x14,0x09,0x0d,0x11,0x93,0x0a,0x0e,0x0f,
00060   0x10,0x0b,0x12,0x13,0x08,0x15,0x16,0x17,
00061   0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
00062   0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
00063   0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
00064   0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
00065   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
00066   0x40,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
00067   0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
00068   0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
00069   0xd8,0xd9,0xda,0x5b,0x5c,0x5d,0x5e,0x5f,
00070   0xc0,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
00071   0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
00072   0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
00073   0x58,0x59,0x5a,0xdb,0xdd,0xdd,0x5e,0xdf,
00074 };
00075 
00076 static unsigned int i;
00077 static unsigned char *ptr;
00078 
00079 /*-----------------------------------------------------------------------------------*/
00080 void
00081 petsciiconv_toascii(char *buf, unsigned int len)
00082 {
00083   static char c;
00084   
00085   ptr = buf;
00086   for(i = len; i > 0; --i) {
00087     c = *ptr;
00088     if(c == 0x0a) {
00089       c = 0x0d;
00090     } else if(c == 0x0d) {
00091       c = 0x0a;
00092     }
00093     if(c != 0x40) {
00094       switch (c & 0xe0) {
00095       case 0x40:                
00096       case 0x60:
00097         c ^= 0x20;
00098         break;
00099       case 0xc0:               
00100         c ^= 0x80;
00101         break;
00102       }
00103     }
00104     *ptr = c & 0x7f;
00105     ++ptr;
00106   }
00107 }
00108 /*-----------------------------------------------------------------------------------*/
00109 void
00110 petsciiconv_topetscii(char *buf, unsigned int len)
00111 {
00112   ptr = buf;
00113   for(i = len; i > 0; --i) {
00114     *ptr = ascii2petscii[*ptr & 0x7f];
00115     ++ptr;
00116   }
00117 }
00118 /*-----------------------------------------------------------------------------------*/