1/************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28/* static char rot13_Id[]="@(#) StarCalc Rot13 AddIn (c) 1998-2000 Sun Microsystems, Inc."; */ 29 30#include <string.h> 31#include <stdio.h> 32 33#include <xlang.h> 34#include <addin.h> 35#include <rot13.hrc> 36 37/** 38 * the current language the Addin is using 39 */ 40static USHORT _nLanguage=LANGUAGE_ENGLISH; 41 42/** 43 * StarCalc calls this function to set a new current Language for the Addin 44 * 45 * @param *nLanguage 46 * 47 */ 48void CALLTYPE SetLanguage( USHORT* nLanguage ) 49{ 50 _nLanguage = GetNeutralLanguage( *nLanguage ); 51} 52 53 54/** 55 * Tell StarCalc how many new functions this Addin provides. 56 * 57 * @param *nCount - returns the number of functions which are exported to StarCalc 58 * 59 */ 60void CALLTYPE GetFunctionCount( USHORT *nCount ) 61{ 62 *nCount = 1; 63} 64 65/** 66 * Provides neccessary data for each new function to StarCalc 67 * 68 * @param *nNo Input: Function number between 0 and nCount - 1 69 * @param *pFuncName Output: Functionname which should be called in the AddIn-DLL 70 * @param *nParamCount Output: Number of Parameter. Must be greater than 0, because there's always a return-Value. Maximum is 16. 71 * @param *peType Output: Pointer to arrray with exactly 16 variables of typ Paramtype. nParamCount Entries are set to the type of the corresponding Parameters. 72 * @param *pInternalName Output: Functionname as seen by the Spreadsheet user 73 * 74 * @see #GetFunctionCount, #GetParameterDescription 75 * 76 */ 77void CALLTYPE GetFunctionData( USHORT * nNo, 78 char * pFuncName, 79 USHORT * nParamCount, 80 ParamType * peType, 81 char * pInternalName ) 82{ 83 84 switch( *nNo ) { 85 case 0: 86 /* the function name is the same in all languages */ 87 SO_StringCopy( pInternalName, "Rot13" ); 88 SO_StringCopy( pFuncName, "Rot13" ); 89 peType[0] = PTR_STRING; 90 peType[1] = PTR_STRING; 91 *nParamCount=2; 92 break; 93 default: 94 *nParamCount = 0; 95 *pFuncName = 0; 96 *pInternalName = 0; 97 break; 98 } 99} 100 101/** 102 * Provides descriptions for each new function to StarCalc 103 * which are shown is the autopilot 104 * 105 * @param *nNo Input Parameter, Function number between 0 and nCount - 1 106 * @param *nParam Parameter Number 107 * @param *pName Output: Name of the parameter 108 * @param *pDesc Output: Description of the parameter 109 * 110 * @see #GetFunctionCount, #GetParameterDescription 111 */ 112void CALLTYPE GetParameterDescription( USHORT* nNo, USHORT* nParam, 113char* pName, char* pDesc ) 114{ 115 *pName = 0; 116 *pDesc = 0; 117 118 119 switch ( *nNo ) { 120 case 0: 121 switch ( *nParam ) { 122 case 0: 123 SO_StringCopy(pDesc,getText(ROT13_DESC)); 124 break; 125 case 1: 126 SO_StringCopy(pName,getText(ROT13_PAR1_NAME)); 127 SO_StringCopy(pDesc,getText(ROT13_PAR1_DESC)); 128 } 129 } 130} 131 132/** 133 * ROT13 Algorithm, each alphabetical character of the text is rotated by 13 in the alphabet 134 * 135 * @param *ret 136 * @param *src 137 * 138 * ER: well, my personal favorite algorithm is 139 * main(_){while(_=~getchar())putchar(~_-1/(~(_|32)/13*2-11)*13);} 140 * but for clarification we do it somehow different here ;-) 141 */ 142void CALLTYPE Rot13(char *ret, char *src) 143{ 144 if ( ! ret ) return; 145 if ( ! src ) *ret='\0'; 146 147 for(;src && *src; src++ , ret++) { 148 *ret=*src; 149 if (*ret >= 'A' && *ret <= 'Z') { 150 if ( (*ret +=13) > 'Z' ) *ret-=26; 151 } else if (*ret >= 'a' && *ret < 'n') { 152 *ret +=13; 153 } else if (*ret >= 'n' && *ret <= 'z') { 154 *ret -=13; 155 } 156 } 157 *ret=*src; 158} 159