// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

#ifndef DocFormats_DFMarkupCompatibility_h
#define DocFormats_DFMarkupCompatibility_h

#include "DFXMLNamespaces.h"
#include "DFXMLNames.h"
#include "DFNameMap.h"

////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                //
//                                      DFMarkupCompatibility                                     //
//                                                                                                //
////////////////////////////////////////////////////////////////////////////////////////////////////

typedef enum {
    MCActionDefault,
    MCActionIgnore,
    MCActionProcessContent,
    MCActionMustUnderstand,
} MCAction;

typedef struct DFMarkupCompatibility DFMarkupCompatibility;

DFMarkupCompatibility *DFMarkupCompatibilityNew(void);
void DFMarkupCompatibilityFree(DFMarkupCompatibility *mc);
void DFMarkupCompatibilityPush(DFMarkupCompatibility *mc, int nb_namespaces, const char **namespaces, DFNameMap *map);
void DFMarkupCompatibilityPop(DFMarkupCompatibility *mc);
MCAction DFMarkupCompatibilityLookup(DFMarkupCompatibility *mc, NamespaceID nsId, Tag tag, int isElement);
void DFMarkupCompatibilityProcessAttr(DFMarkupCompatibility *mc, Tag attr, const char *value, DFNameMap *map);

#endif
